矩阵-变换
矩阵的几何意义
矩阵的几何意义
点和向量能在图像中画出来,那么矩阵可以吗? 答案是肯定的,矩阵的可视化结果就是:变换
在游戏开发中,如果你看到了一个矩阵,那么基本上你可以认为你看到的是一个 变换,
这些变换一般包含:平移、旋转、缩放
比如: 我们想要将一个点、一个向量进行一种变换(平移、旋转、缩放) 那么我们可以利用矩阵来进行数学计算,从而达到变换的目的
变换的种类
矩阵的几何意思是变换,在数学中常用的几何变换有两种:
线性变换 和 仿射变换
他们的主要区别在于是否保持直线的平行性和原点位置
线性变换:
保持直线的平行性和原点位置不变,比如缩放、旋转等操作 简而意之就是只对向量进行旋转、缩放等操作,而不影响方向和原点的位置
仿射变换:
由一个线性变换和一个平移组成,比如缩放后、旋转后再平移 简而言之就是缩放后、旋转后平移,会改变原点的位置
齐次坐标
齐次坐标是一种在计算机图形学中常用的表示坐标的方式。 它是通过引入一个额外的维度来扩展传统的笛卡尔坐标系, 就是将一个原本是 n 维的向量或矩阵用 n + 1维来表示, 让我们可以更方便的进行几何变换和矩阵运算。
举例:
三维空间中有一个向量或点 ( x , y , z),它对应的齐次坐标就是给它加一维,变成 (x , y , z , w),其中 w 值的改变可以让它有具有不同的含义。
为什么要使用齐次坐标进行矩阵运算
主要原因1:
通过齐次坐标,我们可以明确的区分向量和点
三维空间中的 ( x , y , z) ,它既可以表示点,也可以表示向量。 可以利用齐次坐标给它加一维,变成 (x , y , z , w),其中 w = 1 时 代表是一个点,w = 0 时 代表一个向量。 这样就可以明确它是点还是向量了
主要原因2:
3x3矩阵是不能直接表示平移变换,它只能表示线性变换,也就是只能描述对象的旋转、缩放等线性变换,而不能描述对象的平移。
平移涉及到改变对象在空间中的位置,包括移动对象的原点。因此,我们需要引入一个额外的维度 来表示平移操作,所以使用齐次坐标来将3x3矩阵加一个维度变为4x4的矩阵
3x3矩阵一般称为线性矩阵,主要处理线性变换(主要进行旋转、缩放等线性变换)
4x4矩阵一般称为仿射矩阵,主要处理仿射变换(线性变换 + 平移变换)
平移矩阵
基础变换矩阵的构成规则
$$ \begin{bmatrix} {\color{Red}M11}&{\color{Red}M12}&{\color{Red}M13}&{\color{blue}t{1}}\\ {\color{Red}M21}&{\color{Red}M22}&{\color{Red}M23}&{\color{blue}t{2}}\\ {\color{Red}M31}&{\color{Red}M32}&{\color{Red}M33}&{\color{blue}t{3}}\\ {\color{teal}0}&{\color{teal}0}&{\color{teal}0}&{\color{green}1}\\ \end{bmatrix} $$矩阵的 M3x3部分用于表示旋转和缩放变换
矩阵的 t3x1> 部分用于表示平移
矩阵的 01x3 部分始终为零矩阵
矩阵的 右下角元素 始终为 1
平移矩阵的构成
$$ \begin{bmatrix} {\color{Red}1}&{\color{Red}0}&{\color{Red}0}&{\color{blue}tx}\\ {\color{Red}0}&{\color{Red}1}&{\color{Red}0}&{\color{blue}ty}\\ {\color{Red}0}&{\color{Red}0}&{\color{Red}1}&{\color{blue}tz}\\ {\color{teal}0}&{\color{teal}0}&{\color{teal}0}&{\color{green}1}\\ \end{bmatrix} $$平移矩阵的构成规则为:
矩阵的 M3x3 部分 为 3x3 单位矩阵
矩阵的 t 3x1 部分用于表示 x,y,z 平移多少单位
平移矩阵的计算
与点之间的计算(使用向量的齐次坐标进行计算,w为1,代表是一个点) $$ \begin{bmatrix} {\color{Red}1}&{\color{Red}0}&{\color{Red}0}&{\color{blue}tx}\ {\color{Red}0}&{\color{Red}1}&{\color{Red}0}&{\color{blue}ty}\ {\color{Red}0}&{\color{Red}0}&{\color{Red}1}&{\color{blue}tz}\ {\color{teal}0}&{\color{teal}0}&{\color{teal}0}&{\color{green}1}\ \end{bmatrix} \begin{bmatrix} {x} \ {y} \ {z} \ 1 \end{bmatrix}
\begin{bmatrix} x+tx\ y+ty\ z+tz\ 1\ \end{bmatrix} $$ 从该计算便可以看出为什么3x3的矩阵无法表示平移,而需要使用齐次坐标4x4的矩阵 点的x,y,z分量分别增加了一个位置偏移,在几何图像中的效果就是, 将点 (x,y,z) 在3D空间中平移了了(tx,ty,tz)个单位
与向量之间的计算(使用向量的齐次坐标进行计算,w为0,代表是一个向量) $$ \begin{bmatrix} {\color{Red}1}&{\color{Red}0}&{\color{Red}0}&{\color{blue}tx}\ {\color{Red}0}&{\color{Red}1}&{\color{Red}0}&{\color{blue}ty}\ {\color{Red}0}&{\color{Red}0}&{\color{Red}1}&{\color{blue}tz}\ {\color{teal}0}&{\color{teal}0}&{\color{teal}0}&{\color{green}1}\ \end{bmatrix} \begin{bmatrix} {x} \ {y} \ {z} \ 0 \end{bmatrix}
\begin{bmatrix} x\ y\ z\ 1\ \end{bmatrix} $$ 从该计算可以发现,向量的平移结果是不会有任何变化的(tx,ty,tz和0相乘)。
平移矩阵是否是正交矩阵
平移矩阵并不是正交矩阵
因为平移矩阵不是正交矩阵,所以我们需要计算它的逆矩阵
$$ \begin{bmatrix} {\color{Red}1}&{\color{Red}0}&{\color{Red}0}&{\color{blue}tx}\\ {\color{Red}0}&{\color{Red}1}&{\color{Red}0}&{\color{blue}ty}\\ {\color{Red}0}&{\color{Red}0}&{\color{Red}1}&{\color{blue}tz}\\ {\color{teal}0}&{\color{teal}0}&{\color{teal}0}&{\color{green}1}\\ \end{bmatrix} \begin{bmatrix} {\color{Red}1}&{\color{Red}0}&{\color{Red}0}&{\color{blue}-tx}\\ {\color{Red}0}&{\color{Red}1}&{\color{Red}0}&{\color{blue}-ty}\\ {\color{Red}0}&{\color{Red}0}&{\color{Red}1}&{\color{blue}-tz}\\ {\color{teal}0}&{\color{teal}0}&{\color{teal}0}&{\color{green}1}\\ \end{bmatrix} =I $$旋转矩阵
旋转操作需要指定一个旋转轴(不一定是空间中的坐标轴)
$$ \begin{bmatrix} {\color{Red}1}&{\color{Red}0}&{\color{Red}0}&{\color{Red}0}\\ {\color{Red}0}&{\color{Red}cosβ}&{\color{Red}-sinβ}&{\color{Red}0}\\ {\color{Red}0}&{\color{Red}sinβ}&{\color{Red}cosβ}&{\color{Red}0}\\ {\color{Red}0}&{\color{Red}0}&{\color{Red}0}&{\color{Red}1}\\ \end{bmatrix} $$$$ \begin{bmatrix} {\color{Red}cosβ}&{\color{Red}0}&{\color{Red}sinβ}&{\color{Red}0}\\ {\color{Red}0}&{\color{Red}1}&{\color{Red}0}&{\color{Red}0}\\ {\color{Red}-sinβ}&{\color{Red}0}&{\color{Red}cosβ}&{\color{Red}0}\\ {\color{Red}0}&{\color{Red}0}&{\color{Red}0}&{\color{Red}1}\\ \end{bmatrix} $$$$ \begin{bmatrix} {\color{Red}cosβ}&{\color{Red}-sinβ}&{\color{Red}0}&{\color{Red}0}\\ {\color{Red}sinβ}&{\color{Red}cosβ}&{\color{Red}0}&{\color{Red}0}\\ {\color{Red}0}&{\color{Red}0}&{\color{Red}1}&{\color{Red}0}\\ {\color{Red}0}&{\color{Red}0}&{\color{Red}0}&{\color{Red}1}\\ \end{bmatrix} $$旋转矩阵的计算
需要注意的是,旋转矩阵主要是由基础变换矩阵的构成规则当中的 3x3 矩阵决定的 因此,平移部分的3x1矩阵都为0,并不影响计算
所以点( w=1)和向量(w=0)与旋转矩阵进行计算都会发生改变。
旋转矩阵是否是正交矩阵
旋转矩阵是正交矩阵
因此 x、y、z 轴的旋转矩阵的逆矩阵是它们的转置矩阵
我们可以利用旋转矩阵的逆矩阵来进行还原旋转
缩放矩阵
缩放矩阵的构成
缩放矩阵主要就是对向量或点进行缩放操作,它可以用于改变向量或点再各个坐标轴上的尺度 使其在每个方向上变大或变小,在三维空间中,它主要由x、y、z轴的缩放因子构成。
$$ \begin{bmatrix} {\color{Red}kx}&{\color{Red}0}&{\color{Red}0}&{\color{Red}0}\\ {\color{Red}0}&{\color{Red}ky}&{\color{Red}0}&{\color{Red}0}\\ {\color{Red}0}&{\color{Red}0}&{\color{Red}kz}&{\color{Red}0}\\ {\color{Red}0}&{\color{Red}0}&{\color{Red}0}&{\color{Red}1}\\ \end{bmatrix} $$注意:kx = ky = kz 时,称为统一缩放,否则称为非统一缩放。
缩放矩阵的计算
缩放矩阵主要是由基础变换矩阵的构成规则当中的 3x3 矩阵决定的 因此,平移部分的3x1矩阵都为0,并不影响计算。
所以点( w=1)和向量(w=0)与缩放矩阵进行计算都会发生改变。
几何意义是 :
对点的缩放(一般是构成模型的顶点),相当于就是在缩放模型大小。
对向量的缩放,统一缩放时只会改变向量的大小(模长),不会改变向量的方向
非统一缩放时不仅会改变大小,可能还会改变向量的方向
缩放矩阵是否是正交矩阵
缩放矩阵通常不是正交矩阵
为什么说通常不是呢,因为对于缩放矩阵来说kx、ky、kz一般都不会是1,是1后就会是单位矩阵了。
$$ \begin{bmatrix} {\color{Red}1/kx}&{\color{Red}0}&{\color{Red}0}&{\color{Red}0}\\ {\color{Red}0}&{\color{Red}1/ky}&{\color{Red}0}&{\color{Red}0}\\ {\color{Red}0}&{\color{Red}0}&{\color{Red}1/kz}&{\color{Red}0}\\ {\color{Red}0}&{\color{Red}0}&{\color{Red}0}&{\color{Red}1}\\ \end{bmatrix} $$复合运算
所谓的复合运算,其实就是我们在计算矩阵变换时,可以把平移、旋转、缩放等计算组合起来通过结合多矩阵的乘法,来形成一个复杂的变换过程。
P新 = M平移M旋转M缩放P老
计算顺序对结果的影响
在进行复合运算时,变换的结果依赖于变换的顺序
原因:
矩阵乘法不满足交换律
也就是说,不同的变换顺序得到的计算结果也可能是不一样的。
Unity中需要遵守的规则
在进行平移、旋转、缩放的复合运算时
绝大多数情况下,我们约定的变换顺序为:
先缩放、再旋转、后平移
在进行x轴、y轴、z轴旋转的复合运算时
绝大多数情况下,我们约定的变换顺序为:
z->x->y