点看点

时间:2017-03-04 04:45:40

标签: algorithm vector 3d quaternions google-project-tango

所以我在3D空间中有一个点,我在3D空间中有相机的位置和旋转。

所以基本上对象上有Vector3。 相机Vector3Quaternion

我需要了解如何看待这一点。

我想告诉用户如何移动到那一点。 用户应该将摄像头向左还是向右或向后?

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是计算相机当前面向的方向作为偏航角(如指南针方向),并计算需要面对的方向以便查看该点。

从另一个中减去一个并调整结果,使其在-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;

现在告诉用户根据所需的旋转符号向左或向右旋转。

如果你想要向上/向下查看,可以先计算XZ平面中前向矢量的长度然后再使用atan2来计算俯仰角:

float xzLength = sqrt(forward.x * forward.x + forward.z * forward.z);
float pitch_angle = atan2(forward.y, xzLength);

对所需的前向矢量执行相同操作,并从所需的电流中减去电流。检查标志告诉用户是向上还是向下看。

有一些可能的并发症。例如,根据相机四元数是否指定从世界空间到相机空间的变换,反之亦然,您可能需要否定计算出的相机标题。