所以我在3D空间中有一个点,我在3D空间中有相机的位置和旋转。
所以基本上对象上有Vector3
。
相机Vector3
和Quaternion
。
我需要了解如何看待这一点。
我想告诉用户如何移动到那一点。 用户应该将摄像头向左还是向右或向后?
答案 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);
对所需的前向矢量执行相同操作,并从所需的电流中减去电流。检查标志告诉用户是向上还是向下看。
有一些可能的并发症。例如,根据相机四元数是否指定从世界空间到相机空间的变换,反之亦然,您可能需要否定计算出的相机标题。