返回
深入浅出 WebGL —— 第 3 章:仿射变换
前端
2023-12-24 20:36:30
仿射变换:WebGL 中操纵对象的魔法
从几何到图形学的桥梁
想像一下一张橡皮布,上面有许多标记点。当我们拉伸、扭曲或移动橡皮布时,标记点也会随之改变。在计算机图形学中,仿射变换 就是这张神奇的橡皮布,允许我们对对象进行缩放、旋转、平移和剪切等变形操作。
在 WebGL 中,仿射变换由一个称为 仿射矩阵 的 4x4 矩阵表示。这个矩阵就像橡皮布的控制面板,让我们可以精确地指定对象的变形方式。
理解仿射矩阵
仿射矩阵包含 16 个元素,分为三个 3x3 矩阵和一个平移向量:
[ a11, a12, a13, a14 ]
[ a21, a22, a23, a24 ]
[ a31, a32, a33, a34 ]
[ a41, a42, a43, a44 ]
前三个矩阵形成3x3 仿射矩阵 ,负责对象的实际变形,而最后一行是平移向量 ,指定对象的平移量。
仿射变换的应用
仿射变换在 WebGL 中有着广泛的应用:
- 变形对象: 缩放、旋转、平移和剪切
- 透视投影: 创建具有 3D 深度的场景
- 动画: 创建逼真的物体运动效果
- 扭曲和变形: 改变对象的形状
WebGL 中使用仿射变换
在 WebGL 中,我们可以使用 gl.uniformMatrix4fv()
函数应用仿射矩阵。它需要两个参数:矩阵的位置(在着色器中定义的 uniform
变量)和矩阵数据。
实例:旋转一个立方体
让我们以旋转立方体为例来说明仿射变换的应用。
const rotateX = Math.PI / 4; // 旋转角度(弧度)
const rotateY = Math.PI / 8;
const cosX = Math.cos(rotateX);
const sinX = Math.sin(rotateX);
const cosY = Math.cos(rotateY);
const sinY = Math.sin(rotateY);
const rotationMatrix = new Float32Array([
cosY, 0, sinY, 0,
0, 1, 0, 0,
-sinY, 0, cosY, 0,
0, 0, 0, 1
]);
// 在片元着色器中设置仿射矩阵
uniform mat4 u_rotationMatrix;
void main() {
vec4 transformedPosition = u_rotationMatrix * vec4(a_position, 1.0);
}
通过改变 rotateX
和 rotateY
的值,我们可以实现立方体的实时旋转。
探索仿射变换的更多功能
掌握了仿射变换的基本原理后,我们就可以探索其更高级的应用:
- 剪切变换: 扭曲对象的形状
- 投影变换: 创建透视或正交投影效果
- 正规化变换: 将物体限制在特定区域内
总结
仿射变换是 WebGL 中一种强大的工具,可以赋予我们对对象进行各种变形的能力。通过理解仿射矩阵并将其应用于我们的代码,我们可以创建引人注目的图形效果,让我们的 WebGL 项目栩栩如生。
常见问题解答
-
什么是仿射变换?
- 仿射变换是一组操作,允许我们缩放、旋转、平移和剪切对象。
-
如何表示仿射变换?
- 仿射变换由一个称为仿射矩阵的 4x4 矩阵表示。
-
如何使用仿射变换来旋转对象?
- 我们需要创建一个旋转矩阵,将旋转角度和旋转轴作为输入。
-
仿射变换有哪些应用?
- 仿射变换用于各种应用,包括变形对象、创建透视投影和动画效果。
-
什么是剪切变换?
- 剪切变换是一种扭曲对象形状的特殊类型的仿射变换。