Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 点看点_Algorithm_Vector_3d_Quaternions_Google Project Tango - Fatal编程技术网

Algorithm 点看点

Algorithm 点看点,algorithm,vector,3d,quaternions,google-project-tango,Algorithm,Vector,3d,Quaternions,Google Project Tango,所以我在三维空间中有一个点,我有摄像机在三维空间中的位置和旋转 所以基本上物体上有向量3。 摄影机Vector3和Quaternion 我需要知道如何看待这一点 我想告诉用户如何移动到那个点。 用户应该将摄像机指向左侧、右侧还是后方 一种方法是计算相机当前面对的方向作为偏航角(如指南针航向),并计算它需要面对的方向,以便观察该点 从另一个中减去一个,调整结果,使其在-180到180度(或-pi到pi弧度)的范围内,然后告诉用户根据符号向左或向右转弯。如果绝对值大于120度(或某些可配置值),则告

所以我在三维空间中有一个点,我有摄像机在三维空间中的位置和旋转

所以基本上物体上有向量3。 摄影机
Vector3
Quaternion

我需要知道如何看待这一点

我想告诉用户如何移动到那个点。
用户应该将摄像机指向左侧、右侧还是后方

一种方法是计算相机当前面对的方向作为偏航角(如指南针航向),并计算它需要面对的方向,以便观察该点

从另一个中减去一个,调整结果,使其在-180到180度(或-pi到pi弧度)的范围内,然后告诉用户根据符号向左或向右转弯。如果绝对值大于120度(或某些可配置值),则告诉他们绝对值在后面

要查找相机的当前航向,请通过四元数变换矢量(0,0,1)以获得正向矢量,然后使用
atan2(forward.z,forward.x)
计算航向

要计算观察该点所需的航向,请从该点减去当前相机位置以获得所需的前向矢量,然后传递到atan:

Vector3 desired_forward = point - camera_pos;
float desired_heading = atan2(desired_forward.z, desired_forward.x);
然后找到所需的旋转:

float rotation_needed = desired_heading - heading;
if(rotation_needed > Math.PI)
    rotation_needed -= 2 * Math.PI;
if(rotation_needed < -Math.PI)
    rotation_needed += 2 * Math.PI;
对所需正向矢量执行相同操作,并从所需正向矢量中减去电流。检查标志,告诉用户是向上看还是向下看


有一些可能的并发症。例如,根据相机四元数是指定从世界空间到相机空间的变换,还是指定从世界空间到相机空间的变换,您可能需要对计算出的相机航向求反。

如果要引导用户,则答案取决于用户界面。这是一个标准的FPS风格的相机,用户可以用鼠标x轴偏航,用鼠标y轴俯仰,但不能旋转?它不能旋转,是的,这是标准的FPS风格非常感谢您的出色回答!整晚我都在想,我打算实施类似的东西。现在我明白了。:)
float xzLength = sqrt(forward.x * forward.x + forward.z * forward.z);
float pitch_angle = atan2(forward.y, xzLength);