有没有办法获得将平面旋转到新方向的矩阵,给定其新的法向量
下图描绘了所描述的内容
答案 0 :(得分:18)
鉴于旧法线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
是前面提到的两个之间的最小角度。 / p>
因此,通过RotationAxis
RotationAngle
左右旋转,旧法线N
在飞机内部旋转,朝着N'
的最短路径旋转。