Nob*_*ody 18
给定旧法线N和新法线,N'您可以通过以下方式获得旋转:
RotationAxis = cross(N, N')
RotationAngle = arccos(dot(N, N') / (|N| * |N'|))
Run Code Online (Sandbox Code Playgroud)
哪里
cross(x, y)是矢量x和的矢量的交叉积ydot(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'.
| 归档时间: |
|
| 查看次数: |
6381 次 |
| 最近记录: |