我有一条从 (x1,y1,z1) 到 (x2,y2,z2) 的线(实际上是一个立方体)。我想旋转它,使其沿着从(x3,y3,z3)到(x4,y4,z4)的另一条线对齐。目前我正在Math::Atan2
与Matrix::RotateYawPitchRoll
. 有没有更好的方法来做到这一点?
编辑:我认为我对这篇文章的措辞非常糟糕。我实际上正在寻找的是来自两个向量的旋转矩阵。
是的,你可以做到这一点,根本不需要考虑角度。
由于您有一个立方体,假设您选择一个角,然后将从它向外辐射的 3 个边定义为向量 f0、f1、f2(这些是方向向量,相对于您选择的角)。将它们归一化并将它们写为矩阵 F 中的列
(f0x f1x f2x)
(f0y f1y f2y)
(f0z f1z f2z)
现在对要旋转到的立方体的向量 t0、t1、t2 执行相同的操作,并将其称为矩阵 T。
现在矩阵 R = T * Inverse(F) 是从第一个立方体的方向旋转到第二个立方体的方向的矩阵(因为逆 F 映射例如 f0 到 (1 0 0)',然后 T 映射 (1 0 0)' 到 t0)。
如果您想知道为什么会这样,请考虑坐标系基向量:如果您想将 XY 和 Z 轴旋转到新的坐标系,那么旋转矩阵的列就是您想要的向量 (1 0 0)', (0 1 0)' & (0 0 1)' 被映射到。T*Inverse(F) 有效地将立方体从其原始方向旋转到轴对齐,然后再旋转到所需的方向。
(抱歉,上面是左侧的列向量和变换,OpenGL 风格。我似乎记得 Direct3D 是右侧的行向量和变换,但应该很明显如何切换它)。
它也同样适用于带有翻译组件的 4x4 矩阵。
您可能想要添加如何实际插值矩阵。源矩阵和目标矩阵在您的答案中很好,但计算逆矩阵是没有意义的。四元数将为您提供最短的旋转路径,因此在两个矩阵上取旋转 3x3 矩阵,转换为四元数并调整它们。为翻译和重组做一个单独的 lerp。Google for quaternion - 矩阵和反向转换以及四元数 lerp。
编辑:来自前向和向上向量的旋转矩阵是微不足道的。缺失的列是其他两个向量的叉积。(不要忘记规范化列)。