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中的矩阵Matrix_矩阵变换


3:旋转矩阵

我们在处理旋转时可以绕任何轴旋转,但是绕平行于坐标轴的轴旋转时最容易的,现在我们来处理绕z轴旋转,旋转的表达式为:

Unity中的矩阵Matrix_Unity中的矩阵Matrix_02


参数θ是绕Z轴的旋转角度,写成矩阵形式为:

Unity中的矩阵Matrix_4X4矩阵_03


绕Y轴旋转则是

Unity中的矩阵Matrix_缩放_04


绕Z轴旋转则是

Unity中的矩阵Matrix_Unity中的矩阵Matrix_05


4:缩放矩阵

我们可以对一个模型沿空间的x轴、y轴和z轴进行缩放。 同样, 我们可以使用矩阵乘法来表示一个缩放变换:

Unity中的矩阵Matrix_4X4矩阵_06


如果kx=ky=kz,则称为是统一缩放。否则称为非统一缩放。

5:复合变换

通过平移,缩放,旋转组合我们组成复合变换,复合变换可以通过矩阵串联来变换。例如,使模型先进行缩放变换,然后旋转,然后平移,那变换矩阵如下:

Unity中的矩阵Matrix_unity_07


由于上面我们使用的是列矩阵,因此阅读顺序是从右到左,即先进行缩放变换,再进行旋转 变换,最后进行平移变换。需要注意的是,变换的结果是依赖于变换顺序的,由于矩阵乘法不满足交换律,因此矩阵的乘法顺序很重要。也就是说,不同的变换顺序得到的结果可能是不一样的。究其本质是因为矩阵的乘法不满足交换律。

为了从数学公式上理解变换顺序的本质,我们可以对比不同变换顺序产生的变换矩阵的表达 式。如果我们只考虑对 y 轴的旋转的话,按先缩放、再旋转、最后平移这样的顺序组合 3 种变换得到的变换矩阵是:

Unity中的矩阵Matrix_unity_08


如果改变变换顺序,如先平移,再缩放,后旋转,则变换矩阵是:

Unity中的矩阵Matrix_unity_09


从结果上可以看出变换的矩阵是不一样的。

除此之外,旋转时的变换顺序也是很重要的,当我们直接给出一个(θx,θy,θz)的旋转,则需要定义一个旋转顺序,unity的旋转顺序是zxy,这意味着在给以一个这样的旋转角时,得到的变换矩阵为:

Unity中的矩阵Matrix_缩放_10