gpt4 book ai didi

math - 平面的 3D 旋转

转载 作者:行者123 更新时间:2023-12-04 05:20:25 25 4
gpt4 key购买 nike

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

想知道是否有人对如何做到这一点有一个好主意。谢谢

最佳答案

如果您有或可以轻松计算您的点当前所在平面的法线向量,我认为最简单的方法是围绕两个平面的公共(public)轴旋转。以下是我的做法:

  • M是当前平面的法线向量,N是要旋转到的平面的法线向量。如果 M == N您现在可以停止并保持原点不变。
  • 计算旋转角度为
    costheta = dot(M,N)/(norm(M)*norm(N))
  • 计算旋转轴为
    axis = unitcross(M, N)

    在哪里 unitcross是一个执行叉积并将其归一化为单位向量的函数,即 unitcross(a, b) = cross(a, b) / norm(cross(a, b)) .如user1318499在评论中指出,如果 M == N,此步骤可能会导致错误, 除非您执行 unitcross返回 (0,0,0)a == b .
  • 从轴和角度计算旋转矩阵为
    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 ])

    在哪里 x , y , 和 zaxis 的组成部分.此公式描述为 on Wikipedia .
  • 对于每个点,计算其在新平面上的对应点为
    newpoint = dot(rmat, point)

    其中函数dot执行矩阵乘法。

  • 当然,这不是唯一的。正如彼得克的回答中提到的那样,您可以进行无数次可能的旋转,这会将平面法线转换为 M进入垂直于 N 的平面.这对应的事实是,在您执行上述步骤之后,您可以围绕 N 旋转平面。 ,并且您的积分将在同一平面上的不同位置。 (换句话说,您可以进行的满足您的条件的每次旋转都对应于执行上述过程,然后围绕 N 进行另一次旋转。)但是,如果您不在乎您的点在平面上的哪个位置结束,我认为这是围绕公共(public)轴旋转是将点放入您想要的平面的最简单方法。

    如果您没有 M ,但是您确实有起始平面中点相对于该平面原点的坐标,您可以从两个点的位置 x1 计算起始法线向量和 x2作为
    M = cross(x1, x2)

    (您也可以在这里使用 unitcross,但没有任何区别)。如果您有相对于不在平面内的原点的点坐标,您仍然可以这样做,但您需要三个点的位置:
    M = cross(x3-x1, x3-x2)

    关于math - 平面的 3D 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9423621/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com