一般仿射變換
3x3矩陣僅能表達(dá)3D中的線性變換,不能包含平移。經(jīng)過(guò)4x4矩陣的武裝后,現(xiàn)在我們可以構(gòu)造包含平移在內(nèi)的一般仿射變換矩陣了。例如:
(1)繞不通過(guò)原點(diǎn)的軸旋轉(zhuǎn)。
(2)沿不穿過(guò)原點(diǎn)的平面縮放。
(3)沿不穿過(guò)原點(diǎn)的平面鏡像。
(4)向不穿過(guò)原點(diǎn)的平面正交投影。
它們的基本思想是將變換的"中心點(diǎn)"平移到原點(diǎn),接著進(jìn)行線性變換,然后再將"中心點(diǎn)"平移回原來(lái)的位置。開(kāi)始使用平移矩陣T將點(diǎn)P移到原點(diǎn),接著用線性變換矩陣R進(jìn)行線性變換,最終的仿射變換矩陣M等于矩陣的積,即:TRT-1。T-1是平移矩陣,執(zhí)行和T相反的變換。
觀察這種矩陣的一般形式,它非常有趣。讓我們先用 "分塊"形式寫出前面用到的T、R、T-1。

可以看出,仿射變換中增加的平移部分僅僅改變了4x4矩陣的最后一行,并沒(méi)有影響到上面所包含的線性變換的3x3部分。
透視投影
學(xué)習(xí)透視投影最好的方法是將它和平行投影相比較。正交投影也稱作平行投影,因?yàn)橥队熬€都是平行的(投影線是指從原空間中的點(diǎn)到投影點(diǎn)的連線)。正交投影中的平行線如圖9.3所示:

3D中的透視投影仍然是投影到2D平面上,但是投影線不再平行,實(shí)際上,它們相交于一點(diǎn),該點(diǎn)稱作投影中心。如圖9.4所示:

因?yàn)橥队爸行脑谕队捌矫媲懊妫队熬€到達(dá)平面之前已經(jīng)相交,所以投影平面上的圖像是翻轉(zhuǎn)的。當(dāng)物體遠(yuǎn)離投影中心時(shí),正交投影仍保持不變,但透視投影變小了。如圖9.5所示:

圖9.5中,右邊的茶壺離投影平面更遠(yuǎn),所以它的投影比離投影平面較近的那個(gè)茶壺小。這是一種非常重要的視覺(jué)現(xiàn)象,稱作透視縮略。
小孔成像
透視投影在圖形學(xué)中非常重要,因?yàn)樗侨祟愐曈X(jué)系統(tǒng)的模型。實(shí)際上,人類視覺(jué)系統(tǒng)遠(yuǎn)比這復(fù)雜,因?yàn)槲覀冇袃芍谎劬Γ覍?duì)于每只眼睛,投影表面(視網(wǎng)膜)不是一個(gè)平面。所以,讓我們來(lái)看一個(gè)簡(jiǎn)單些的例子----小孔成像。小孔成像系統(tǒng)就是一個(gè)盒子,一側(cè)上有小孔,光線穿過(guò)小孔照射到另一側(cè)的背面,那里就是投影平面。如圖9.6所示:

圖9.6中,盒子左面和右面是透明的,以使你能看見(jiàn)盒子內(nèi)部。注意盒子內(nèi)部的投影是倒著的,這是因?yàn)楣饩€(投影線)已經(jīng)在小孔處(投影中心)相交了。
讓我們探索小孔成像背后的幾何原理。設(shè)想一個(gè)3D坐標(biāo)系,它的原點(diǎn)在投影中心,z軸垂直于投影平面,x和y軸平行于投影平面。如圖9.7所示:

讓我們看看能否計(jì)算出任意點(diǎn)p通過(guò)小孔投影到投影平面上的坐標(biāo)p'。首先,需要知道小孔到投影平面的距離,設(shè)為d。因此,投影平面為z=-d。現(xiàn)在,從另一個(gè)角度來(lái)看問(wèn)題,求出新的y。如圖9.8所示。

由相似三角形得到:

注意小孔成像顛倒了圖像,py和py'的符號(hào)相反。px'的值可通過(guò)類似的方法求得:

所有投影點(diǎn)的z值都是相同的:-d。因此,點(diǎn)p通過(guò)原點(diǎn)向平面z=-d投影的結(jié)果如公式9.11所示:

在實(shí)際應(yīng)用中,負(fù)號(hào)會(huì)帶來(lái)不必要的復(fù)雜性。所以將投影平面移到投影的前面(也就是說(shuō),平面z=d),如圖 9.9所示:

當(dāng)然,這對(duì)于實(shí)際的小孔成像是不可能的。因?yàn)樵O(shè)置小孔的目的就是使光線只能通過(guò)小孔,但在計(jì)算機(jī)數(shù)學(xué)世界中,可以不理會(huì)這些規(guī)定。如你所愿,將投影平面移到投影中心前面,煩人的負(fù)號(hào)消失了,如公式9.12所示:

使用4x4矩陣進(jìn)行透視投影
從4D到3D的變換就意味著除法運(yùn)算,因此我們可以利用4x4階矩陣來(lái)編寫代碼,以實(shí)現(xiàn)透視投影。基本思想是提出一個(gè)關(guān)于p'的公式,其中的x、y、z有公分母,然后構(gòu)造一個(gè)4x4矩陣,使w與這個(gè)公分母相等。這里我們假設(shè)初始點(diǎn)處有w=1。
先對(duì)3D形式表達(dá)的p'公式變形,可以得到:

將4D齊次向量變換到3D時(shí),要用4D向量除以w,反推可知p'的4D形式為:
[x y z z/d]
因此我們需要一個(gè)4x4矩陣,它可接收一個(gè)奇異的齊次向量。該向量的形式為[x, y, z, 1],然后將其變換為上述形式。這樣的矩陣如公式9.13所示:

這樣就得到了一個(gè)4x4投影矩陣,有幾個(gè)需要注意的地方:
(1)乘以這個(gè)矩陣并沒(méi)有進(jìn)行實(shí)際的透視投影變換,它只是計(jì)算出合適的分母。投影實(shí)際發(fā)生在從4D向3D變換時(shí)。
(2)存在多種變換。例如,將投影平面放在z=0處而投影中心在[0, 0, -d],這將導(dǎo)致一個(gè)不同的公式。
(3)這里看起來(lái)比較復(fù)雜,似乎只需要簡(jiǎn)單地除以z,不必勞煩矩陣。那么為什么要使用齊次矩陣呢?第一,4x4矩陣提供了一個(gè)方法將投影表達(dá)為變換,這樣就能和其他變換相連接;第二,使得投影到不平行于坐標(biāo)軸的平面變得可行。實(shí)際上,我們不需要齊次坐標(biāo)做任何運(yùn)算,但4x4矩陣提供了一種簡(jiǎn)潔的方法表達(dá)和操縱投影變換。
(4)實(shí)際的圖形幾何管道中的投影矩陣不像這里導(dǎo)出的那樣,還有許多重要的細(xì)節(jié)需要考慮。如用以上矩陣對(duì)向量進(jìn)行變換后,z值實(shí)際上被舍棄了,而很多圖形系統(tǒng)的z緩沖用到了該值。