前提:一個圖在直角坐標系上的所有點,都是從原點(0, 0, 0)開始。
以二維為例,所有的矩陣變換,都可以表示成 x` = ax + by, y` = cx + dy. 這種表示方法的原理和背后的意義,見
縮放矩陣 的推導
如圖所示,所謂縮放,即一個圖上的所有點的x和y值,都乘以縮放系數S。縮放0.5,其實就是x值變成0.5x,y變成0.5y,寫成
對比 x` = ax + by, y` = cx + dy. 可知 a = s,b = 0, c = s,d = 0. 可推出縮放矩陣的變換為
旋轉矩陣 的推導
如圖所示,點P繞着原點(0, 0)旋轉θ
x` = c - d
y` = a + b
a = sinθ·x
b = cosθ·y
c = cosθ·x
d = -sinθ·y
x` = cosθ·x - sinθ·y
y` = sinθ·x + cosθ·y
對比 x` = ax + by, y` = cx + dy. 可得旋轉矩陣為
平移矩陣 的推導
如圖所示,所謂平移矩陣,即在x方向上移動了tx,在y方向上移動了ty
可是,由於平移矩陣並不能表示成 x` = ax + by, y` = cx + dy.的形式
於是我們在原來的維度上“強行”加多一維,用三維來表示二維
這樣,原來的表示方法依然成立:
x` = ax + by + ez
y` = cx + dy + fy
z` = gx + hy + iz
那么在二維空間中,z值 是多少?
我們認為,對於一個點而言,z值是1;對於向量而言,z值是0,表示一個點沒有產生相對位移。
好了,現在拿平移矩陣代入這個形式中,
x` = x + tx = ax + by + ez(z=1),可知 a = 1, b = 0, e = tx
y` = y + ty = y` = cx + dy + fz(z=1),可知 c = 0, d = 1, f = ty
z` = 1 = gx + hy + iz(z=1),可知 g = 0,h = 0, i = 1
從而得到平移矩陣的變換為
切變矩陣 的推導
如圖所示,所謂切變矩陣,即一個圖形上的某些點在x方向上發生了偏移,偏移的大小跟y有關,y越大偏移越大,即
x` = x + ?y
y` = y
再仔細分析,發現偏移值跟y的百分比有關,y為0時沒有偏移也就是,在中間y=0.5c時偏移0.5b,在最高點y=1c時偏移1b,可知 x的偏移量等於y/b*c,即
x` = x + (b/c)y
這里有2個變量b和c,我們可以減少其中一個變量的影響,即把c歸一化(b和c同時除以c),比如c是100,除以100等於1,那么b也除以100,把b/c看成a/1
注意:這里的a是紅線等於1時的值,如果紅線等於其他值n,要除以n才能得到a
在齊次坐標中,點的齊次值w = 1,向量的齊次值w = 2,並且點和向量的關系為:
向量 + 向量,向量 - 向量 = 向量 (表示合並向量)齊次值w:0 + 0 = 0
點 - 點 = 向量 (表示兩點間的距離和方向)齊次值w:1 - 1 = 0
點 + 向量 = 點 (表示一個點經過一個距離和方向后的新點)齊次值w:1 + 0 = 1
點 + 點 = 點 (表示取兩個點的中心點)齊次值w:1 + 1 = 2,x、y、z、w同時除以2, = 1