给定新的法向量,有没有办法获得将平面旋转到新方向的矩阵
下图描述了所描述的内容
鉴于旧法线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'
。