【问题标题】:3D Geometry: Transform One Pair of Points to be Aligned Parallel to Another3D 几何:将一对点转换为与另一个点平行对齐
【发布时间】:2008-10-31 13:53:33
【问题描述】:

我有一条线(实际上是一个立方体)从 (x1,y1,z1) 到 (x2,y2,z2)。我想旋转它,使其沿着从(x3,y3,z3)到(x4,y4,z4)的另一条线对齐。目前我正在使用Math::Atan2Matrix::RotateYawPitchRoll。有更好的方法吗?

编辑:我认为我对这篇文章的措辞非常糟糕。我实际上在寻找的是来自两个向量的旋转矩阵。

【问题讨论】:

    标签: 3d geometry transform direct3d


    【解决方案1】:

    是的,您可以做到这一点,根本不需要考虑角度。

    因为你有一个立方体,假设你选择一个角,然后定义从它向外辐射的 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)。

    如果您想知道为什么会这样,请考虑坐标系基向量:如果您想将 X Y 和 Z 轴旋转到新的坐标系,那么旋转矩阵的列就是您想要的向量(1 0 0)', (0 1 0)' & (0 0 1)' 被映射到。 T*Inverse(F) 有效地将立方体从其原始方向旋转到轴对齐,然后再旋转到所需的方向。

    (抱歉,上面是左侧的列向量和变换,OpenGL 风格。我好像记得 Direct3D 是右侧的行向量和变换,但如何切换应该很明显)。

    它也同样适用于带有翻译组件的 4x4 矩阵。

    【讨论】:

    • 其实也不是立方体。钢 I 型截面。但这应该会有所帮助。谢谢。
    • 好的。关键是你需要定义一个局部坐标系......如果你只有线条,旋转是不明确的。
    • 谢谢,蒂姆。我不明白为什么这不适用于线路。
    【解决方案2】:

    您可能想要添加实际插值矩阵的方法。源矩阵和目标矩阵在您的答案中很好,但计算逆矩阵是没有意义的。四元数将为您提供最短的旋转路径,因此在两个矩阵上取旋转 3x3 矩阵,转换为四元数并调整它们。为翻译和重组做一个单独的 lerp。 Google for quaternion - 矩阵和反向转换以及四元数 lerp。

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

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 2018-02-17
      • 2021-10-28
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多