复合变换
平移,然后旋转
大多数WebGL开发者都使用矩阵操作函数库来隐藏矩阵计算的细节。
矩阵变换库:cuon-matrix.js
OpenGL提供了一系列创建变换矩阵的函数,但WebGL都没有。
matrix4
在 cuon-matrix.js中提供了一种 Matrix4 类,
其中封装了许多创建变换矩阵的方法。
Matrix4 表示 4×4的矩阵,
其实例内部一贯使用 Float32Array类型 来存储矩阵元素。
RotatedTriangle_Matrix4
RotatedTriangle_Matrix4 Code
1 |
|
1 | let VSHADER_SOURCE = |
Matrix4.setRotate(ANGLE, x, y ,z)
- ANGLE: 表示旋转角,是角度制不是弧度制
- (x,y,z): 表示旋转轴
- 旋转角度是正值 表示逆时针方向旋转
- 绕x轴逆时针旋转 (1,0,0)
- 绕y轴逆时针旋转 (0,1,0)
- 绕z轴逆时针旋转 (0,0,1)
Matrix4类型
setIdentity()
将Matrix4实例初始化为 单位阵。
1 | let mat4 = new Matrix4(); |
setTranslate(x,y,z)
将Matrix实例设置为 平移变换矩阵,
(x,y,z)表示在xyz轴上平移距离。
1 | let mat4 = new Matrix4(); |
setRotate(angle,x,y,z)
将Matrix4实例设置为 旋转变换矩阵。
- angle 表示旋转角度
- (x,y,z) 表示旋转轴,无需进行归一化
1 | let mat4 = new Matrix4(); |
setScale(x,y,z)
将Matrix4实例设置为 缩放变换矩阵 ,
(x,y,z)表示三个轴上的缩放因子。
1 | let mat4 = new Matrix4(); |
translate(x,y,z)
将Matrix4实例 乘以一个平移变换矩阵
1 | let mat4 = new Matrix4(); |
rotate(angle,x,y,z)
将Matrix4实例 乘以一个旋转变换矩阵
1 | let mat4 = new Matrix4(); |
scale(x,y,z)
将Matrix4实例 乘以一个缩放变换矩阵
1 | let mat4 = new Matrix4(); |
set(m)
将Matrix4实例 设置为m,
m必须是一个Matrix4实例。
1 | let m = new Matrix4(); |
elements
类型化数组 Floated2Array,
包含了Matrix4实例的矩阵元素。
有无set前缀的区别
有set前缀的方法
会根据参数计算出变换矩阵,然后将变换矩阵写入到自身中。
没有set前缀的方法
会先根据参数计算出变换矩阵,然后将自身与刚刚计算得到的变换矩阵相乘,最终把结果写入到Matrix4对象中。
复合变换
3×3矩阵乘法
问题描述
需要将图形先平移,再旋转。
图解
变换等式
( <旋转矩阵> × <平移矩阵> ) × <原始坐标>
Rotated Translated Triangle
RotatedTranslatedTriangle Code
1 |
|
1 | let ANGEL = 60.0; |
小案例:先旋转再平移
对比区别
需要调用的方法和顺序都要变换
1 | modelMatrix.setTranslate(Tx, Ty, Tz); |
运行结果