如何获取旋转平面的矩阵,使其朝向新的法线向量?
下图描述了问题:
给定旧的常数N
和新的常数N'
,您可以通过以下方式获得旋转:
RotationAxis = cross(N, N')
RotationAngle = arccos(dot(N, N') / (|N| * |N'|))
在哪里?
cross(x, y)
是向量x
和y
的叉积dot(x, y)
是向量x
和y
的点积|x|
是向量x
的长度这将使旧法线以最短的方式旋转到新法线上。
注释
RotationAngle
将以弧度表示(如果arccos返回弧度,就像大多数实现一样)arccos
是余弦函数的反函数。它是必要的,因为dot(N,N') = |N| * |N'| * cos(RotationAngle)
其中RotationAngle
是向量之间的角度。RotationAxis
未归一化(|N| * |N'|)
变得不必要(事实上,如果N
已经被归一化,就可以在乘积中省去|N|
,如果N'
被标准化,则省略|N'|
)N' = -N
,则此方法将失败(因为有无限多个最短路径)它是如何工作的?
首先可以观察到,两个法线将始终定义出至少一个包含它们的平面。将它们分开的最小角度也将在该平面内测量。
所以RotationAxis
向量将是包围N
和N'
的平面的法线,而RotationAngle
是前面提到的两者之间的最小角度。
因此,通过在RotationAxis
周围以RotationAngle
旋转,旧法线N
会沿着平面被旋转,在最短路径上朝向N'
。