三维几何:将一对点转换为与另一对点平行对齐
题
我有一条线(实际上是一个立方体)从(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 *反向(F)是从第一个立方体的方向旋转到第二个立方体的方向的矩阵(因为反F映射例如f0到(1 0 0)',然后是T map(1 0 0)'到t0)。
如果你想知道它的工作原理,请考虑坐标系基础向量:如果你想将XY和Z轴旋转到一个新的坐标系,那么旋转矩阵的列就是你想要的向量(1 0 0)',(0 1 0)'& (0 0 1)'要映射到。 T *反向(F)有效地将您的立方体从其原始方向旋转到轴对齐,然后旋转到所需的方向。
(对不起,上面是左侧的列向量和变换,OpenGL样式。我似乎记得Direct3D是行向量并在右侧进行变换,但是如何切换它应该是显而易见的。)
它同样适用于带有翻译组件的4x4矩阵。
其他提示
您可能想要添加如何实际插值矩阵。源答案和目标矩阵在你的答案中都很好,但计算逆矩阵毫无意义。四元数将为您提供最短的旋转路径,因此在两个矩阵上采用旋转3x3矩阵,转换为四元数并将其缩小。为翻译做一个单独的lerp并重新组合。谷歌的四元数 - 矩阵和反向转换和四元数lerp。
编辑:来自前向和向上矢量的旋转矩阵是微不足道的。缺失的列是其他两个向量的叉积。 (别忘了规范化列)。