有没有办法获得将平面旋转到新方向的矩阵,给定它的新法向量
下图描述了所描述的内容
最佳答案
鉴于旧常态 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'
.
关于opengl - 给定旋转后的法向量,求平面的 OpenGL 旋转矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13199126/