目录

01UV坐标操控

09矩阵运算

矩阵运算实在是太熟悉了,这里只是简单说明一下矩阵记录。同时表明一下即使2Dshader也可以使用3维矩阵来操作化。

矩阵跟线性变换,仿射变换等息息相关。将其理解为对目标的一种操作,其可以对图形进行平移,缩放,转动等操作。部分射影变换也可以由此来构造表示。

在Godot中矩阵可以由mat来生成矩阵,例如如下方式可以生成Identity Matrix。

void vertex() {
    mat3 matrix = mat3(vec3(1,0,0),vec3(0,1,0),vec3(0,0,1));
}

需要注意的是mat参数中的每个向量表示的是列向量。如果用下标表示矩阵中的位置,则

mat3(vec3(x_11,x_21,x_31),vec3(x_12,x_22,x_32),vec3(x_13,x_23,x_33));

表示矩阵

$$ \begin{bmatrix} x_{11} & x_{12} & x_{13}\\ x_{21} & x_{22} & x_{23}\\ x_{31} & x_{32} & x_{33}\\ \end{bmatrix} $$

因为线性变化无法实现平移这种操作,线性变化对应线性空间,这种变换有个特点,原点必须映射到远点,这是他的不变子空间。而游戏中平移操作还是很常见的,所以一般使用仿射变换,添加了平移操作。关于这些空间的部分可以详细见数学的线性代数,代数几何等部分。

仿射变化类似于$T(\vec{x})=A\vec{x}+b$的形式,可以平移一个向量。所以矩阵会比线性空间维数多一。

一般三维下常用的控制矩阵有以下几类

  • 缩放矩阵
$$ \begin{bmatrix} s_x & 0 & 0 & 0\\ 0 & s_y & 0 & 0\\ 0 & 0 & s_z & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix} $$

$x,y,z$三轴方向缩放$s_x,s_y,s_z$倍。

  • 平移矩阵
$$ \begin{bmatrix} 1 & 0 & 0 & t_x\\ 0 & 1 & 0 & t_y\\ 0 & 0 & 1 & t_z\\ 0 & 0 & 0 & 1\\ \end{bmatrix} $$

目标点移动$t_x,t_y,t_z$距离。

以及最后的三轴转动矩阵,分别绕$x,y,z$三轴转动$a$角度

$$ \begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & \cos(a) & -\sin(a) & 0\\ 0 & \sin(a) & \cos(a) & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix} \space \begin{bmatrix} \cos(a) & 0 & \sin(a) & 0\\ 0 & 1 & 0 & 0\\ -\sin(a) & 0 & \cos(a) & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix} \space \begin{bmatrix} \cos(a) & -\sin(a) & 0 & 0\\ \sin(a) & \cos(a) & 0 & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix} $$

运用矩阵计算操作,即使Sprite2D也能展现出一定的伪3D效果。实际上这个效果,跟一个面片正对相机,相机采用正交模式是一样的。

基础理论上来说是这样的,在渲染管线中则有多个地方在使用这些矩阵变换。

坐标系转换

常见的坐标系变换就是:

局部空间–世界空间–(相机空间)–裁剪空间

在Godot里面局部空间到世界空间使用模型矩阵MODEL_MATRIX。 建一个物体各个顶点坐标转换到世界坐标可以如下运算:

varying vec2 world_pos;
void vertex() {
    world_pos = (MODEL_MATRIX * vec4(VERTEX,0.0,1.0)).xy;
}

其中MODEL_MATRIX表示到世界空间的变换矩阵其为$4*4$大小。而VERTEX表示面片顶点的各个局部坐标。这样变换之后得到的就是对应的世界空间坐标。

这个坐标如果想在片段着色器中使用。就要经过光栅化插值处理,将这些部分都计算到某个片元上去。所以要声明变量varying vec2 world_pos。