点看点

Point look at Point

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

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

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

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

一种方法是计算相机当前面向的方向作为偏航角(如罗盘航向),并计算它需要面向的方向才能注视该点。

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

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

如果想做lookup/down,可以先计算XZ平面前向矢量的长度,再用atan2计算一个俯仰角:

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

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

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