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(四象限反正切)
创建参考平面基向量u,v
- 必须互相垂直并且在平面内
- 最好是单位向量(否则你需要考虑它的大小)
- 所以让
N=N_T x N_R;
...旋转将发生的参考平面法线
U=N_T;
V= N x U;
... x
表示叉积
- 如果它们还没有
,请将它们设为U/=|U|; V/=|V|;
计算N_R
的平面坐标
u=(N_R.U);
... .
表示点积
v=(N_R.V);
计算角度
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
给定一个平面(在我的例子中是一个三角形)法线 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(四象限反正切)
创建参考平面基向量
u,v
- 必须互相垂直并且在平面内
- 最好是单位向量(否则你需要考虑它的大小)
- 所以让
N=N_T x N_R;
...旋转将发生的参考平面法线 U=N_T;
V= N x U;
...x
表示叉积- 如果它们还没有 ,请将它们设为
U/=|U|; V/=|V|;
计算
的平面坐标N_R
u=(N_R.U);
....
表示点积v=(N_R.V);
计算角度
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