GAMES101课程学习笔记1
前言
这篇文章主要记录GAMES101课程中一些易混淆的概念的理解。自己图形学很多知识都是自学,难免产生很多混淆与错误理解;有些当时理解对了,但随着时间的流逝,知识产生了变形和曲解;这里重新做一些梳理与记录,便于随时回顾;
Overview of Computer Graphics
课程的主要内容涵盖四个part:
- Rasterization;
- Curves and Meshes(Geometry);
- Ray Tracing(Rendering);
- Animation / Simulation(Physics);
计算机图形学(Computer Graphics,后统称CG)与计算机视觉(Computer Vision,后统称CV)的区别在于,CG创建各种模型来 生成 图片,CV从各种图片中来 识别 模型特征;
Review of Linear Algebra(线性代数回顾)
点乘在CG中的应用
针对两个向量来说:
- 计算两个向量的夹角(cos θ \theta θ);
- 计算一个向量在另一个向量的投影(向量或长度);
- 计算两个向量有多近(方向的一致程度);
- 分解一个向量(一个平行于另一个向量,一个垂直于另一个向量);
- 判断两个向量的同向性(点乘大于0还是小于0);
叉乘在CG中的应用
针对两个向量来说:
- 可以判断一个向量在另一个向量的左侧还是右侧(常用于三角形的内外判断);
- 可以用来获取三个互相垂直的向量;
针对一个点和两个向量来说,可以判断该点在两个向量所决定平面的里面还是外面(几何体的内外判断);
矩阵
值得注意的一点是:点乘与叉乘都可以表示成矩阵乘积的形式;
点乘相当于:
d
o
t
(
a
,
b
)
=
(
x
a
,
y
a
,
z
a
)
(
x
b
y
b
z
b
)
=
(
x
a
x
b
,
y
a
y
b
,
z
a
z
b
)
dot(a,b) = (x_a,y_a,z_a)\left(\begin{matrix} x_b\\ y_b\\ z_b \end{matrix}\right) = (x_ax_b,y_ay_b,z_az_b)
dot(a,b)=(xa,ya,za)⎝⎛xbybzb⎠⎞=(xaxb,yayb,zazb)
叉乘相当于:
c
r
o
s
s
(
a
,
b
)
=
(
0
−
z
a
y
a
z
a
0
−
x
a
−
y
a
x
a
0
)
(
x
b
y
b
z
b
)
cross(a,b) = \left(\begin{matrix} 0&-z_a&y_a\\ z_a&0&-x_a\\ -y_a&x_a&0 \end{matrix}\right)\left(\begin{matrix} x_b\\ y_b\\ z_b \end{matrix}\right)
cross(a,b)=⎝⎛0za−ya−za0xaya−xa0⎠⎞⎝⎛xbybzb⎠⎞
Transformation(变换)
Homogeneous Coordinates(齐次坐标系)
齐次坐标系可以认为是独立于笛卡尔坐标系的,另外一个坐标系统;齐次坐标将一个原本是n维的向量用一个n+1维向量来表示,常用于投影几何;
更多可以参考百度百科;
齐次坐标系的用途:
- 既能够用来明确区分向量和点;
- 更易用于进行仿射(线性)几何变换。
在齐次坐标系中:
- 向量表示为 ( x , y , z , 0 ) (x,y,z,0) (x,y,z,0);
- 点表示为 ( x , y , z , 1 ) (x,y,z,1) (x,y,z,1);
- ( x , y , z , w ) (x,y,z,w) (x,y,z,w)与 ( x / w , y / w , z / w , 1 ) (x/w,y/w,z/w,1) (x/w,y/w,z/w,1)在w不为0的情况下等价;
Model、View、Projection Transformation
在实时渲染中,常用到MVP矩阵,即小标题中的Model、View、Projection矩阵;每一部分矩阵变换都含有大量的知识,课程中只介绍了基础部分,应用部分要在实际项目中才能体会到;
Model Matrix:
M矩阵没太多要求,唯一需要注意的是矩阵变换的顺序性,以及一些特殊矩阵的生成,比如Translate、Rotate、Scale、Shear、Mirror、Rotate around axis;
- Rotate矩阵的计算可以用基向量旋转后的向量来组成,顺带帮助理解;
- Rotate around axis矩阵的计算,课程里给了相应的公式;另外一种方法为现将axis旋转到x轴,然后绕x轴旋转相应角度,再从x旋转到axis;
- Rotate transform常常伴随着万向节锁与旋转插值的问题,这个时候就需要用到四元数来帮忙解决;
View Martix:
V矩阵只与相机的位置和转向有关,属于相对容易计算的模块,V矩阵的计算一般先计算Translate、在计算Rotate;即V=RT;
- 对于第一人称视角以及第三人称视角的游戏,都需要自己来计算相应的V矩阵;
- 同样V矩阵计算时也要注意Rotate这一块的问题;
Projection Matrix:
一般P矩阵担任将物体投影到一个平面的任务,计算完后xyz应该都处于一个(-1,1)的NDC空间;
Orthographic Projection(正交投影):正交投影相对简单,先平移再缩放即可,即P=ST;
Perspective Projection(透视投影):透视投影相对较难,但是我们使用的齐次坐标系可以帮我们较为简单的解决这个问题,我们只要借助齐次坐标系统完成了Perspective到Orthographic的转换,后面就能使用正交投影的P矩阵计算即可;课程中介绍了Perspective到Orthographic转换的推导过程;
- OpenGL Projection Matrix给出了OpenGL里面P矩阵的更为完整的推导过程;
- 实际的图形api中在这一块中也有差异,GL的P矩阵输出的Z值范围为(-1,1);DX的P矩阵输出的Z值范围为(0,1),在开启Reverse Z的情况下为(1,0);