3D游戏数学基础中的计算原理及几何意义(一、矩阵)
-前言-
在3D开发中,矩阵的运算是极为频繁的,几乎任何关于3D场景中的对象运算都会用到矩阵的知识。
-正文-
在我们日常游戏开发中使用到的矩阵多为方针(行数等于列数),通常为2x2、3x3、4x4的方阵。
下面列举一个一般的3x3方阵:
对角矩阵及单位矩阵
对角矩阵是矩阵中非对角线元素均为0则为对角矩阵,上面3x3方阵中当m12,m13,m23,m21,m31,m32为0是为对角矩阵。
单位矩阵则是一种特殊的对角矩阵,同样以上面3x3方阵为例,当满足对角矩阵的情况下,m11,m22,m33为1时则为3x3矩阵的单位矩阵。
矩阵的转置
矩阵转置是沿着对角线翻折之后的矩阵。比如一个行向量转置后为一个列向量。
行向量转置:
既然说到行向量与列向量,不同平台默认使用的向量方式不一样,DirectX中默认使用行向量,OpenGL中默认使用列向量。
1.对于任意矩阵M,转置后转置等于原矩阵
2.对于任意对角矩阵D,转置矩阵等于原矩阵(单位矩阵更是如此)
矩阵的乘法
矩阵中是没有除法的概念的,不过矩阵的乘法也是够打脑壳的。矩阵一般我们都是叫法都是行列,一个4x2的矩阵就是4行2列的矩阵,这个矩阵能与之相乘的矩阵必定满足行数为2,否则它们相乘没有意义。下面来看看一个4x2的矩阵乘以2x5的矩阵是如何相乘的(公式编辑器太麻烦了我就手写了):
矩阵乘法满足一下特性:
- 任意矩阵M乘以方阵,不管从哪边乘,都将得到与原矩阵大小相同的矩阵
- 矩阵乘法不满足交换律
- 矩阵乘法满足结合律,即(AB)C = A(BC)
- 矩阵乘积的转置等于先转置矩阵然后以相反顺序乘以矩阵,(AB)' = B'A'
矩阵的主要实际运用
在游戏开发中矩阵住还要用于对象的旋转、缩放、投影、镜像、仿射(平移)
除了仿射不是线性变换,其余变换都是线性变换。平移是不能使用3x3矩阵完成的,必须使用4x4齐次矩阵完成。
那我们首先来说说为什么3x3矩阵为什么不能平移,而必须使用4x4齐次矩阵才能完成3D对象的平移。
平移
一个3D对象的平移可以理解成在x,y,z分量上分别移动x‘,y’,z’的距离。根据上面所讲的矩阵乘法概念。
当一个3D坐标点Vector3(x,y,z)表示为矩阵为:,能与之相乘的必然是一个三行的矩阵
在上面3x3矩阵中的方块中我们不管填什么值都无法满足右侧的结果,因此通过3x3矩阵是无法实现3D对象的平移的,因此4x4齐次矩阵能为我们解决这个问题。下面我通过手写构造了一个平移矩阵:
旋转
旋转轴可以是x轴,y轴,z轴,他们的基向量均不相同
当绕x轴旋转的基向量
当绕y轴旋转的基向量
当绕z轴旋转的基向量
缩放
在3D中存在3个维度的缩放因子,分别为kx,ky,kz。在不同的方向应用不同的因子,被称为非均匀缩放。非均匀缩放时,物体角度将发生变换,视各方向缩放因子的不同,长度、面积、体积的变换因子也各不相同。