Appearance
第一章: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 开发大门的钥匙!