变换矩阵
变换矩阵:旋转
变换矩阵(Transformation matrix)
为什么需要变换矩阵?
如果我们要实现一个 旋转后平移的操作,需要以下的等式:
1 | let VSHADER_SOURCE = |
可以看到变换式变得越来越繁琐,
但是如果用变量矩阵来实现就能简单很多,
变换矩阵(Transformation matrix) 相当适合操作计算机图形。
一些矩阵乘法基本条件
- 矩阵乘法不满足交换律
- 矩阵列数必须等于矢量行数
矩阵乘法等式
旋转矩阵(rotation matrix)
变换矩阵:平移
需要一个4×4的变换矩阵
因为在平移的等式中存在 常量项 ,
因此需要给三维矢量添加 第4个分量 ,
同时需要对变换矩阵进行扩充。
4×4的旋转矩阵
旋转矩阵的维度扩充
RotatedTriangle_Matrix
RotatedTriangle_Matrix Code
1 |
|
1 | var VSHADER_SOURCE = |
一些小问题
传入着色器内的矩阵变量的处理
使用一行就能够实现矢量与矩阵的加法:
1 | gl_Position = u_xformMatrix * a_Position ; |
因为shader内置了常用的矢量和矩阵运算功能。
mat4类型指的是4×4的矩阵类型
两种在数组中存储矩阵元素的方式
WebGL和OpenGL的矩阵元素都是按列主序存储在数组中的。
按行主序(row major order)
按列主序(column major order)
gl.uniformMatrix4fx()
函数名最后一个字母是v,
表示可以向shader传输多个数据值。
第二个参数Transpose之所以必须是false
是由于该参数表示 是否转置矩阵,
因为WebGL没有提供矩阵转置的方法,
所以该参数必须是false。
平移:相同的策略
平移使用的变换矩阵
1 | let xformMatrix = new Float32Array([ |
变换矩阵:缩放
图解
等式
变换矩阵
矩阵数组
1 | let xformMatrix = new Float32Array([ |
运行结果