在3D图形渲染中,物体需要经过一系列坐标变换才能最终显示在屏幕上。这些变换将3D空间中的几何体转换为2D屏幕像素。
变换流程概览
坐标系详解
1. 局部坐标 (Local Space / Object Space)
- 定义:物体自身的坐标系,以物体中心为原点
- 特点:每个物体都有自己独立的局部坐标系
- 用途:建模时使用,便于物体的创建和编辑
- 示例:一个立方体的顶点坐标可能是 (-1,-1,-1) 到 (1,1,1)
2. 世界坐标 (World Space)
- 定义:整个3D场景的全局坐标系
- 特点:所有物体都统一在这个坐标系中
- 用途:确定物体在场景中的绝对位置和相对关系
- 示例:房间中的桌子位于 (5,0,3),椅子位于 (5,0,1)
3. 观察坐标 (View Space / Camera Space)
- 定义:以摄像机为原点的坐标系
- 特点:摄像机位于原点,看向-Z方向,Y轴向上
- 用途:简化后续的投影计算
- 示例:摄像机前方2米的物体坐标为 (0,0,-2)
4. 裁剪坐标 (Clip Space)
- 定义:应用投影变换后的坐标系
- 特点:包含齐次坐标的w分量,用于透视除法
- 用途:进行视锥体裁剪,剔除不可见的几何体
- 示例:坐标范围通常在 [-w, w] 之间
5. 标准化设备坐标 (NDC - Normalized Device Coordinates)
- 定义:经过透视除法后的标准化坐标
- 特点:坐标范围固定在 [-1, 1] 之间(OpenGL)或 [0, 1](DirectX)
- 用途:与具体屏幕分辨率无关的标准化表示
- 示例:屏幕中心为 (0,0),四个角为 (±1,±1)
6. 屏幕坐标 (Screen Space)
- 定义:最终的像素坐标
- 特点:以像素为单位,左上角通常为原点
- 用途:直接对应屏幕上的像素位置
- 示例:1920x1080屏幕的坐标范围为 (0,0) 到 (1919,1079)
详细变换步骤
1. 模型变换 (Model Transform)
将物体从局部坐标系转换到世界坐标系
- 平移:移动物体位置
- 旋转:改变物体朝向
- 缩放:改变物体大小
2. 视图变换 (View Transform)
将世界坐标转换到摄像机坐标系
- 以摄像机为原点建立新的坐标系
- 摄像机看向的方向为-Z轴
3. 投影变换 (Projection Transform)
将3D坐标投影到2D平面
- 透视投影:模拟人眼视觉,远小近大
- 正交投影:平行投影,不考虑距离
4. 透视除法 (Perspective Division)
将裁剪坐标转换为标准化设备坐标
5. 视口变换 (Viewport Transform)
将NDC转换为屏幕像素坐标
- X、Y坐标映射到屏幕分辨率
- Z坐标映射到深度缓冲区范围
变换矩阵
每个变换都可以用4x4矩阵表示,多个变换可以通过矩阵乘法组合: