本文主要包括:

  1. Euler 变换
  2. 从 Euler 变换中导出参数
  3. 矩阵分解
  4. 关于任意轴旋转




FReLu替换yolo euler替换_FReLu替换yolo


图 1: 插图形象地描述了 Euler变换,它由 head,pitch 和 roll 构成方位。缺省视图下,观察方向沿着 z 轴负方向,头部绕 y 轴。

本文介绍一些实时渲染用到的矩阵变换和运算。首先,我们介绍Euler变换 (以及它的参数提取),它可以非常直观地描述方位。接着,我们介绍如何从一个矩阵提取一系列的基本变换。最后,我们导出围绕任意轴旋转实体的方法。

1.Euler 变换

Euler变换是一个非常直观的构造描述方位矩阵的方法 (可以用它来实现相机)。它的名字来自伟大的科学家 Euler。

首先,我们建立一个缺省的视图。大多数情况下,我们使用图 2这样的视图作为缺省视图。 Euler变换是由三个旋转矩阵构成的,它们的名字已经在图 2中给出。下面给出它的更正规的定义,我们使用 E 来表示 Euler变换,它由公式 1给出。


FReLu替换yolo euler替换_FReLu替换yolo_02


因为 E 是由旋转构成的,所以显然它是正交的。正交矩阵的逆就是它本身的转置,所以

,通常,我们直接使用转置运算来求 E 的逆。

Euler角 h,p 和 r 表示旋转的顺序以及旋转的程度。 Euler变换非常直观,在和外行人讨论时使用它,很容易被人理解。比如,改变 head 角度就是让观察者转动他的头说”no”,改变 pitch 角度,就是让他点头, roll 则使他的头向一边倾斜。相比于,使用绕 x,y,z 轴旋转,使用这种方式显然更加直观。 Euler变换不仅可以使用在相机上,还可以使用在其它物体上。它可以使用在世界坐标系或相对于一个局部的参照物来使用。

使用 Euler变换,可能会导致万向节锁。当进行旋转操作造成一个维度消失时就会出现。比如,我们进行变换的顺序是 x/y/z。考虑第二次旋转时围绕 y 轴旋转 π/2。执行后, z 轴现在在原来 x 轴的位置,第三次围绕 z 轴的变换变的多余。


FReLu替换yolo euler替换_矩阵分解_03


尽管 Euler角对于小范围的角度改变很有用,但它还是有一些严重的限制。比如,我们很难将两个不同的 Euler角进行组合使用。两个不同的Euler角可能定义相同的方位,对它们两者进行插值不应该产生任何旋转。这也是使用其它替代方式,比如四元数来表示方位的原因。

2.从 Euler 变换中导出参数

有时,我们需要从一个正交矩阵中导出 Euler参数 h,p 和 r。导出的方法由公式 3给出。


FReLu替换yolo euler替换_FReLu替换yolo_04


我们把三个矩阵连乘后的结果放入相应项目中得到公式 4。


FReLu替换yolo euler替换_旋转矩阵_05


显然我们可以从 sinp =

得到 pitch 参数。同样,通过

除以

除以

可以得到 head 和 roll 参数。

FReLu替换yolo euler替换_旋转矩阵_06


至此,我们就从矩阵 F 中到导出了 Euler参数 h(head),p(pitch) 和r(roll),公式 6给出了这一过程。


FReLu替换yolo euler替换_矩阵变换_07


实际上,还有一个地方我们需要处理。当 cosp = 0 时,

=

= 0,atan2 函数就不能使用了,但是 cosp = 0 意味着 sinp = ±1,所以此时F可以简化为:

FReLu替换yolo euler替换_双边z变换公式_08


现在我们设置 h = 0,那么可以得到 sinr/cosr = tan =

/

,从而得到 r = atan2(

,

)。

3.矩阵分解

到现在为止,我们知道我们使用的矩阵是如何经过变换产生的,但这种情况在实际工作中并不普遍,有时,我们需要从一个矩阵获取不同的变换信息,这时就需要进行 矩阵分解。

有许多情况需要我们这样做,包括:

  • 导出对象的缩放系数。
  • 为一个特别的系统提供变换。比如 VRML 使用 Transform节点进行变换,不能使用 4x4 矩阵。
  • 确定一个模型是否只经过了刚体变换。
  • 需要对关键帧进行插值,但只有对象的矩阵可以使用。
  • 移除旋转矩阵中的错切。

4.关于任意轴旋转

可以绕任意轴旋转实体有时是非常便利的。现在假设旋转轴 r 是规范化的,我们需要旋转的角度是 α。

首先我们找到和 r 互相垂直的另外两个单位长度的轴。它们三者组成了一个坐标基。

第一步,我们需要计算坐标基。我们已经有了一个轴 r,也就是我们需要围绕旋转的轴。接着,我们需要找 s 和 t。显然 t = r × s。一个数值稳定的方法是找 r 的绝对值最小的分量,然后将这个分量设置为 0,交换另外两个分量的位置,最后将这两个分量交换位置后的第一个取相反数。整个过程的数学表示如公式 8。


FReLu替换yolo euler替换_双边z变换公式_09

图 2: 首先找到由 r, s 和 t 构成的正交基,然后通过变换将这个正交基和标准基对齐,使 r 和 x 轴对齐,之后绕 x 轴旋转,最后再变换回去。

FReLu替换yolo euler替换_矩阵分解_10


这保证 s¯ 和 r 正交 (垂直), (r, s, t) 构成了一个正交基。我们使用三个向量构成一个矩阵 M,如公式 9。


FReLu替换yolo euler替换_旋转矩阵_11


这个矩阵将向量 r 变换到 x 轴, s 变换到 y 轴, t 变换到 z 轴。最后关于规范化向量 r 旋转 α 弧度的变换如公式 10所示。


FReLu替换yolo euler替换_矩阵变换_12


也就是说,首先我们把 r 变换到 x 轴 (使用 M),然后绕 x 轴旋转 α弧度 (使用 Rx(α)),最后我们使用 M 的逆矩阵变换回去,由于 M 是正交的,所以

就是它的逆。

另一个绕任意轴旋转的方法,由 Gloadman 提出。这里,我们直接给出它的变换,如公式 11。


FReLu替换yolo euler替换_矩阵分解_13