从零一起读_UnityShaderLab_06_矩阵变换(下)

231 阅读2分钟

这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

作为一名优秀的开发者,对于技术的探求应该是永无止步的,如何让自己更进步,那就只有不停的学习,不停的充电.而这些都是说起来容易做起来难,坚持才是难的地方 --蛙哈哈

如果我能更新完这一系列,我希望掘金能给我颁发一个劳模奖.

1.1缩放矩阵

假设向量 V1 = (x, y, z), 沿着 x, y, z轴 分别缩放 kx, ky, Kz , 缩放之后的向量为V2 ,也就是将 V1 的每一个分量分别乘以对应的缩放系数,因此:

V2 = (kxx, kyy, Kzz)

但在3D中,考虑到矩阵变换的统一性,最终并不是直接使用标量与向量进行乘法运算,而是通过矩阵进行变换的,咱们再用矩阵的思想进行分析,沿着每个坐标轴缩放之后, x^'^, y^'^, **z^'^**的三个基向量分别是:

x^'^ = kx(1, 0, 0) = (kx, 0, 0)

y^'^ = ky(0,1, 0) = (0, ky, 0)

z^'^ = kz(0, 0, 1) = (0, 0, kz)

将缩放之后的基向量纵向排列构建成一个 3 X 3的矩阵, 这个矩阵即为缩放矩阵:

[xyz]=[kx000ky000kz]\begin{bmatrix} x'\\y'\\z' \end{bmatrix} = \begin{bmatrix} k_x& 0& 0 \\ 0& k_y& 0 \\ 0& 0& k_z \\ \end{bmatrix}

1.2平移矩阵

假设点 P1 = (x1, y1, z1),将其 x 方向移动 dx 距离, 然后向y方向 移动dy 距离, 最后向 z 方向移动了 dz 距离, 于是点P2,计算公式如下:

P2 = P1 + (dx, dy, dz) = (x1, y1, z1)+(dx, dy, dz) = (x1+dx, y1+dy, z1+dz)

但是在3D中,所有的变换都是通过矩阵完成的,平移自然也不例外

由于 3 X 3的矩阵无法显示平移,因此需要将矩阵的行数和列数再扩展一维,变成一个 4 X 4的齐次矩阵, 在三维单位矩阵 I3的基础上进行扩展,对角元素保持为1,然后将三个轴向的平移距离卸载扩展出来的第四行上,并将第四列剩余的元素填充为0,最终的平移矩阵为:

[100001000010dxdydz1]\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ d_x & d_y& d_z & 1 \\ \end{bmatrix}

所以就可以得出向量平移的公式:

P2=[x1y1z11][100001000010dxdydz1]=(x1+dx,y1+dy,z1+dz,1)P_2 = \begin{bmatrix} x_1 & y_1 & z_1 & 1 \\ \end{bmatrix}\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ d_x & d_y& d_z & 1 \\ \end{bmatrix} = (x_1 + d_x, y_1 + d_y, z_1 + d_z, 1)