计算机图形学数学基础译自 ScratchaPixel 网站,数学基础部分共八篇,本篇为第三篇,感兴趣的同学可以参考我的 GitBook 镜像。
点-矩阵乘法 Point-Matrix Multiplication
前面提到两个矩阵的行和列需要满足一定条件才可以相乘,如M1为m x p
,M2为p x n
结构。同样在计算机图形学中,我们大部分只处理4 x 4
的矩阵。
一个点(Point)或向量(Vector)是有3个数字的序列,基于这个特性我们可以将其写为1 x 3
的矩阵。点写为矩阵的形式为:
同样地,点或向量写成矩阵形式后,它们同样满足矩阵的乘法,例如一个1 x 3
的矩阵乘以3 x 4
的矩阵:
// multiply coeffs from row 1 with coeffs from column 1
Ptransformed.x = P.x * c00 + P.y * c10 + P.z * c20
// multiply coeffs from row 1 with coeffs from column 2
Ptransformed.y = P.x * c01 + P.y * c11 + P.z * c21
// multiply coeffs from row 1 with coeffs from column 3
Ptransformed.z = P.x * c02 + P.y * c12 + P.z * c22
单位矩阵 The Identity Matrix
单位矩阵(identity/ unit matrix)是一个系数除了对角线为1,其余都为0的方阵。
点P乘以单位矩阵的结果仍是点P。将单位矩阵代入Ptransformed公式可以得到:
// multiplying P by the identity matrix gives P
Ptransformed.x = P.x * 1 + P.y * 0 + P.z * 0 = P.x
Ptransformed.y = P.x * 0 + P.y * 1 + P.z * 0 = P.y
Ptransformed.z = P.x * 0 + P.y * 0 + P.z * 1 = P.z
伸缩矩阵 The Scaling Matrix
通过观察点和单位矩阵的乘法可以得知点P的坐标x,y,z分别与单位矩阵的,
,
相乘。当我们将这3项系数设为大于或小于1时,它们会直接作为乘数改变点P的坐标。前文提到过,对点P的坐标乘以某个实数会按比例调整P的坐标。所以伸缩矩阵(Scale Matrix)可以写为:
,
,
分别表示 伸缩因子(Scaling factors)。
// multiplying P by the identity matrix gives P
Ptransformed.x = P.x * Sx + P.y * 0 + P.z * 0 = P.x * Sx
Ptransformed.y = P.x * 0 + P.y * Sy + P.z * 0 = P.y * Sy
Ptransformed.z = P.x * 0 + P.y * 0 + P.z * Sz = P.z * Sz
举例来说,假设点P的坐标为(1, 2, 3),Sx = 1, Sy = 2, Sz = 3,可以得到调整后的坐标为(1, 4, 9)。
需要注意的是,假如有调节系数为负,对应点P的坐标将会反转。
旋转矩阵 The Rotation Matrix
假设P在3维空间的坐标为(1,0,0),目前先忽略z轴,假设点P在XY组成的平面上。我们的需求是将点
转换到点
即旋转(该操作同样可以使用 偏移(translation) ,但是使用旋转示例将更加简单)。
的坐标为(0, 1, 0)。
可以看到图中P沿z轴逆时针旋转90度,到达。假设现在有一矩阵R。P乘以R可以完成P到
的转换。基于目前所掌握的矩阵乘法可以得到:
前面提到,我们先忽略 即z轴上的坐标。对于从点P到
x轴的坐标由1到0,根据上面的乘法公式可以得出
为0,根据y轴的坐标由0到1,可以得出
为1。目前为止根据得到的值,将R写为:
目前先不要在意和
是如何得到的,稍后会提到,先看下代入R后的公式:
这里使用三角函数将更加便捷,如图
如果将点看作单位圆内一点,通过三角函数可以很方便的计算出x,y的坐标:
当= 0, x = 1,y = 0。当
= 90度或
,x = 0, y = 1。根据观察可以得出x = 0和y = 1可以作为
/
和
/
的值。(官网这段推导比较扯淡,推荐UCB的描述极坐标推导方案)。因此可以得到:
将= 45度代入上面公式可以得出正确的
的坐标。因此,总结来说,对于旋转矩阵R可以记为:
我们知道对于从到
的旋转R是逆时针的转换,下面观察对于从P(0,1,0)到
(1, 0, 0)的顺时针转换R是否成立:
可以得出转换的点是(-1,0,0)而不是(1,0,0),如果我们需要得到(1,0,0),就需要是1。因此R为:
我们知道在XY平面上的点,沿z轴旋转后仍在XY平面上,根据观察由P到Pt的转换,不难发现R中的第三行并不会影响Pt的计算。因此可以得到点或向量沿z轴旋转的转换矩阵为:
同样,对于沿x轴和沿y轴旋转的矩阵为:
组合矩阵 Combining (Rotation) Matrices
之前提到过转换矩阵的乘法相当于组合这些转换。现在已知点或向量按任一轴旋转(Rx, Ry, Rz)的公式,假设有一点先按x轴旋转,在按y轴旋转,我们可以得到:
注意旋转执行的顺序很重要,Rxy与Ryx得出的结果完全不同。
矩阵在笛卡尔坐标中的旋转
假设x轴上有一点坐标为(1,0,0),沿z轴顺时针旋转10度。基于上面的公式,我们可以方便的得出旋转后的点x轴的坐标为cos(-10),y轴的坐标为sin(-10)。同样,对于y轴上有一点
坐标为(0,1,0)经z轴顺时针旋转10度,旋转后的点在x轴上的坐标为-sin(-10),y轴的坐标为cos(-10):
这里的核心观念是理解:矩阵中的每一行代表坐标系的每个坐标轴。理解这点对于后面所学的点或向量坐标系的转换至关重要。
正交矩阵 Orthogonal Matrices
在之前章节提到的矩阵都被称为线性代数中的 正交矩阵(Orthogonal Matrices),一个正交矩阵表示方形矩阵内的行和列都是 单位正交向量(Orthogonal unit vectors)。之前提到矩阵的行代表坐标系的每个轴。假如矩阵是旋转矩阵,或者是几次旋转组合成的矩阵,则矩阵的每行表示每个坐标轴的单位长度(unit length)。正交矩阵有个比较重要的特性是,矩阵的 转置(transpose) 等于矩阵的 逆(inverse),即:
同样可以得到:
表示单位矩阵。