US2S1L9——复合运算

回顾各个变换矩阵

  1. 平移矩阵

    [100tx010ty001tz0001]\begin{bmatrix} 1 & 0 & 0 & tx \\ 0 & 1 & 0 & ty \\ 0 & 0 & 1 & tz \\ 0 & 0 & 0 & 1 \end{bmatrix}

  2. 旋转矩阵

    绕 x 轴旋转 β 度,旋转矩阵为:

    [10000cosβsinβ00sinβcosβ00001]\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & cos\beta & -sin\beta & 0 \\ 0 & sin\beta & cos\beta & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}

    绕 y 轴旋转 β 度,旋转矩阵为:

    [cosβ0sinβ00100sinβ0cosβ00001]\begin{bmatrix} cos\beta & 0 & sin\beta & 0 \\ 0 & 1 & 0 & 0 \\ -sin\beta & 0 & cos\beta & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}

    绕 z 轴旋转 β 度,旋转矩阵为:

    [cosβsinβ00sinβcosβ0000100001]\begin{bmatrix} cos\beta & -sin\beta & 0 & 0 \\ sin\beta & cos\beta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}

  3. 缩放矩阵

    [kx0000ky0000kz00001]\begin{bmatrix} kx & 0 & 0 & 0 \\ 0 & ky & 0 & 0 \\ 0 & 0 & kz & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}

复合运算

所谓的复合运算,其实就是我们在计算矩阵变换时,可以把平移、旋转、缩放等计算组合起来,
通过结合多矩阵的乘法,来形成一个复杂的变换过程

比如:我们可以将一个模型,先缩放到2倍大小,再绕y轴旋转60°,最后再向x轴平移5个单位。

这种复合变换过程,我们可以通过矩阵的串联来实现。
我们之前的知识点讲过,我们通过列矩阵的形式进行计算时,利用乘法结合律
可以从右往左去计算:先缩放、后旋转、再平移。

P=M平移M旋转M缩放PP_{新} = M_{平移}M_{旋转}M_{缩放}P_{老}

简而意之:复合运算就是把各种矩阵变换组合起来,形成一个复杂的变换过程

计算顺序对结果的影响

在进行复合运算时,变换的结果依赖于变换的顺序

原因:矩阵乘法不满足交换律
也就是说,不同的变换顺序得到的计算结果也可能是不一样的。

比如:一个人先往前一步,再左转 和 一个人先左转,再往前一步

得到的结果是不一样的,在矩阵运算的乘法运算中也会出现这样的情况
主要原因,就是因为矩阵乘法不支持交换律

Unity中需要遵守的规则

  1. 在进行平移、旋转、缩放的复合运算时

    绝大多数情况下,我们约定的变换顺序为:先缩放、再旋转、后平移

  2. 在进行x轴、y轴、z轴旋转的复合运算时

    绝大多数情况下,我们约定的变换顺序为:z -> x -> y

之后我们在Unity中进行Shader开发时,遵从这两个规则即可