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

时间:2012-11-02 16:15:55

标签: opengl matrix rotation plane

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

下图描绘了所描述的内容

enter image description here

1 个答案:

答案 0 :(得分:18)

鉴于旧法线N和新法线N',您可以通过以下方式获得轮换:

RotationAxis = cross(N, N')
RotationAngle = arccos(dot(N, N') / (|N| * |N'|))

其中

  • cross(x, y)是向量xy
  • 的叉积
  • dot(x, y)是向量xy
  • 的点积
  • |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是前面提到的两个之间的最小角度。 / p>

因此,通过RotationAxis RotationAngle左右旋转,旧法线N在飞机内部旋转,朝着N'的最短路径旋转。