所以我在3D空间中有一点,并且我在3D空间中定位和旋转了相机。Point look at Point
所以对象上基本上有Vector3
。 相机Vector3
和Quaternion
。
我需要得到如何看待这一点。
我想告诉用户如何移动到那一点。 用户应该将相机向左还是向右还是向后?
所以我在3D空间中有一点,并且我在3D空间中定位和旋转了相机。Point look at Point
所以对象上基本上有Vector3
。 相机Vector3
和Quaternion
。
我需要得到如何看待这一点。
我想告诉用户如何移动到那一点。 用户应该将相机向左还是向右还是向后?
这样做的一种方法是计算相机当前面向的偏航角度(如罗盘标题)的方向,并计算出需要面对的方向以查看点。
从另一个中减去一个,并调整结果使其在-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重新计算的俯仰角对于期望的正向矢量相同并从期望中减去电流。检查标志以告知用户是查看还是查看。
有一些可能的并发症。例如,取决于相机四元数是指定从世界空间到相机空间的变换还是相反,您可能需要取消计算的相机标题。
非常感谢你的出色答案! 我一直在想,我正在实施类似的东西。 现在这对我来说很清楚。 :) –
如果您要引导用户,则答案取决于用户界面。它是一个标准的FPS风格的相机,用户可以通过鼠标x轴和y轴进行俯仰而不旋转吗? – samgak
它不能旋转,是的,它是标准的FPS风格 –