游戏开发中的矩阵初探
一、矩阵在 3D 空间中的作用
1. 几何变换计算
在 3D 空间中,我们常常会遇到复杂的几何变换问题。例如,有一个长方体 A,需要绕点(10,3,4)旋转 50°,同时沿着 x 方向放大 2 倍,并向(9, -1,8)方向平移 2 个单位。此时,应用矩阵就可以轻松地计算出经过这些变换后,新的长方体各个点的坐标。
2. 坐标系转换
当我们知道子坐标系在父坐标系中的位置时,利用矩阵能够求出子坐标系中的点在父坐标系中的位置。
二、矩阵的基础知识
矩阵能够描述任意线性变换。线性变换具有一个重要特性,即它会保留直线和平行线。不过,在保留直线的同时,其他几何性质,如长度、角度、面积和体积,可能会被变换所改变。简单来说,线性变换可能会“拉伸”坐标系,但不会“弯曲”或“卷折”坐标系。
1. 平移
以下矩阵可以将一个点向 t 矢量方向平移: (此处原文未给出具体矩阵,需补充完整才能更准确)
2. 旋转
旋转的正方向规定为从旋转轴正向看过去的逆时针方向。例如,绕 z 轴[0, 0, 1]旋转时,正方向为从 x 轴至 y 轴的方向。
已知绕着三个坐标轴的旋转矩阵后,下面来看绕任意向量所得的矩阵。设 M 为单位矩阵经向量 a 旋转后的矩阵,且 a = (xa, ya, za),旋转角度为 α,则: (此处原文未给出具体的矩阵表达式,应补充完整) 虽然这里不详细推导其原理,但在实际应用中记住这个结论即可。
3. 缩放
若缩放点为 r,X 轴缩放系数为 sx,Y 轴缩放系数为 sy,Z 轴缩放系数为 sz,则点的新坐标可以通过相应的计算得到: (此处原文未给出具体的坐标计算公式,需补充完整)
4. 综合变换
例如,要对坐标系中的所有点进行以下操作:先平移[2, 3, 4](即 X 轴平移 2,Y 轴平移 3,Z 轴平移 4),再绕 z 轴旋转 90°,最后将 X、Y、Z 轴都放大 2 倍。此时,得到的变换矩阵需要按照一定的规则进行组合。需要注意的是,缩放操作不是简单地将 sx,sy,sz 位置相乘,而是每一轴的模为缩放值。并且,最后的变换矩阵的计算并非简单的相乘,需要根据具体的变换顺序和矩阵运算规则来确定。
三、子空间向父空间的变换
把点或方向从任何子坐标系 C 变换至父坐标系 P 的矩阵,可写作 Mc - p。此矩阵表示的是将点或方向从子空间变换至父空间。以下等式可以将任何子空间位置矢量 Pc 变换至父空间位置矢量 Pp:Pp = PcMc - p。
Mc - p 的具体形式如下: (此处原文未给出具体矩阵形式,应补充完整) 其中:
- ic 为子空间 x 轴的单位基矢量,此矢量以父空间坐标表示;
- jc 为子空间 y 轴的单位基矢量,此矢量以父空间坐标表示;
- kc 为子空间 z 轴的单位基矢量,此矢量以父空间坐标表示;
- tc 为子坐标系相对于父坐标系的平移。
四、坐标系中点的 RST(旋转平移缩放)
《OpenGl 超级宝典第四版》P101 页提到:如果一个 4×4 矩阵包含了一个不同的坐标系统的位置和方向(可以看成上面的 Mc - p),那么,把一个顶点 Pp 与这个矩阵相乘,其结果就是一个变换到该坐标系统的新顶点 Pc(坐标还是相对于原坐标系)。但这里原文表述容易产生误解,将 Pp 改名为 A,其坐标为 V,由于是线性变换,所以在新坐标系统中 A 的坐标还是 V。这就与 Pp = PcMc - p 一致了,此时 Pp 为 A 在新坐标系统中 V 在原坐标系中的坐标。
五、OpenGl 中的矩阵变换
在 OpenGl 中,矩阵的变换是叠加的。每进行一次矩阵变换,就会把零点移到新的坐标系中。后续的变换只影响当前坐标系及其子坐标系,不会影响其父坐标系。载入单位矩阵的作用是将零点重新置为最初的零点。
需要注意的是,单纯的矩阵运算不会移动零点位置,所以与单位矩阵相乘不会产生任何实际效果。
参考资料
- 《OpenGl 超级宝典第四版》P101
- 《游戏引擎架构》P151
- 《OpenGL 中 glRotatef()函数究竟对矩阵做了什么》
- 《3D 数学 ---- 矩阵的几何解释》