Category:Higher Mathematics & Computer Graphics Application
正文
6.4 变换矩阵的逆
虽然我们总是可以用代数方式反转矩阵,但如果我们知道变换的作用,我们就可以使用几何。例如,scale(sx, sy, sz) 的倒数是 scale(1/sx, 1/sy, 1/sz)。旋转的倒数是相同的旋转,角度上的符号相反。平移的逆向是相反方向的平移。如果我们有一系列矩阵 M = M1M2 ···Mn 则 M-1 = M-1 n ···M-1 2 M-1 1 。
此外,某些类型的变换矩阵很容易求逆。我们已经提到了尺度,它是对角矩阵;第二个重要的例子是旋转,它是正交矩阵。回想一下(第 5.2.4 节),正交矩阵的逆矩阵是它的转置。这使得反转旋转和刚体变换变得容易(参见练习 6)。此外,知道底行中具有 [0 0 0 1] 的矩阵具有底行中也具有 [0 0 0 1] 的逆矩阵也很有用(参见练习 7)。
有趣的是,我们也可以使用 SVD 来反转矩阵。由于我们知道任何矩阵都可以分解为旋转乘以尺度乘以 s 旋转,因此求逆很简单。例如,在 3D 中,我们有
从上面的规则很容易得出
6.5 坐标变换
之前的所有讨论都是关于使用变换矩阵来移动点。我们也可以将它们视为简单地更改表示点的坐标系。例如,在图 6.19 中,我们看到了两种可视化运动的方法。在不同的情况下,任何一种解释都可能更合适。
例如,一个驾驶游戏可能有一个城市模型和一个汽车模型。如果向玩家展示挡风玻璃外的视野,车内的物体总是被绘制在屏幕上的相同位置,而街道和建筑物似乎在玩家驾驶时向后移动。在每一帧上,我们对这些对象应用一个变换,使它们比前一帧移得更远。考虑这种操作的一种方法是简单地将建筑物向后移动。另一种思考方式是建筑物保持不动,但我们要绘制它们的坐标系(连接到汽车)正在移动。在第二种解释中,变换是改变城市几何的坐标,将它们表示为汽车坐标系中的坐标。这两种方式都将导致应用于汽车外部几何图形的完全相同的矩阵。
如果游戏还支持俯视图来显示汽车在城市中的位置,则需要将建筑物和街道绘制在固定位置,而汽车需要逐帧移动。同样的两种解释适用:我们可以将变化的转换视为将汽车从其规范位置移动到其在世界上的当前位置;或者我们可以将转换视为简单地改变汽车几何的坐标,它最初是用附着在汽车上的坐标系来表达的,而不是用相对于城市固定的坐标系来表达。坐标变化的解释清楚地表明了这两种模式中使用的矩阵(城市到汽车的坐标变化与汽车到城市的坐标变化)ty 坐标变化)是彼此的倒数。
改变坐标系的想法很像编程中类型转换的想法。在我们可以将浮点数添加到整数之前,我们需要将整数转换为浮点数或将浮点数转换为整数,这取决于我们的需要,以便类型匹配。而在我们将城市和汽车绘制在一起之前,我们需要根据需要将城市转换为汽车坐标或汽车转换为城市坐标,以便坐标匹配。
在管理多个坐标系时,很容易混淆并以错误的坐标结束对象,导致它们出现在意想不到的地方。但是通过系统地思考坐标系之间的转换,您可以可靠地正确地进行转换。
在几何上,坐标系或坐标系由原点和基础(一组三个向量)组成。正交基非常方便,除非另有说明,否则我们通常会假设帧是正交的。在原点 p 和基 {u, v, w} 的框架中,坐标 (u, v, w) 描述了该点
当我们将这些向量存储在计算机中时,它们需要用某个坐标系来表示。首先,我们必须指定一些规范坐标系,通常称为“全局”或“世界”坐标,用于描述所有其他系统。在城市示例中,我们可能采用街道网格并使用 x 轴指向 Main Street、y 轴指向上方、z 轴指向 Central Avenue 的约定。那么当我们用这些坐标来写车架的原点和基础时,我们的意思就很清楚了。
当然,在二维中,有两个基向量。
在 2D 中,右手表示 y 从 x 逆时针方向
在 2D 中,我们的惯例是使用点 o 作为原点,使用 x 和 y 作为右手正交基向量 x 和 y(图 6.20)。
另一个坐标系可能有一个原点 e 和右手正交基向量 u 和 v。请注意,典型的规范数据 o、x 和 y 永远不会显式存储。它们是所有其他坐标系的参考系。在那个坐标系中,我们经常将 p 的位置写成有序对,这是完整向量表达式的简写:
例如,在图 6.20 中,(xp, yp) = (2.5, 0.9)。请注意,对 (xp, yp) 隐含地假定原点 o。类似地,我们可以用另一个方程来表示 p:
在图6.20中,它具有(UP,VP)=(0.5,-0.7)。同样,原点E作为与U和V关联的坐标系的隐式部分。
我们可以使用矩阵机械表达相同的关系,这样:
请注意,这假设我们将点 e 和向量 u 和 v 存储在规范坐标中; (x, y) 坐标系是等号中的第一个。根据我们在本章中讨论的基本类型的转换,这是一个旋转(涉及 u 和 v),然后是平移(涉及 e)。一起看旋转和平移的矩阵,你会发现它很容易写下来:我们只需将 u、v 和 e 放入矩阵的列中,通常的 [0 0 1] 在第三行。为了更清楚,我们可以这样写矩阵:
我们将此矩阵称为 (u, v) 帧的帧到规范矩阵。它获取在 (u, v) 框架中表示的点,并将它们转换为在规范框架中表示的相同点。
“frame-to-canonical”这个名称是基于考虑将向量的坐标从一个系统更改为另一个系统。考虑到移动向量,帧到规范矩阵将规范帧映射到 (u,v) 帧。
要朝另一个方向走,我们有
这是一个平移,然后是一个旋转;它们是我们用来构建框架到规范矩阵的旋转和平移的逆矩阵,当它们相乘时,它们会产生框架到规范矩阵的逆矩阵,这(毫不奇怪)称为规范到规范矩阵框架矩阵:
规范到框架矩阵采用规范框架中表示的点并将它们转换为 (u,v) 框架中表示的相同点。我们将这个矩阵写为帧到规范矩阵的逆矩阵,因为它不能立即使用 e、u 和 v 的规范坐标写下来。但请记住,所有坐标系都是等价的;只是我们按照 x 和 y 坐标存储向量的惯例造成了这种看似不对称的情况。规范到帧矩阵可以简单地用 o、x 和 y 的 (u, v) 坐标表示:
所有这些想法在 3D 中的工作方式都非常相似,我们有
经常问的问题
• 我不能只硬编码变换而不使用矩阵形式吗?
是的,但在实践中,它更难派生,更难调试,而且效率也不高。此外,所有当前的图形 API 都使用这种矩阵形式,因此即使使用图形库也必须理解它。
• 矩阵的底行始终为 (0,0,0,1)。我必须存储它吗?
除非包含透视变换(第 7 章),否则不必存储它。
笔记
法线变换属性的推导基于表面法线变换的属性(Turkowski,1990)。在 1990 年代中期的许多处理中,向量表示为行向量并进行预乘,例如 b = aM。在我们的符号中,这将是 bT = aTMT。如果你想找到一个旋转矩阵 R,它将一个向量 a 带到一个相同长度的向量 b:b = Ra 你可以使用从正交基构造的两个旋转。 Efficiently Building a Matrix to Rotate to another (Akenine-M ¨oller, Haines, & Hoffman, 2008) 中给出了一种更有效的方法。
练习
- 写下要移动 (xm, ym, zm) 的 4 × 4 3D 矩阵。
- 写下 4 × 4 3D 矩阵以绕 y 轴旋转角度 θ。
- 写下 4 × 4 3D 矩阵以在所有方向上将对象缩放 50%。
- 写出顺时针旋转 90 度的二维旋转矩阵。
- 将练习 4 中的矩阵写为三个剪切矩阵的乘积.
6.求刚体变换的逆:
其中 R 是一个 3 × 3 的旋转矩阵,t 是一个 3 向量。
- 证明仿射变换矩阵的逆矩阵(除了右下角的一个,底行全为零)也具有相同的形式。
- 用文字描述这个 2D 变换矩阵的作用:
- 写下 3×3 矩阵,它围绕点 p = (xp, yp) 将 2D 点旋转角度 θ。
- 写下 4 × 4 旋转矩阵,它将正交 3D 向量 u = (xu, yu, zu), v = (xv, yv, zv) 和 w = (xw, yw, zw) 转换为正交 3D向量 a = (xa, ya, za), b = (xb, yb, zb) 和 c = (xc, yc, zc),所以 Mu = a, Mv = b, 和 Mw = c。
- 上一题答案的逆矩阵是什么?