我有一条线(实际上是一个立方体)从(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。

编辑:来自前向和向上矢量的旋转矩阵是微不足道的。缺失的列是其他两个向量的叉积。 (别忘了规范化列)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top