矩阵是计算机图形学中最基础也是最必不可少的线性代数知识之一,虽然大多数现代游戏引擎已经造好了空间变换这个轮子,我们在脚本中直接调用相应API即可完成此类操作,但知其然也要知其所以然,所以写下此文,以便学习、总结和记忆。文中若有不正确的地方,还请不吝赐教。
在二维空间中引入矩阵的概念,可以很方便的对二维空间图形进行移动、旋转和缩放操作,理解其涉及的数学原理之后,我们能够方便的将其引入三维空间。
一、首先,我们在不引入矩阵的情况下,考虑如何对二维空间图形进行移动、旋转和缩放操作。
1、移动
以二维空间中的一个三角形△为例(下文皆以△为例)。取△的某个顶点为p(x, y, z),对△进行移动操作后,该顶点变为p’(x’, y’, z’)。p在x、y、z坐标移动的距离分别为Tx、Ty、Tz。(因为在二维空间,所以z、z’、T3皆为0)
得出公式:
x’ = x + T1 y’ = y + T2 z’ = z + T3
也就是说,为了移动△,我们只需要对其每个顶点坐标的分量(x和y)加上△在X轴和Y轴上平移的距离常量即可。
2、旋转
考虑对△进行这样的旋转操作:绕Z轴,逆时针旋转β角度。点p(x, y, z)旋转后变成p'(x’, y’, z’)。取r为p到坐标轴原点的距离,α为X轴与r的夹角角度,α + β则为旋转后X轴与r的夹角角度。
(1) 计算p的坐标:
x = r cosα y = r sinα
(2) 根据上述公式可推导计算出p’的坐标:
x’ = r cos(α + β) y’ = r sin(α + β)
(3) 根据两角和公式得出:
x’ = r (cosα cosβ – sinα sinβ) y’ = r (sinα cosβ + cosα sinβ)
两角和公式为:
sin(a ± b) = sina cosb ± cosa sinb
cos(a ± b) = cosa cosb ± sina sinb
(4) 将(1)中的公式代入得出:
x’ = x cosβ – y sin β y’ = x sinβ + y cos β z’ = z
根据旋转角度β计算出其正弦和余弦,代入(4)中的公式后,即可得出△旋转后各顶点的坐标。如果指定一个负β值,则△的旋转反向。
3、缩放
设△在X轴、Y轴、Z轴方向的缩放因子分别为S1、S2、S3,则:
x’ = S1 × x y’ = S2 × y z’ = S3 × z
缩放操作比较好理解,只要将△各顶点坐标分量分别乘以各坐标轴方向的缩放因子即可。
二、接下来引入矩阵,看看矩阵是如何巧妙转化上述公式的。
开始之前,我们还必须了解矩阵和矢量是如何相乘的,乘法是矩阵变换操作的首要方式。这里使用一个4×4矩阵M和矢量V,计算后得出矢量V’,对应如下等式:(下文皆以M、V、V’为例)
V’(x’, y’, z’, w’) = M[(a, b, c, d), (e, f, g, h), (i, j, k, l), (m, n, o, p)] × V(x, y, z, w)
那么:
x’ = ax + by + cz + dw y’ = ex + fy + gz + hw z’ = ix + jy + kz + lw w’ = mx + ny + oz + pw
也就是说,矩阵和矢量相乘,应将矩阵按行的元素与矢量元素一一对应相乘并计算其和,最后以矩阵各行计算结果为元素,组合得出一个新矢量。
1、变换矩阵:移动
比较下面两个等式:
x’ = x + T1 x’ = ax + by +cz +dw
也就是说,当a = 1, b和c等于0,d = Tx,w = 1时,两个等式的意思是相同的!它们表示某点的x分量在X坐标方向的平移结果,同理可以得出另外两个轴相应的情况。由于需要满足w = w’(w称为齐次坐标,一般取值为1.0,这里不考虑其他情况),所以m,n,o等于0,p = 1。最终可以得出等式:
V’(x’, y’, z’, 1) = M[(1, 0, 0, T1), (0, 1, 0, T2), (0, 0, 1, T3), (0, 0, 0, 1 )] × V(x, y, z, 1)
M即为平移矩阵。
2、变换矩阵:旋转
比较下面两个等式:
x’ = x cosβ – y sinβ x’ = ax + by + cz + dw
要满足上述两等式表示相同的意思,那么a = cosβ,b = -sinβ, c和d等于0。沿此方法最终可以得出:
V’(x’, y’, z’ 1) = M[(cosβ, -sinβ, 0, 0), (sinβ, cosβ, 0, 0), ( 0 , 0 , 1, 0), ( 0 , 0 , 0, 1)] × V(x, y, z, 1)
M即为旋转矩阵。
3、变换矩阵:缩放
比较下面两个等式:
x’ = S1 × x x’ = ax + by + cz + dw
要满足上述两等式表达相同的意思,那么a = S1,b、c和d等于0。沿此方法最终可以得出:
V’(x’, y’, z’, 1) = M[(S1, 0, 0, 0), ( 0, S2, 0, 0), ( 0, 0, S3, 0), ( 0, 0, 0, 1)] × V(x, y, z, 1)
M即为缩放矩阵。
三、总结
从本质上讲,变换矩阵的某一种变换和对应的普通变换使用的是相同的数学原理,只不过在矩阵与矢量的乘法运算过程中,按照一定的运算规则将运算最终转换成了对应的普通运算,但是变换矩阵的真正优势在于可以合并移动、旋转和缩放操作,并将变换一次性作用于目标图形上。
暂无关于此日志的评论。