在给定旋转后的法向量的情况下,找到平面的OpenGL旋转矩阵

rra*_*lvv 10 opengl rotation matrix plane

有没有办法获得将平面旋转到新方向的矩阵,给定其新的法向量

下图描绘了所描述的内容

在此输入图像描述

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和的矢量的交叉积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向量将是正常的包围两个平面的NN'RotationAngle前面提到的两者之间的最小角度.

因此,通过围绕旋转RotationAxisRotationAngle旧标准N的平面内旋转,向着最短路径上N'.

  • +1但你可以省略除法(| N |*| N |),因为法向量的长度为1. (2认同)