飞机的3D旋转

时间:2012-02-24 00:27:57

标签: math 3d geometry rotation plane

我做了一些事情,我在coord sys A中有一架飞机,上面有一组点。我在空间N中也有一个法向量。如何旋转坐标系A上的点,使底层平面与N具有相同的法线方向?

想知道是否有人知道如何做到这一点。感谢

3 个答案:

答案 0 :(得分:16)

如果您拥有或可以轻松计算出您的点当前所在平面的法向量,我认为最简单的方法是围绕两个平面共有的轴旋转。我就是这样做的:

  1. M成为与当前平面垂直的向量,N是与要旋转的平面垂直的向量。如果M == N你可以立即停止并保持原始点不变。
  2. 将旋转角度计算为

    costheta = dot(M,N)/(norm(M)*norm(N))
    
  3. 将旋转轴计算为

    axis = unitcross(M, N)
    

    其中unitcross是执行叉积并将其规范化为单位向量的函数,即unitcross(a, b) = cross(a, b) / norm(cross(a, b))。正如user1318499在评论中指出的那样,如果M == N,此步骤可能会导致错误,除非unitcross的{​​{1}}的实施在(0,0,0)时返回a == b

  4. 从轴和角度计算旋转矩阵

    c = costheta
    s = sqrt(1-c*c)
    C = 1-c
    rmat = matrix([ x*x*C+c    x*y*C-z*s  x*z*C+y*s ],
                  [ y*x*C+z*s  y*y*C+c    y*z*C-x*s ]
                  [ z*x*C-y*s  z*y*C+x*s  z*z*C+c   ])
    

    其中xyzaxis的组成部分。该公式描述为on Wikipedia

  5. 对于每个点,将新平面上的对应点计算为

    newpoint = dot(rmat, point)
    

    函数dot执行矩阵乘法。

  6. 当然,这不是唯一的;正如peterk的回答中所提到的,你可以进行无数次可能的旋转,将平面法线变换为M到法线平面N。这相当于以下事实:在您执行上述步骤后,您可以围绕N旋转平面,并且您的点将位于不同的位置,同时保持在同一平面中。 (换句话说,你可以做出的满足你条件的每一次旋转都对应于上面描述的程序,然后围绕N进行另一次旋转。)但如果你不关心你的点在飞机上的哪个地方,我认为绕公共轴旋转是最简单的方法,只需将点放入你想要的平面即可。


    如果您没有M,但确实有起始平面中相对于该平面中原点的点的坐标,则可以计算起始法线向量从两个点的位置x1x2作为

    M = cross(x1, x2)
    

    (你也可以在这里使用unitcross,但它没有任何区别)。如果你的点的坐标相对于不在平面内的原点,你仍然可以做到,但你需要三个点的位置:

    M = cross(x3-x1, x3-x2)
    

答案 1 :(得分:1)

单个向量(您的法线 - N)是不够的。另外两个维度需要另外两个向量。 (想象一下,你的3D空间仍然可以围绕法线向量旋转/旋转,你需要另外2个向量来固定它)。一旦你在飞机上有正常和另一个,第三个应该很容易找到(左手或右手,取决于你的系统)。

确保所有三个都归一化(长度为1)并将它们放在矩阵中;使用该矩阵转换3D空间中的任何点(使用矩阵乘法)。这应该给你新的坐标。

答案 2 :(得分:0)

我正在考虑制作一个单位矢量[0,0,1]并沿两个平面使用点积来找到差异的角度,并将所有点移动到这些角度。这假设您希望z轴与法线向量对齐,否则分别对x和y使用[1,0,0]或[0,1,0]。