[简化版 GAMES 101] 计算机图形学 07:图形学投影完全推导

简化版 GAMES 101 计算机图形学 07:图形学投影完全推导

  • [Bilibili 同步视频](#Bilibili 同步视频)
  • [0. 前置约定 📌](#0. 前置约定 📌)
  • [一、正交投影 Orthographic Projection](#一、正交投影 Orthographic Projection)
  • [二、透视投影 Perspective Projection](#二、透视投影 Perspective Projection)
    • [2.1 核心思路](#2.1 核心思路)
    • [2.2 挤压规则](#2.2 挤压规则)
    • [2.3 相似三角形推导 XY 变换](#2.3 相似三角形推导 XY 变换)
      • [✍️ 补充:第三行为什么是 0,0,A,B](#✍️ 补充:第三行为什么是 [0,0,A,B])
    • [2.4 解方程求 A、B](#2.4 解方程求 A、B)
    • [2.5 透视→正交矩阵](#2.5 透视→正交矩阵)
    • [2.6 完整透视投影矩阵](#2.6 完整透视投影矩阵)
  • [三、关键结论 💡](#三、关键结论 💡)
  • [四、经典思考题 🤔](#四、经典思考题 🤔)

Bilibili 同步视频

简化版 GAMES 101 计算机图形学 07:图形学投影完全推导

在计算机图形学中,投影变换 是连接 3D 世界与 2D 屏幕的唯一桥梁✨。正交投影(Orthographic)与透视投影(Perspective)是所有渲染、相机、视图系统的底层根基。本文严格依照经典图形学推导,完整复现矩阵由来,不跳步、不省略,带你一次吃透两种投影的数学本质。


0. 前置约定 📌

  • 相机位于原点 (0,0,0)

  • 看向 -Z 方向

  • 向上为 +Y 方向

  • 使用右手坐标系

  • 近平面:n(较大 Z),远平面:f(较小 Z)

    ➡️ n > f


一、正交投影 Orthographic Projection

1.1 直观理解

正交投影 = 相机在无限远处

平行光线射入 → 无近大远小 → 平行线永远平行

适合:工程制图、CAD、蓝图

核心:把一个任意长方体 映射到标准立方体 NDC

1.2 变换两步走

  1. 平移:把长方体中心移到原点

  2. 缩放:把长宽高缩到 -1,1

平移矩阵

c x = f r a c l + r 2 , c y = f r a c b + t 2 , c z = f r a c n + f 2 c_x = frac{l+r}{2}, c_y = frac{b+t}{2}, c_z = frac{n+f}{2} cx=fracl+r2,cy=fracb+t2,cz=fracn+f2
KaTeX parse error: Expected 'EOF', got '&' at position 21: ...egin{bmatrix}1 &̲ 0 & 0 & -c_x ...

缩放矩阵

KaTeX parse error: Expected 'EOF', got '&' at position 32: ...x}frac{2}{r-l} &̲ 0 & 0 & 0 0 &...

正交投影矩阵(最终)

KaTeX parse error: Expected '}', got '&' at position 46: ...x}frac{2}{r-l} &̲ 0 & 0 & -frac{...


二、透视投影 Perspective Projection

2.1 核心思路

透视投影观测空间是 视锥体 Frustum ,直接求矩阵很难 → 拆成两步

  1. 把 Frustum 挤成长方体(Perspective → Ortho)

  2. 做正交投影

2.2 挤压规则

  1. 近平面任意点完全不变

  2. 远平面 Z 不变,仅 XY 收缩

  3. 中心点不变

2.3 相似三角形推导 XY 变换

x ′ = x c d o t f r a c n z , y ′ = y c d o t f r a c n z x' = x cdot frac{n}{z}, y' = y cdot frac{n}{z} x′=xcdotfracnz,y′=ycdotfracnz

齐次坐标同乘 z:
( x , y , z , 1 ) t o ( n x , n y , ? , z ) (x,y,z,1) to (nx, ny, ?, z) (x,y,z,1)to(nx,ny,?,z)

得到矩阵雏形:
KaTeX parse error: Expected 'EOF', got '&' at position 27: ...egin{bmatrix}n &̲ 0 & 0 & 0 0 &...

✍️ 补充:第三行为什么是 0,0,A,B

第三行计算输出深度 z'z' 只和原深度 z 相关,与 x、y 无关,因此前两位必须为 0,只保留 z 与常数项的系数 A、B。

2.4 解方程求 A、B

近平面条件:
A n + B = n 2 A n + B = n^2 An+B=n2

远平面中心点条件:
A f + B = f 2 A f + B = f^2 Af+B=f2

联立解得:
b o x e d A = n + f , q u a d b o x e d B = − n f boxed{A = n+f},quad boxed{B = -n f} boxedA=n+f,quadboxedB=−nf

2.5 透视→正交矩阵

KaTeX parse error: Expected '}', got '&' at position 33: ...egin{bmatrix}n &̲ 0 & 0 & 0 0 &...

2.6 完整透视投影矩阵

b o x e d M p e r s p = M o r t h o c d o t M p 2 o boxed{M_{persp} = M_{ortho} cdot M_{p2o}} boxedMpersp=MorthocdotMp2o


三、关键结论 💡

  1. 正交:无近大远小,仅平移 + 缩放

  2. 透视:有近大远小,先挤压再正交

  3. 右手系下:n > f

  4. 挤压矩阵第三行前两位为 0,因深度与 x、y 无关


四、经典思考题 🤔

视锥体中间点 z=(n+f)/2,挤压后会被推向远平面,这是深度精度与 Z‑fighting 的核心原因。

相关推荐
-西门吹雪1 分钟前
现代C++ 并发编程-学习指南
java·jvm·c++
xyccstudio1 小时前
Three.js 实战 —— 从零构建 3D 原子模型
three.js
aaPIXa6222 小时前
C++ TensorRT Edge-LLM 边缘推理框架:从原理到实战
开发语言·c++·edge
nianniannnn3 小时前
c++复习自存--标准模板库STL
开发语言·c++·windows
努力努力再努力wz3 小时前
【高性能网络库与HTTP Server系列】:基于主从 Reactor 模型实现高性能 C++ 网络库与 HTTP Server
开发语言·网络·数据结构·数据库·c++·网络协议·http
Robot_Nav4 小时前
C++ 面试常问问题汇总:基础语法、面向对象、STL、多线程与设计模式
c++·设计模式·面试
一拳一个呆瓜4 小时前
【STL】iostream 编程:使用插入运算符并控制格式
c++·stl
盐焗鹌鹑蛋4 小时前
【C++】二叉搜索树
c++
哎呦,帅小伙哦4 小时前
C++工程实战: 预处理宏、宏重定义避坑、LOG_TAG业务实践与__COUNTER__深度解析
c++
IVVi0jToe5 小时前
高效C++线程池设计与实现
java·c++·安全