给定新的法向量,有没有办法获得将平面旋转到新方向的矩阵
下图描述了所描述的内容

鉴于旧法线N和新法线N',您可以通过以下方式获得旋转:
RotationAxis = cross(N, N')
RotationAngle = arccos(dot(N, N') / (|N| * |N'|))
在哪里
cross(x, y)是向量的叉积x和ydot(x, y)是向量的点积x和y|x|是向量的长度x这将以尽可能短的方式将旧法线旋转到新法线上。
笔记
RotationAngle将以弧度表示(如果 arccos 像在大多数实现中那样返回弧度)arccos是余弦函数的倒数。这是必要的,因为向量之间的角度在dot(N, N') = |N| * |N'| * cos(RotationAngle)哪里。RotationAngleRotationAxis未标准化(|N| * |N'|)变得不必要(实际上,如果N归一化,您可以忽略|N|产品,如果N'归一化则忽略|N'|)N' = -N(因为有无限多的最短路径),此方法将失败它是如何工作的?
第一个观察结果是两个法线将始终定义(至少)一个平面,两者都位于其中。将它们分开的最小角度也将在该平面内测量。
所以RotationAxis向量将是包含两者的平面的法线,N并且N'是RotationAngle前面提到的两者之间的最小角度。
因此,通过RotationAxis旧RotationAngle法线N的旋转,在平面内以最短的路径旋转N'。