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

12

如何获取旋转平面的矩阵,使其朝向新的法线向量?

下图描述了问题:

enter image description here

1个回答

17

给定旧的常数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是前面提到的两者之间的最小角度。

因此,通过在RotationAxis周围以RotationAngle旋转,旧法线N会沿着平面被旋转,在最短路径上朝向N'


2
+1,但是你可以忽略除以(|N|*|N|),因为正常向量的长度为1。 - AD-530
@AD-530 如笔记所述 :) 但我现在已经编辑得更清晰了。法线不需要被归一化,它们只需要垂直于平面即可。 - Nobody moving away from SE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接