2017-03-04 97 views
1

所以我在3D空间中有一点,并且我在3D空间中定位和旋转了相机。Point look at Point

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

我需要得到如何看待这一点。

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

+0

如果您要引导用户,则答案取决于用户界面。它是一个标准的FPS风格的相机,用户可以通过鼠标x轴和y轴进行俯仰而不旋转吗? – samgak

+0

它不能旋转,是的,它是标准的FPS风格 –

回答

1

这样做的一种方法是计算相机当前面向的偏航角度(如罗盘标题)的方向,并计算出需要面对的方向以查看点。

从另一个中减去一个,并调整结果使其在-180到180度范围内(或pi到pi弧度),然后根据标志告诉用户左转或右转。如果绝对值超过120度(或某个可配置的值),那么告诉他们它在它们后面。

要找到相机的当前标题,请用四元数转换矢量(0,0,1)以获取正向矢量,然后使用atan2(forward.z, forward.x)计算标题。

要计算一下点,从点减去当前的相机位置以获得所需的正向矢量,然后传递给反正切所需的标题:

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; 

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

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

执行:

如果你想这样做的查找上/下,你可以通过先计算向前向量的长度在XZ平面,然后用ATAN2重新计算的俯仰角对于期望的正向矢量相同并从期望中减去电流。检查标志以告知用户是查看还是查看。

有一些可能的并发症。例如,取决于相机四元数是指定从世界空间到相机空间的变换还是相反,您可能需要取消计算的相机标题。

+0

非常感谢你的出色答案! 我一直在想,我正在实施类似的东西。 现在这对我来说很清楚。 :) –