3D游戏数学基础中的计算原理及几何意义(一、矩阵)

6 篇文章 0 订阅
5 篇文章 0 订阅

-前言-

在3D开发中,矩阵的运算是极为频繁的,几乎任何关于3D场景中的对象运算都会用到矩阵的知识。

-正文-

在我们日常游戏开发中使用到的矩阵多为方针(行数等于列数),通常为2x2、3x3、4x4的方阵。

下面列举一个一般的3x3方阵:\begin{bmatrix} m_{11}&m_{12} &m_{13} \\ m_{21} &m_{22} &m_{23} \\ m_{31}&m_{32} & m_{33} \end{bmatrix}

对角矩阵及单位矩阵

对角矩阵是矩阵中非对角线元素均为0则为对角矩阵,上面3x3方阵中当m12,m13,m23,m21,m31,m32为0是为对角矩阵。

单位矩阵则是一种特殊的对角矩阵,同样以上面3x3方阵为例,当满足对角矩阵的情况下,m11,m22,m33为1时则为3x3矩阵的单位矩阵。

矩阵的转置

矩阵转置是沿着对角线翻折之后的矩阵。比如一个行向量转置后为一个列向量。

                                                              行向量转置:\begin{bmatrix} x &y &z \end{bmatrix}^{\tau} =\begin{bmatrix} x\\ y\\ z\\ \end{bmatrix}

既然说到行向量与列向量,不同平台默认使用的向量方式不一样,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)表示为矩阵为:\begin{bmatrix} x & y & z \end{bmatrix},能与之相乘的必然是一个三行的矩阵

在上面3x3矩阵中的方块中我们不管填什么值都无法满足右侧的结果,因此通过3x3矩阵是无法实现3D对象的平移的,因此4x4齐次矩阵能为我们解决这个问题。下面我通过手写构造了一个平移矩阵:

旋转

旋转轴可以是x轴,y轴,z轴,他们的基向量均不相同

当绕x轴旋转的基向量

R_{x}(\Theta ) = \begin{bmatrix} 1 & 0 &0 \\ 0& \cos\Theta & sin\Theta \\ 0& -sin\Theta & cos\Theta \end{bmatrix}

当绕y轴旋转的基向量

R_{y}(\Theta ) = \begin{bmatrix} cos\Theta & 0 &-sin\Theta \\ 0& \1 & 0 \\ sin\Theta& 0 & cos\Theta \end{bmatrix}

当绕z轴旋转的基向量

R_{z}(\Theta )=\begin{bmatrix} cos\Theta &sin\Theta &0 \\ -sin\Theta & cos\Theta &0 \\ 0 &0 &1 \end{bmatrix}

缩放

在3D中存在3个维度的缩放因子,分别为kx,ky,kz。在不同的方向应用不同的因子,被称为非均匀缩放。非均匀缩放时,物体角度将发生变换,视各方向缩放因子的不同,长度、面积、体积的变换因子也各不相同。

                                                            S(k_{x},k_{y},k_{z}) = \begin{bmatrix} k_{x} &0 &0 \\ 0& k_{y} &0 \\ 0& 0& k_{z} \end{bmatrix}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值