我有两个 4x4 的均匀变换框架,A 和 T。
A 随时间移动,T 静止。我正在尝试创建一个旋转 T 的函数,使其始终注视 A 但不移动其位置。类似于 OpenGL 和 Unity 中的 LookAt 函数
如果 A 从点 [0,0,0] 移动到 [1,2,-1],我如何生成一个旋转矩阵,当与 T 相乘时,新帧 T 旋转到面对 A.
我的尝试(有更好方法的可以无视)
我尝试两次计算 A 在 T 之间的位置(不是方向)之间的距离,第一次是当 A 仍然在原点时,然后是当 A 移动时,(这个位置是 B)。
然后我将这两个距离向量的叉积得到一个垂直于这两个向量的向量,它将作为旋转轴。
然后我使用余弦法则找到绕所述轴旋转的角度。使用 AB、TB、TA 的长度的边(其中 B 是 A 移动到的位置)。
最后我用了rodrigues rotation plugging 轴和角度的公式。结果在某种程度上是正确的,但它仅适用于由于某种原因在 X 和 Z 轴方向上移动 A 时。
MATLAB代码:
TA = (T.POSITION - A.POSITION); % Vectors
TB = (T.POSITION - B.POSITION);
AB = (A.POSITION - B.POSITION);
RotationAngle = acos( (TA^2 + TB^2 - AB^2)/(2*TA*TB))
RotationAxis = cross(TA,TB)
RotationAxis_Normalized = RotationAxis/norm(RotationAxis);
AxisTemp = VecToso3(RotationAxis_Normalized);
RotMat= eye(3,3) + (sin(RotationAngle)*AxisTemp) + ((1-cos(RotationAngle))*(AxisTemp^2)); % Rodrigues rotation
updated_target_config = T.TRANSFORM * CreateTransform(RotMat); % Multiply T by the rotation matrix so it looks at B
有更好的方法吗?