Unity 中的4X4矩阵

1:为什么模型的变换是4X4而不是3X3的矩阵变换?
我们知道,在空间里的点的坐标是vector3类型的,即是三维的,那为什么要用4维矩阵才能进行旋转平移和缩放呢?要解决这个问题就要从变换的本质来谈起。我们知道,在变换里分为线性变换和非线性变换,比如:
我们対模型进行缩放,那么缩放后的点坐标是
Pn=aPo (Po是以前的坐标空间,Pn是新的坐标空间,a是缩放比例)
好的,现在缩放用3x3是没问题的,那么先缩放再平移呢?
如:Pn= Apo+B (B是平移量)
我们发现不能写成Pn =A(Po+B’)形式的线性变换,所以3X3矩阵是不够的,所以采用多一维的扩充矩阵来实现平移。
2:平移矩阵
在三维齐次坐标表示中,任意点P= (x, y, z)通过将平移距离tx、ty和tz,加到P的坐标上而平移到位置P’= (x’, y’, z’)
x’= x + tx, y’= y + ty,z’= z + tz
用齐次矩阵表示为
Unity 中的4X4矩阵_第1张图片
3:旋转矩阵
我们在处理旋转时可以绕任何轴旋转,但是绕平行于坐标轴的轴旋转时最容易的,现在我们来处理绕z轴旋转,旋转的表达式为:
这里写图片描述
参数θ是绕Z轴的旋转角度,写成矩阵形式为:
Unity 中的4X4矩阵_第2张图片
绕Y轴旋转则是
Unity 中的4X4矩阵_第3张图片
绕Z轴旋转则是
Unity 中的4X4矩阵_第4张图片
4:缩放矩阵
我们可以对一个模型沿空间的x轴、y轴和z轴进行缩放。 同样, 我们可以使用矩阵乘法来表示一个缩放变换:
Unity 中的4X4矩阵_第5张图片
如果kx=ky=kz,则称为是统一缩放。否则称为非统一缩放。
5:复合变换
通过平移,缩放,旋转组合我们组成复合变换,复合变换可以通过矩阵串联来变换。例如,使模型先进行缩放变换,然后旋转,然后平移,那变换矩阵如下:
这里写图片描述
由于上面我们使用的是列矩阵,因此阅读顺序是从右到左,即先进行缩放变换,再进行旋转 变换,最后进行平移变换。需要注意的是,变换的结果是依赖于变换顺序的,由于矩阵乘法不满足交换律,因此矩阵的乘法顺序很重要。也就是说,不同的变换顺序得到的结果可能是不一样的。究其本质是因为矩阵的乘法不满足交换律。
为了从数学公式上理解变换顺序的本质,我们可以对比不同变换顺序产生的变换矩阵的表达 式。如果我们只考虑对 y 轴的旋转的话,按先缩放、再旋转、最后平移这样的顺序组合 3 种变换得到的变换矩阵是:
Unity 中的4X4矩阵_第6张图片
如果改变变换顺序,如先平移,再缩放,后旋转,则变换矩阵是:
Unity 中的4X4矩阵_第7张图片
从结果上可以看出变换的矩阵是不一样的。
除此之外,旋转时的变换顺序也是很重要的,当我们直接给出一个(θx,θy,θz)的旋转,则需要定义一个旋转顺序,unity的旋转顺序是zxy,这意味着在给以一个这样的旋转角时,得到的变换矩阵为:
Unity 中的4X4矩阵_第8张图片

你可能感兴趣的:(Unity学习,unity,4X4矩阵,矩阵变换)