Graphics’ Dependencies
- Basic mathematics
- Linear algebra, calculus, statistics(线性代数、微积分、统计)
- Basic physics
- Optics, Mechanics(光学、力学)
- Misc
- Signal processing(信号处理)
- Numerical analysis(数值分析)
- And a bit of aesthetics(美学)
Vectors
一个向量通常写做一个字母加一个在其上方从左指向右的箭头,或者是用加粗的字母表示a。也可以用起点和终点加上箭头来表示,AB = B - A,即从点A指向点B,用B点坐标减去A点坐标。向量是由长度和方向组成的,它没有一个绝对的开始位置,如果对向量进行平移实际上他仍然是相等的向量。
一个向量的长度用||a||表示,利用向量的长度我们可以获得单位向量:u = a / ||a||,我们可以用单位向量来表示方向,不关心它的长度。
Vector Addition(向量加法)
分为平行四边形法则和三角形法则,不过殊途同归,计算的结果是一样的。平行四边形法则,对于向量a和向量b我们都可以任意的移动,然后将a和b都进行一定的平移,使得他们围成一个平行四边形,红线就是计算的结果。三角形法则,我们要将向量相加,就将他们首尾相连拼接起来,最后形成的最开始和最后就是计算的结果,这个也同样适用于多个向量相加。
以上是在几何上理解向量相加,在数学上向量相加,就是将他们的坐标给加起来。
cartesian coordinates(笛卡尔坐标)
在坐标系下描述一个向量,我们永远认为这个向量从(0, 0)开始,X是向右的单位向量,Y是向上的单位向量,一个向量是多少,就由几个X加上几个Y来表示,通常它们是互相垂直的单位向量。如上图所示,这样的话,我们就可以直接用A⊤ = (4, 3)来表示这个向量。这里有一点,在图形学,默认向量是一个列向量。在此基础上,计算向量的长度也会很简单,公式如图右下角所示。
Dot(scalar) Product(点积)
点乘的计算如图所示,这里的θ是两个向量之间的夹角。两个向量点乘的结果是一个数字(标量),其实向量的点乘可以方便计算这个θ角。
首先我们来看点乘满足的规律:
也就是说,点乘满足交换律、分配率、结合律。
点乘的计算在坐标系中是很好计算的:
也就是对应的坐标相乘然后加起来。所以,上文提到的计算夹角就十分简单了。
这里,点乘除了方便计算夹角,还可以找到一个向量投影到另一个向量上的向量。
将b投影到a上,就是说假设有一束平行光,垂直于a向量照射过来,那么b向量会投射一个阴影在a向量上,这一段就把他叫做b在a上的投影。
我们知道了b⊥怎么算,另外一个方向也可以知道。这里的减法其实就是加上原来反方向的向量。
在图形学中,我们还可以利用点乘计算两个向量的方向有多接近,以及计算两个向量方向的关系。
如果点乘计算的结果>0,表示方向基本一致,=0表示方向垂直,<0表示方向基本相反。同时,这两个向量越接近,点乘的结果越接近1,越远离,结果越接近-1。
Cross Product(叉积)
叉乘的计算如图所示,这里的Φ是两个向量之间的夹角。两个向量点乘的结果是一个向量,这个结果向量和原来计算的两个向量都要垂直,所以它一定和原来的向量不在一个平面内。这里图中只写了叉乘的大小的计算,方向的计算是如何决定的?这里要用到一个叫做右手定则的东西,有两种形式。第一种是伸出右手的拇指食指中指,会摆成一个垂直的样子;这里介绍另一种,右手螺旋定则。四指的方向表示旋转的方向,也就是从a旋转到b的方向,拇指的方向也就是叉乘得到的结果的方向。
我们在坐标系中看一下叉乘的结果以及满足的规律:
并且我们说对于满足上图左侧结果中的,是一个右手坐标系,在本门课程中都假设是一个右手坐标系,但是在OpenGL或者说其他API中可能是一个左手坐标系,也就是。
对于上图右侧的规律,叉乘是没有交换律的,交换之后叉乘的结果不同。另外,两个向量叉乘得结果是零向量,因为它们之间的夹角为0,所以对应的正弦值算出来的长度为0,不过他依旧是一个向量。
向量的叉乘可以表示成矩阵形式。
在向量中,利用叉乘我们可以判断左和右以及内与外。
例如上图中的左图,我们想知道b向量在a向量的左侧还是右侧,我们利用a叉乘b,如果结果的z是正的,那就说明b在a的左侧(逆时针旋转小于180°可以与另一个向量的方向一致),否则在右侧。
上图中的右图,有一个P点,我们想知道它是不是在三角形的内部。我们可以做叉积,首先是AB和AP的叉积,计算出来AP在AB的左侧,BC叉乘BP得到BP依旧在BC的左侧,最后看CA叉乘CP,得到还是在CA的左侧,所以我们知道P点在三角形的内部。这里三角形三条边的绕向不重要,只要遵循同一个绕的方向,得到结果都是在同一侧即可说明在三角形内部。这一点十分重要,我们后面在给三角形光栅化的时候,就要判断某个像素点是否在三角形内部。如果计算得到的结果是0,在图形学里面,是算作三角形内部还是外部(corner case)是由自己决定。
Orthonormal Coordinate Frames(标准正交坐标系)
Matrices(矩阵)
矩阵就是一堆数,把它变成一个几行几列的结构。
矩阵可以乘一个数,乘一个数很简单,就把矩阵里面每个数都乘这个数就可以。
矩阵最困难最有用的操作是矩阵的乘积,首先,对于给定的两个矩阵,它们得能乘。可以乘的矩阵也就是前一个矩阵的列数等于后一个矩阵的行数。(M × N)(N × P) = (M × P)
矩阵乘法也有一定的规律性质:
- (AB)C = A(BC)
- A(B+C) = AB + AC
- (A + B)C = AC + BC
矩阵的转置也就是将矩阵的行和列互换:
(AB)⊤ = B⊤A⊤
单位矩阵也就是只有对角线上有非零的元素,且都为1,这里的单位矩阵的大小是3×3。如果我们能找到两个矩阵它们相乘的结果是单位矩阵,那么它们互为逆矩阵,简称互逆。逆矩阵的计算和转置的计算的性质很类似。
向量的点乘和叉乘也可以写成矩阵的形式: