11

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

下图描述了所描述的内容

在此处输入图像描述

4

1 回答 1

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向量将是包含两者的平面的法线,N并且N'RotationAngle前面提到的两者之间的最小角度。

因此,通过RotationAxisRotationAngle法线N的旋转,在平面内以最短的路径旋转N'

于 2012-11-02T16:25:03.817 回答