如何在 MATLAB 中实现“查看”功能

问题描述 投票:0回答:0

我有两个 4x4 的均匀变换框架,A 和 T。

A 随时间移动,T 静止。我正在尝试创建一个旋转 T 的函数,使其始终注视 A 但不移动其位置。类似于 OpenGL 和 Unity 中的 LookAt 函数

如果 A 从点 [0,0,0] 移动到 [1,2,-1],我如何生成一个旋转矩阵,当与 T 相乘时,新帧 T 旋转到面对 A.

Problem Visualised

我的尝试(有更好方法的可以无视)

我尝试两次计算 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

有更好的方法吗?

matlab vector rotation position
© www.soinside.com 2019 - 2024. All rights reserved.