矩阵工作原理 How Does Metrix Work

来源:互联网 发布:windows phone 7.8 编辑:程序博客网 时间:2024/06/05 19:21

计算机图形学数学基础译自 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 1Ptransformed.x = P.x * c00 + P.y * c10 + P.z * c20// multiply coeffs from row 1 with coeffs from column 2Ptransformed.y = P.x * c01 + P.y * c11 + P.z * c21// multiply coeffs from row 1 with coeffs from column 3Ptransformed.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 PPtransformed.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 PPtransformed.x = P.x * Sx + P.y * 0 + P.z * 0 = P.x * SxPtransformed.y = P.x * 0 + P.y * Sy + P.z * 0 = P.y * SyPtransformed.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)。

rotation

可以看到图中P沿z轴逆时针旋转90度,到达。假设现在有一矩阵R。P乘以R可以完成P到的转换。基于目前所掌握的矩阵乘法可以得到:

前面提到,我们先忽略 即z轴上的坐标。对于从点P到x轴的坐标由1到0,根据上面的乘法公式可以得出为0,根据y轴的坐标由0到1,可以得出为1。目前为止根据得到的值,将R写为:

目前先不要在意是如何得到的,稍后会提到,先看下代入R后的公式:

这里使用三角函数将更加便捷,如图

rotation

如果将点看作单位圆内一点,通过三角函数可以很方便的计算出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),即:

同样可以得到:

表示单位矩阵。

0 0
原创粉丝点击