在第3章中,虽然平移、旋转、缩放等变换操作都可以用一个4x4的矩阵表示,但是在写WebGL程序的时候,手动计算每个矩阵很耗费时间。为了简化编程,大多数WebGL开发者都使用矩阵操作函数库来隐藏矩阵计算的细节,简化与矩阵有关的操作。
书中的Matrix4
代码放到了 /utils/matrix4_util.ts
中。
我们可以用Matrix4
和其相关的方法来把RotatedTriangles
程序重写一遍,找找使用这个矩阵函数库的感觉.
import { Matrix4 } from '@/utils/matrix4_util';
// 新建一个矩阵
const xformMatrix = new Matrix4();
// 设置旋转
xformMatrix.setRotate(90.0, 0.0, 0.0, 1.0);
const u_xformMatrix = gl.getUniformLocation(gl.program, 'u_xformMatrix');
gl.uniformMatrix4fv(u_xformMatrix, false, xformMatrix.elements);
<“平移”后的坐标>=<平移矩阵>x<原始坐标>
<“平移后旋转”后的坐标>=<平移矩阵>x<平移后的坐标>
<“平移后旋转”后的坐标>=<旋转矩阵>x(<平移矩阵>x<原始坐标>)
这里
<旋转矩阵>x(<平移矩阵>X<原始坐标>)
等于(注意括号的位置)
(<旋转矩阵>x<平移矩阵>)x<原始坐标>
最后,我们可以在JavaScript中计算<旋转矩阵>x<平移矩阵>
,然后将得到的
矩阵传人顶点着色器。像这样,我们就可以把多个变换复合起来了。
强调一下,矩阵相乘的时候, A*B
不等于 B*A
。
// 创建Matrix4对象来进行模型变换
const modelMatrix = new Matrix4();
// 设置模型矩阵为旋转矩阵
const angle = 60.0;
const Tx = 0.5;
modelMatrix.setRotate(angle, 0.0, 0.0, 1);
modelMatrix.translate(Tx, 0, 0);
// 创建Matrix4对象来进行模型变换
const modelMatrix = new Matrix4();
// 设置模型矩阵为旋转矩阵
const angle = 60.0;
const Tx = 0.5;
modelMatrix.setTranslate(Tx,0,0);
modelMatrix.rotate(angle, 0.0, 0.0, 1);