引言
在计算机图形学中, Transformation(变换)是构建和处理3D场景的核心概念。它不仅决定了物体在虚拟空间中的位置和姿态,还直接影响着渲染管线的效率和最终图像的视觉效果。Games101的第三讲深入探讨了从2D到3D的坐标变换体系,系统讲解了平移、旋转、缩放等基础变换的原理与实现方法,并引入了齐次坐标这一关键数学工具,为后续的图形渲染管线奠定了理论基础。
一、为什么需要变换?
1.1 图形学中的坐标体系
在图形学中,坐标体系是描述物体位置和空间关系的数学框架。不同的坐标体系服务于不同的计算需求:
模型坐标系(Model Space):每个物体拥有独立的坐标系,原点通常位于物体中心,便于描述局部几何特征。
世界坐标系(World Space):所有物体共享的全局坐标系,用于统一管理场景中的物体位置和关系。
相机坐标系(Camera Space):以相机为原点的坐标系,用于定义视锥体和裁剪操作。
屏幕坐标系(Screen Space):最终渲染到显示设备的坐标系,通常以像素为单位。
1.2 坐标变换的意义
坐标变换的本质是将物体从一个坐标系映射到另一个坐标系。例如:
将模型从模型坐标系转换到世界坐标系,实现场景组装。
将世界坐标系中的物体转换到相机坐标系,实现视角控制。
将3D坐标投影到2D屏幕,实现透视效果。
1.3 变换的数学表示
变换通过矩阵运算实现,其核心思想是: $$ \mathbf{v}' = \mathbf{M} \cdot \mathbf{v} $$ 其中:
$\mathbf{v}$ 是原坐标(3×1向量)
$\mathbf{M}$ 是变换矩阵(3×3或4×4矩阵)
$\mathbf{v}'$ 是变换后的坐标
二、2D变换:基础操作
2.1 平移(Translation)
平移是改变物体位置的变换,其矩阵形式为: $$ \mathbf{T} = \begin{bmatrix} 1 & 0 & t_x \ 0 & 1 & t_y \ 0 & 0 & 1 \end{bmatrix} $$
$t_x$ 和 $t_y$ 分别表示x和y方向的平移量。
特点:平移不可通过3×3矩阵的线性变换实现,需引入齐次坐标。
2.2 旋转(Rotation)
旋转是绕某点改变物体方向的变换,其矩阵形式为: $$ \mathbf{R}(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \ \sin\theta & \cos\theta & 0 \ 0 & 0 & 1 \end{bmatrix} $$
$\theta$ 为旋转角度(逆时针为正)。
旋转中心默认为坐标系原点,可通过组合平移实现绕任意点旋转。
2.3 缩放(Scaling)
缩放是改变物体尺寸的变换,其矩阵形式为: $$ \mathbf{S}(s_x, s_y) = \begin{bmatrix} s_x & 0 & 0 \ 0 & s_y & 0 \ 0 & 0 & 1 \end{bmatrix} $$
$s_x$ 和 $s_y$ 分别表示x和y方向的缩放因子。
缩放中心默认为原点,可通过组合平移实现绕任意点缩放。
2.4 变换的复合与顺序
在实际应用中,多个变换需按特定顺序组合:
先缩放后旋转:缩放会改变旋转的效果(如非均匀缩放导致物体变形)。
先旋转后缩放:缩放仅影响旋转后的坐标,保持几何形状。
示例:绕点$(x_0, y_0)$旋转$\theta$的复合变换: $$ \mathbf{T} = \mathbf{T}(x_0, y_0) \cdot \mathbf{R}(\theta) \cdot \mathbf{T}(-x_0, -y_0) $$
三、3D变换:扩展与挑战
3.1 3D平移
平移矩阵扩展为: $$ \mathbf{T} = \begin{bmatrix} 1 & 0 & 0 & t_x \ 0 & 1 & 0 & t_y \ 0 & 0 & 1 & t_z \ 0 & 0 & 0 & 1 \end{bmatrix} $$
3.2 3D旋转
3D旋转需绕某一轴进行,其矩阵形式为:
绕x轴旋转: $$ \mathbf{R}_x(\theta) = \begin{bmatrix} 1 & 0 & 0 & 0 \ 0 & \cos\theta & -\sin\theta & 0 \ 0 & \sin\theta & \cos\theta & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} $$
绕y轴旋转: $$ \mathbf{R}_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta & 0 \ 0 & 1 & 0 & 0 \ -\sin\theta & 0 & \cos\theta & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} $$
绕z轴旋转: $$ \mathbf{R}_z(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 & 0 \ \sin\theta & \cos\theta & 0 & 0 \ 0 & 0 & 1 & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} $$
3.3 3D缩放
缩放矩阵扩展为: $$ \mathbf{S}(s_x, s_y, s_z) = \begin{bmatrix} s_x & 0 & 0 & 0 \ 0 & s_y & 0 & 0 \ 0 & 0 & s_z & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} $$
3.4 3D变换的复合
3D变换的复合顺序直接影响结果:
先旋转后平移:旋转以物体局部坐标系为基准。
先平移后旋转:旋转以世界坐标系为基准。
四、齐次坐标:统一变换的数学工具
4.1 齐次坐标的引入
齐次坐标通过增加一个维度(通常为$w$)来统一表示平移、旋转和缩放: $$ \mathbf{v} = \begin{bmatrix} x \ y \ z \ w \end{bmatrix} $$
当$w=1$时,表示三维点:$(x/w, y/w, z/w)$。
当$w=0$时,表示向量(无位置信息)。
4.2 齐次坐标的优势
统一表示:所有变换可表示为4×4矩阵的乘法。
逆变换:通过矩阵求逆实现。
透视投影:支持齐次除法实现透视效果。
4.3 齐次坐标下的变换矩阵
平移矩阵: $$ \mathbf{T} = \begin{bmatrix} 1 & 0 & 0 & t_x \ 0 & 1 & 0 & t_y \ 0 & 0 & 1 & t_z \ 0 & 0 & 0 & 1 \end{bmatrix} $$
旋转矩阵: $$ \mathbf{R}_x(\theta) = \begin{bmatrix} 1 & 0 & 0 & 0 \ 0 & \cos\theta & -\sin\theta & 0 \ 0 & \sin\theta & \cos\theta & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} $$
缩放矩阵: $$ \mathbf{S}(s_x, s_y, s_z) = \begin{bmatrix} s_x & 0 & 0 & 0 \ 0 & s_y & 0 & 0 \ 0 & 0 & s_z & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} $$
五、变换顺序与矩阵乘法
5.1 矩阵乘法的结合性
变换矩阵的乘法满足结合律,但不满足交换律: $$ \mathbf{M}_1 \cdot (\mathbf{M}_2 \cdot \mathbf{M}_3) = (\mathbf{M}_1 \cdot \mathbf{M}_2) \cdot \mathbf{M}_3 $$ $$ \mathbf{M}_1 \cdot \mathbf{M}_2 \neq \mathbf{M}_2 \cdot \mathbf{M}_1 $$
5.2 变换顺序的物理意义
先旋转后平移:旋转以物体局部坐标系为基准,平移以世界坐标系为基准。
先平移后旋转:旋转以世界坐标系为基准,平移以旋转后的坐标系为基准。
5.3 示例:绕任意点旋转
将物体平移至原点:$\mathbf{T}(-x_0, -y_0, -z_0)$。
执行旋转:$\mathbf{R}(\theta)$。
将物体平移回原位置:$\mathbf{T}(x_0, y_0, z_0)$。
复合变换矩阵: $$ \mathbf{M} = \mathbf{T}(x_0, y_0, z_0) \cdot \mathbf{R}(\theta) \cdot \mathbf{T}(-x_0, -y_0, -z_0) $$
六、变换的应用场景
6.1 模型变换(Model Transformation)
将模型从模型坐标系转换到世界坐标系,包括:
位置调整(平移)
姿态调整(旋转)
尺寸调整(缩放)
6.2 视图变换(View Transformation)
将世界坐标系中的物体转换到相机坐标系,包括:
相机位置调整(平移)
相机方向调整(旋转)
6.3 投影变换(Projection Transformation)
将3D坐标投影到2D屏幕,包括:
正交投影(Orthographic Projection)
透视投影(Perspective Projection)
七、变换的优化与实现
7.1 变换矩阵的存储
在图形API中,变换矩阵通常以列优先顺序存储: $$ \mathbf{M} = \begin{bmatrix} m_{11} & m_{12} & m_{13} & m_{14} \ m_{21} & m_{22} & m_{23} & m_{24} \ m_{31} & m_{32} & m_{33} & m_{34} \ m_{41} & m_{42} & m_{43} & m_{44} \end{bmatrix} $$
7.2 变换的层次结构
复杂场景中,物体通常以层次结构组织:
父节点的变换会影响子节点。
子节点的变换是相对于父节点的坐标系。
7.3 变换的逆运算
逆变换用于实现撤销操作或反向计算: $$ \mathbf{v} = \mathbf{M}^{-1} \cdot \mathbf{v}' $$
八、总结与展望
8.1 核心知识点回顾
2D变换:平移、旋转、缩放及其矩阵表示。
3D变换:扩展至三维空间,引入绕任意轴旋转。
齐次坐标:统一表示变换,支持透视投影。
变换顺序:影响最终结果,需谨慎设计。
8.2 进阶方向
四元数:用于表示旋转,避免万向节锁问题。
骨骼动画:通过层次变换实现角色动画。
物理模拟:结合变换实现刚体动力学。
8.3 实践建议
使用图形API(如OpenGL或DirectX)内置的变换函数。
调试时,通过打印变换矩阵验证计算结果。
理解变换的数学本质,避免盲目套用公式。
结语
Transformation是计算机图形学的基石,它不仅是构建虚拟世界的数学工具,更是连接几何与视觉的桥梁。通过深入理解变换的原理和实现方法,我们能够更高效地构建复杂的3D场景,实现从简单几何体到逼真虚拟现实的跨越。在后续的学习中,变换将贯穿于渲染管线的每一个环节,成为我们探索图形学奥秘的钥匙。