3D 中两条法线之间的有符号旋转

Signed Rotation between two normals in 3D

给定一个平面(在我的例子中是一个三角形)法线 N_T 和一个参考法线 N_R,两者的长度都是 1.

我计算了 rotation_normal

N = N_T x N_R

现在我需要计算这个 rotation_normal 周围的角度,这是我通过以下计算得到的:

angle = acos(<N_T, N_R>), with <x,y> is the dotproduct of x and y

这个角度在[0°, 180°]区间内,是两条法线之间的最小角度。 所以我的问题是,如果我想以其法线等于参考法线的方式旋转我的三角形,我需要知道计算出的角度在哪个方向(正或负)。

有谁知道如何获得这个方向或如何解决这个问题?

您需要使用 atan2(四象限反正切)

  1. 创建参考平面基向量u,v

    • 必须互相垂直并且在平面内
    • 最好是单位向量(否则你需要考虑它的大小)
    • 所以让N=N_T x N_R; ...旋转将发生的参考平面法线
    • U=N_T;
    • V= N x U; ... x表示叉积
    • 如果它们还没有
    • ,请将它们设为U/=|U|; V/=|V|;
  2. 计算N_R

    的平面坐标
    • u=(N_R.U); ... . 表示点积
    • v=(N_R.V);
  3. 计算角度

    • ang=atan2(v,u);
    • 如果您没有 atan2 则使用 ang=atanxy(u,v);
    • 这将为您提供 ang=<0,2*M_PI>
    • 范围内的角度
    • 如果你想要有符号的角度而不是添加
    • if (ang>M_PI) ang-=2.0*M_PI; ... M_PI 是众所周知的常量 Pi=3.1415...
    • 现在,如果你想要相反的符号方向,那么只需使用 -ang