Skip to content

第一章:3D 世界的基石 - 坐标系

1.1 三维空间就像你的房间

text
3D 坐标 = (x, y, z)
x → 左右方向(墙到墙)
y → 上下方向(地板到天花板)
z → 前后方向(门口到窗户)

每个 3D 物体都有自己在房间里的位置

1.2 三种重要的坐标系

cpp
// 1. 模型坐标系 - "物体自己的坐标系"
// 就像:椅子在自己的设计图纸上的尺寸
vec3 localPosition = vec3(0, 0, 0);  // 椅子中心点

// 2. 世界坐标系 - "整个房间的坐标系"
// 就像:椅子在房间里的实际位置
vec3 worldPosition = vec3(2, 0, 3);  // 离门口 2 米右,3 米前

// 3. 屏幕坐标系 - "相机照片上的坐标系"
// 就像:从相机看椅子在照片上的位置
vec2 screenPosition = vec2(240, 160); // 像素坐标

第二章:3D 物体的组成 - 网格(Mesh)

2.1 顶点(Vertex) - "物体的骨架点"

text
一个立方体有 8 个顶点(角点)
就像:搭建帐篷的 8 根支柱点

2.2 三角形(Triangle) - "最基本的填充面"

text
为什么用三角形?
- 稳定性:三角形不会变形
- 简单性:GPU 处理起来最快
- 通用性:任何形状都能用三角形拼出来

立方体 = 6 个面 × 2 个三角形 × 3 个顶点 = 36 个顶点

2.3 法线(Normal) - "表面的朝向"

text
法线就像“箭头”,指向表面的外侧
用途:计算光照(朝光的亮,背光的暗)

第三章:让物体动起来 - 变换(Transform)

3.1 三种基本变换

cpp
// 1. 平移 - 移动物体
物体.位置 = vec3(x, y, z);

// 2. 旋转 - 转动物体
物体.旋转 = vec3(x角度, y角度, z角度);

// 3. 缩放 - 放大缩小物体
物体.缩放 = vec3(x比例, y比例, z比例);

3.2 矩阵(Matrix) - "变换的魔法工具"

text
矩阵就像“多功能变换器”:
一个 4x4 矩阵可以同时包含:
- 移动信息
- 旋转信息
- 缩放信息

GPU 用矩阵来高效计算物体的最终位置

第四章:模拟人眼 - 相机(Camera)

4.1 相机就像你的眼睛

cpp
相机.位置 = vec3(0, 1.7, 0);    // 眼睛高度约 1.7 米
相机.目标 = vec3(0, 1.7, 10);   // 看向前方 10 米
相机.上方向 = vec3(0, 1, 0);    // 头朝上(不是倒立)

4.2 两种投影方式

text
1. 透视投影 - “真实世界”
   近大远小,像人眼看到的
   用于:游戏、仿真

2. 正交投影 - “工程图纸”
   远近一样大,没有透视效果
   用于:CAD、UI 界面

第五章:让物体逼真 - 材质(Material)和纹理(Texture)

5.1 材质 - "物体的表面特性"

text
颜色:物体是什么颜色的
反光度:像镜子还是像木头
透明度:像玻璃还是像墙壁
粗糙度:像光滑桌面还是粗糙石头

5.2 纹理 - "物体表面的贴图"

text
纹理就像“墙纸”:
- 把 2D 图片贴到 3D 物体表面
- 让物体有细节图案

例子:
木头纹理 → 让立方体看起来像木箱
砖块纹理 → 让平面看起来像墙壁

第六章:光影魔法 - 光照(Lighting)

6.1 三种基本光源

text
1. 定向光 - “太阳光”
   从无限远平行照射,方向固定

2. 点光源 - “灯泡”
   从某点向所有方向照射,有衰减

3. 聚光灯 - “手电筒”
   从某点向锥形区域照射

6.2 光照计算原理

glsl
// 兰伯特光照模型(最基础的)
光照强度 = max(点积(表面法线, 光线方向), 0.0);

// 实际颜色 = 物体颜色 × (环境光 + 光照强度)
最终颜色 = 基础颜色 × (0.2 + 0.8 × 光照强度);

第七章:GPU 流水线 - 渲染流程

7.1 顶点着色器(Vertex Shader)

text
输入:顶点位置、法线等
工作:坐标变换(本地 → 世界 → 屏幕)
输出:屏幕位置、传递给片段着色器的数据
特点:每个顶点执行一次

7.2 片段着色器(Fragment Shader)

text
输入:从顶点着色器来的数据
工作:计算每个像素的最终颜色
输出:像素颜色值
特点:每个像素执行一次(可能百万次!)

7.3 完整渲染流程

text
1. CPU 准备 3D 数据
2. 顶点着色器处理形状
3. 光栅化把形状变成像素
4. 片段着色器上颜色
5. 显示到屏幕

第八章:让画面流畅 - 动画和帧率

8.1 帧率(FPS)

text
60 FPS = 每秒 60 帧
每帧时间 = 16.7 毫秒

目标:保持稳定帧率,避免卡顿

8.2 动画原理

cpp
// 在每一帧更新物体状态
void 更新帧(float dt) {
  // 更新位置(移动动画)
  立方体.位置.x += 速度 * dt;

  // 更新旋转(旋转动画)
  立方体.旋转.y += 旋转速度 * dt;

  // 重新渲染
  渲染场景();
}

第九章:3D 开发工具链

9.1 图形 API

text
OpenGL - 跨平台,学习友好
Vulkan - 高性能,复杂
DirectX - Windows 平台
Metal - 苹果平台

9.2 游戏引擎 vs 原生开发

text
游戏引擎(Unity/Unreal):
- 优点:快速开发,工具完善
- 缺点:灵活性受限,包体较大

原生开发(OpenGL/Vulkan):
- 优点:完全控制,性能优化空间大
- 缺点:开发复杂,需要自己造轮子

第十章:实际开发流程

10.1 创建一个 3D 立方体的步骤

cpp
1. 定义 8 个顶点坐标
2. 定义 36 个索引(组成 12 个三角形)
3. 创建着色器程序
4. 设置相机和投影矩阵
5. 设置光源方向
6. 在渲染循环中:
   - 清空屏幕
   - 更新变换矩阵
   - 绘制立方体
   - 交换缓冲区

10.2 从简单到复杂的学习路径

text
第 1 步:画一个彩色三角形
第 2 步:画一个带光照的立方体
第 3 步:加载 3D 模型文件
第 4 步:添加纹理贴图
第 5 步:实现复杂光影效果
第 6 步:优化性能

核心概念总结

概念大白话解释重要性
顶点3D 物体的角点🎯 基础
三角形拼出 3D 形状的积木🎯 基础
变换矩阵移动旋转缩放的魔法工具🔑 核心
着色器告诉 GPU 如何画图的食谱🔑 核心
光照让 3D 物体有立体感💡 重要
纹理给物体贴图案的墙纸💡 重要

洲煌总结:3D 开发就像用数字积木搭建虚拟世界。你先用顶点搭出骨架,用三角形填充表面,用矩阵变换来移动旋转,用着色器来上色打光,最后通过相机来“拍照”显示。理解这些基础概念,你就掌握了进入 3D 开发大门的钥匙!

本站总访问