文章目录
该课程是 GAMES 开设的现代计算机图形学课程,系统而全面的介绍:光栅化、几何表示、光的传播理论、动画与模拟。每个方面都从基础原理出发讲解到实际应用,并介绍前沿的理论研究。本文是其 1 至 3 章(概述、线性代数复习、变换)的学习笔记。
一、计算机图形学概述
1. 应用
- 电子游戏 Video Games
- 电影 Movies
- 动画 Animations
- 设计 Design
- 可视化 Visualization
- 虚拟现实 Virtual Reality
- 数字绘画 Digital Illustration
- 模拟 Simulation
- 字体 Typography
2. 技术挑战
- 透视(perspective)、投射(projections)、曲线(curves)、面(surfaces)的数学
- 光(lighting)和影(shading)的物理
- 3D 形体的表达(representing)和操作(operating)
- 动画(animation)和模拟(simulation)
3. 内容
光栅化 Rasterization
- Porject geometry primitives(3D triangles/polygons) onto the screen
- Break projected primitives into fragments(pixels)
- Gold standard in Video Games(Real-time Applications)
曲线 Curves/曲面 Meshes
- How to represent geometry in Computer Graphics
光线追踪 Ray Tracing
- Shoot rays from the camera though each pixel
- Calculate intersection and shading
- Continue to bounce(反射) the rays till they hit light sources
- Gold standard in Animations/Movies(Offline Applications)
动画 Animation/模拟 Simulation
- Key frame Animation
- Mass-spring System
4. 不会涉及的内容
- OpenGL/DirectX/Vulkan 等图形学 API 的使用
- Shaders 的语法
- 3D 建模
- 游戏开发
- 计算机视觉
- 深度学习
5. 其他要求
- pre-reading/reading 材料:见网站
- references:fundamentals of computer graphics(🐯书)
- assignments
- Mostly programming tasks with provided code skeletons and virtual machine image
- Weekly,usually no more than 20 lines of code per week
- Languages:C++
二、线性代数复习
略,提纲如下:
- 向量
- 基本操作:加(addition)、乘(multiplication)
- 点乘:前向/后向判定
- 叉乘:左右关系的判定
- 矩阵
三、变换
1. 为何学习变换?
- Modeling 模型变换
- Viewing 视角变换:3D 到 2D,称为投影
2. 2D 变换:使用矩阵表示变换
矩阵可以表示线性变换。
Scale (Non-Uniform)
\left[\begin{matrix} x’\\y’ \end{matrix}\right] = \left[\begin{matrix} s&0\\0&s \end{matrix}\right]\left[\begin{matrix} x\\y \end{matrix}\right] \tag{1}
Reflection
\left[\begin{matrix} x’\\y’ \end{matrix}\right] = \left[\begin{matrix} -1&0\\0&1 \end{matrix}\right]\left[\begin{matrix} x\\y \end{matrix}\right] \tag{2}
Shear 切变
\left[\begin{matrix} x’\\y’ \end{matrix}\right] = \left[\begin{matrix} 1&a\\0&1 \end{matrix}\right] \left[\begin{matrix} x\\y \end{matrix}\right] \tag{3}
Rotate
忘记时,可以使用 (1,0) 和 (0,1) 点的映射得到
R_{ \theta } =
\left[\begin{matrix}
\cos{\theta}&-\sin{\theta}\\
\sin{\theta}&\cos{\theta}
\end{matrix}\right]
\tag{4}
3. 齐次坐标 Homogeneous coordinates
3.1 Why using homogeneous coordinates?
平移(Translation)是一种简单而且典型的变换,可以使用如下方式表示:
x’ = x + t_x\\y’ = y + t_y \tag{5}
它不能使用简单的矩阵变换得到,而要通过以下形式:
\left[\begin{matrix} x’\\y’ \end{matrix}\right] =
\left[\begin{matrix} a&b\\c&d \end{matrix}\right]
\left[\begin{matrix} x\\y \end{matrix}\right] +
\left[\begin{matrix} t_x\\t_y \end{matrix}\right]
\tag{6}
平移操作不是一种典型的线性变换,但是出于统一的考量,希望使用某种统一的方式能表示多种变换。
3.2 解决方案:齐次坐标
添加第三轴(w-coordinate)
- 2D point = (x, y, 1)^T
- 2D vector = (x, y, 0)^T
\left(\begin{matrix} x’\\y’\\w’ \end{matrix}\right) =
\left(\begin{matrix} 1&0&t_x\\0&1&t_y\\0&0&1 \end{matrix}\right) \cdot
\left(\begin{matrix} x\\y\\1 \end{matrix}\right) =
\left(\begin{matrix} x + t_x\\y + t_y\\1 \end{matrix}\right)
\tag{7}
设计机理
- vector + vector = vector
- point – point = vector
- point + vector = point
- point + point = ?
- vector 的平移不会改变
对点 4,齐次坐标的定义被扩充:
\left(\begin{matrix} x\\y\\w \end{matrix}\right) is the 2D point \left(\begin{matrix} x/w\\y/w\\1 \end{matrix}\right), w \neq 0
于是,在齐次坐标表示下,两点之和两点的中点。
这是一种用空间换表示的做法:
3.3 仿射变换 Affine Transformation
仿射变换 = 线性变换 + 平移;
\left[\begin{matrix} x’\\y’ \end{matrix}\right] =
\left[\begin{matrix} a&b\\c&d \end{matrix}\right] \cdot
\left[\begin{matrix} x\\y \end{matrix}\right] +
\left[\begin{matrix} t_x\\t_y \end{matrix}\right]
\tag{8}
其齐次坐标表示为:
\left[\begin{matrix} x’\\y’\\1 \end{matrix}\right] =
\left[\begin{matrix} a&b&t_x\\c&d&t_y\\0&0&1 \end{matrix}\right] \cdot
\left[\begin{matrix} x\\y\\1 \end{matrix}\right]
\tag{9}
3.4 齐次坐标下的 2D 变换
- Scaling
S(s_x, s_y) =
\left[\begin{matrix}
s_x&0&0 \
0&s_y&0 \
0&0&1
\end{matrix}\right]
\tag{10}
- Rotation
R(\alpha) =
\left[\begin{matrix}
\cos{\alpha}&-\sin{\alpha}&0 \
\sin{\alpha}&\cos{\alpha}&0 \
0&0&1
\end{matrix}\right]
\tag{11}
- Translation
T(t_x, t_y) =
\left[\begin{matrix}
1&0&t_x \
0&1&t_y \
0&0&1
\end{matrix}\right]
\tag{12}
4. 其他变换的表示
4.1 Inverse transform 逆变换
M^{-1}
逆变换在矩阵和几何学的意义上都代表逆。
4.2 变换的合成
将操作的合成变换转换成矩阵乘法链。
- 由于矩阵乘法的顺序很重要,显然变换的顺序也很重要
- 对于仿射变换的序列 A_1 到 A_n,其应用的方式和顺序为:A_n(…A_2(A_1(\vec{x}))) = A_n … A_2 \cdot A_1 \cdot \left(\begin{matrix} x\\y\\1 \end{matrix}\right)
- 矩阵的结合律可以帮助优化运算,比如在编译期预先运算好、或者计算空间
- 运用固定大小的矩阵表示极其复杂的变换
4.3 分解(Decomposing)复杂的变换
通过矩阵的分解将运动进行分解
5. 3D 变换
5.1 3D 齐次坐标
再次使用齐次坐标表示:
- 3D point = (x, y, z, 1)^T
- 3D vector = (x, y, z, 0)^T
In general, (x, y, z, w) (w \neq 0) is the 3D point (x/w, y/w, z/w).
其变换形式为:
\left(\begin{matrix} x’\\y’\\z’ \end{matrix}\right) =
\left(\begin{matrix} a&b&c&t_x\\d&e&f&t_y\\g&h&i&t_z\\0&0&0&1 \end{matrix}\right) \cdot
\left(\begin{matrix} x\\y\\z\\1 \end{matrix}\right)
\tag{13}
在三维空间中,变换向矩阵算法的转换及应用规律一致。