深入探索透視投影變換_第1頁
深入探索透視投影變換_第2頁
深入探索透視投影變換_第3頁
深入探索透視投影變換_第4頁
深入探索透視投影變換_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、深化探究透視投影變換-Twinsen 編寫-本人水平有限,疏忽錯誤在所難免,還請各位數(shù)學(xué)高手、編程高手不吝賜教-email:透視投影是3D固定流水線的重要組成局部,是將相機(jī)空間中的點(diǎn)從視錐體 (frustum)變換到規(guī)章觀看體(Canonical View Volume)中,待裁剪完畢后進(jìn)行透視 除法的行為。在算法中它是通過透視矩陣乘法和透視除法兩步完成的。透視投影變換是令許多剛剛進(jìn)入3D圖形領(lǐng)域的開發(fā)人員感到迷惑乃至神奇的一 個圖形技術(shù)。其中的理解困難在于步驟繁瑣,對一些基礎(chǔ)學(xué)問過分依靠,一旦對 它們中的任何地方感到生疏,立即導(dǎo)致理解停止不前。沒錯,主流的3D APIs如OpenGL、D3D

2、確實(shí)把詳細(xì)的透視投影細(xì)節(jié)封裝起來, 比方gluPerspective(.)就可以依據(jù)輸入生成一個透視投影矩陣。而且在大多數(shù)狀況下 不需要了解詳細(xì)的內(nèi)幕算法也可以完成任務(wù)。但是你不覺得,假如想要成為一個 職業(yè)的圖形程序員或嬉戲開發(fā)者,就應(yīng)當(dāng)真正降伏透視投影這個家伙么?我們先 從必需的基礎(chǔ)學(xué)問著手,一步一步深化下去(這些學(xué)問在許多地方可以單獨(dú)找到, 但我從來沒有在同一個地方全部找到,但是你現(xiàn)在找到了)。我們首先介紹兩個必需把握的學(xué)問。有了它們,我們才不至于在理解透視投影變 換的過程中迷失方向(這里會使用到向量幾何、矩陣的局部學(xué)問,假如你對此不 是很熟識,可以參考向量幾何在嬉戲編程中的使用系列文章)

3、。齊次坐標(biāo)表示透視投影變換是在齊次坐標(biāo)下進(jìn)行的,而齊次坐標(biāo)本身就是一個令人迷惑的概 念,這里我們先把它理解清晰。依據(jù)向量幾何在嬉戲編程中的使用6中關(guān)于基的概念。對于一個向量v以及 基 oabc,可以找到一組坐標(biāo)(vl,v2,v3),使得v = vl a + v2 b + v3 c (1)topright = near x tan(fov / 2)top = near x tan(fov/2)left = -rightbottom = -toptop = right / aspectright = top x aspectbottom = -topleft = -right上圖中左邊是在xz平面

4、計(jì)算視錐體,右邊是在yz平面計(jì)算視錐體??梢钥吹阶?邊的第3步top=right/aspect使用了除法(圖形程序員厭煩的東西),而右邊第 3步right = top x aspect使用了乘法,這或許就是為什么圖形APIs采納yz平面的 緣由吧! 到目前為止已經(jīng)完成了對透視投影變換的闡述,我想假如你始終跟著我的思路下 來,應(yīng)當(dāng)能夠?qū)ν敢曂队白儞Q有一個細(xì)節(jié)層次上的熟識。當(dāng)然,很有可能你已經(jīng) 是一個透視投影變換專家,假如是這樣的話,肯定給我寫信,指出我熟識上的不 足,我會特別感謝軟。Bye!而對于一個點(diǎn)p,那么可以找到一組坐標(biāo)(pl,p2,p3),使得p - o = pl a + p2 b +

5、p3 c (2)從上面對向量和點(diǎn)的表達(dá),我們可以看出為了在坐標(biāo)系中表示一個點(diǎn)(如p), 我們把點(diǎn)的位置看作是對這個基的原點(diǎn)。所進(jìn)行的一個位移,即一個向量一一p- o (有的書中把這樣的向量叫做稅置應(yīng)量一一起始于坐標(biāo)原點(diǎn)的特別向量),我們在表達(dá)這個向量的同時用等價的方式表達(dá)出了點(diǎn)P:p = o + pl a + p2 b + p3 c (3)(1)(3)是坐標(biāo)系下表達(dá)一個向量和點(diǎn)的不同表達(dá)方式。這里可以看出,雖然都是 用代數(shù)重量的形式表達(dá)向量和點(diǎn),但表達(dá)一個點(diǎn)比一個向量需要額外的信息。假 如我寫出一個代數(shù)重量表達(dá)(L 4, 7),誰知道它是個向量還是個點(diǎn)!我們現(xiàn)在把(1) (3)寫成矩陣的形式:

6、這里(a,b,c,o)是坐標(biāo)基矩陣,右邊的列向量分別是向量v和點(diǎn)p在基下的坐標(biāo)。 這樣,向量和點(diǎn)在同一個基下就有了不同的表達(dá):3。向量的第4個代數(shù)重量是 0,而3。點(diǎn)的第4個代數(shù)重量是1。像這種這種用4個代數(shù)重量表示3D兒何概 念的方式是一種齊次坐標(biāo)表示。“齊次坐標(biāo)表示是計(jì)算機(jī)圖形學(xué)的重要手段之一,它既能夠用來明確區(qū)分向量和 點(diǎn),同時也更易用于進(jìn)行仿射(線性)幾何變換。 一一F.S. Hill, JR這樣,上面的(1,4, 7)假如寫成(147,0),它就是個向量;假如是(147),它 就是個點(diǎn)。下面是如何在一般坐標(biāo)(Ordinary Coordinate)和齊次坐標(biāo)(HomogeneousC

7、oordinate)之間進(jìn)行轉(zhuǎn)換:從一般坐標(biāo)轉(zhuǎn)換成齊次坐標(biāo)時,假如(x,y,z)是個點(diǎn),那么變?yōu)?x,y,z,l);假如(x,y,z)是個向量,那么變?yōu)?x,y,z,0)從齊次坐標(biāo)轉(zhuǎn)換成一般坐標(biāo)時,假如是(x,y,z),那么知道它是個點(diǎn),變成(x,y,z);假如是(x,y,z,O),那么知道它是個向量,仍舊變成(x,y,z)以上是通過齊次坐標(biāo)來區(qū)分向量和點(diǎn)的方式。從中可以思索得知,對于平移T、 旋轉(zhuǎn)R、縮放S這3個最常見的仿射變換,平移變換只對于點(diǎn)才有意義,由于一 般向量沒有位置概念,只有大小和方向,這可以通過下面的式子清晰地看出:X y Zr T r 1 o o 1 o o 1 o o1 o

8、 o o而旋轉(zhuǎn)和縮放對于向量和點(diǎn)都有意義,你可以用類似上面齊次表示來檢測。從中 可以看出,齊次坐標(biāo)用于仿射變換特別便利。此外,對于一個一般坐標(biāo)的點(diǎn)P=(Px,Py,Pz),有對應(yīng)的一族齊次坐標(biāo)(wPx, wPy, wPz,w),其中W不等于零。比方,P(l, 4, 7)的齊次坐標(biāo)有(1,4,7, 1)、(2,8,14, 2)、(-0.1,-0.4, -0.7, -0.1)等等。因此,假如把一個點(diǎn)從一般坐標(biāo)變成齊次坐 標(biāo),給x,y,z乘上同一個非零數(shù)w,然后增加第4個重量w;假如把一個齊次坐 標(biāo)轉(zhuǎn)換成一般坐標(biāo),把前三個坐標(biāo)同時除以第4個坐標(biāo),然后去掉第4個重量。由于齊次坐標(biāo)使用了 4個重量來表達(dá)

9、3D概念,使得平移變換可以使用矩陣進(jìn)行, 從而如FS Hill, JR所說,仿射(線性)變換的進(jìn)行更加便利。由于圖形硬件已 經(jīng)普遍地支持齊次坐標(biāo)與矩陣乘法,因此更加促進(jìn)了齊次坐標(biāo)使用,使得它好像 成為圖形學(xué)中的一個標(biāo)準(zhǔn)。簡潔的線性插值這是在圖形學(xué)中普遍使用的基本技巧,我們在許多地方都會用到,比方2D位圖 的放大、縮小,Tweening變換,以及我們即將看到的透視投影變換等等?;?思想是:給一個x屬于a, b,找到y(tǒng)屬于c, d,使得x與a的距離比上ab長度 所得到的比例,等于y與c的距離比上cd長度所得到的比例,用數(shù)學(xué)表達(dá)式描 述很簡潔理解:x - a _ y - c b - a d - c

10、這樣,從a到b的每一個點(diǎn)都與c到d上的唯一一個點(diǎn)對應(yīng)。有一個x,就可以 求得一個y。此外,假如X不在a b內(nèi),比方xb,那么得到的y也是符合yd,比例仍舊不變,插值同樣適用。透視投影變換好,有了上面兩個理論學(xué)問,我們開頭分析這次的主角一一透視投影變換。這里 我們選擇OpenGL的透視投影變換進(jìn)行分析,其他的APIs會存在一些差異,但 主體思想是相像的,可以類似地推導(dǎo)。經(jīng)過相機(jī)矩陣的變換,頂點(diǎn)被變換到了相 機(jī)空間。這個時候的多邊形或許會被視錐體裁剪,但在這個不規(guī)章的體中進(jìn)行裁 剪并非那么簡潔的事情,所以經(jīng)過圖形學(xué)前輩們的細(xì)心分析,裁剪被支配到規(guī)章 觀看體(Canonical View Volum

11、e, CVV)中進(jìn)行,CVV是一個正方體,x, y, z的范 圍都是-1, 1,多邊形裁剪就是用這個規(guī)章體完成的。所以,事實(shí)上是透視投影 變換由兩步組成:1)用透視變換矩陣把頂點(diǎn)從視錐體中變換到裁剪空 間的CVV中。2) CVV裁剪完成后進(jìn)行透視燎法(一會進(jìn)行解釋)。我們一步一步來,我們先從一個方向考察投影關(guān)系。eyex上圖是右手坐標(biāo)系中頂點(diǎn)在相機(jī)空間中的情形。設(shè)P(x,z)是經(jīng)過相機(jī)變換之后的 點(diǎn),視錐體由eye眼睛位置,np近裁剪平面,fp遠(yuǎn)裁剪平面組成。 N是眼睛到近裁剪平面的距離,F(xiàn)是眼睛到遠(yuǎn)裁剪平面的距離。投影面可以選擇任何平行于近裁剪平面的平面,這里我們選擇近裁剪平面作為投影平面。

12、設(shè) PXN)是投影之后的點(diǎn),那么有T= -N。通過相像三角形性質(zhì),我們有關(guān)系:同理,有:/ = 7 歲這樣,我們便得到了 P投影后的點(diǎn)Pp,= ( -N 號-N 多-N )從上面可以看出,投影的結(jié)果Z,始終等于-N,在投影面上。實(shí)際上,Z,對于投影 后的F已經(jīng)沒有意義了,這個信息點(diǎn)已經(jīng)沒用了。但對于3D圖形管線來說,為 了便于進(jìn)行后面的片元操作,例如z緩沖消隱算法,有必要把投影之前的z保存 下來,便利后面使用。因此,我們采用這個沒用的信息點(diǎn)存儲z,處理成:p J ( -N 4-N v z )這個形式最大化地使用了3個信息點(diǎn),到達(dá)了最原始的投影變換的目的,但是它 太直白了,有一點(diǎn)蠻干的意味,我感

13、覺我們最終的結(jié)果不應(yīng)當(dāng)是它,你說呢?我 們開頭結(jié)合CVV進(jìn)行思索,把它寫得在數(shù)學(xué)上更優(yōu)雅全都,更易于程序處理。 假入能夠把上面寫成這個形式:那么我們就可以特別便利的用矩陣以及齊次坐標(biāo)理論來表達(dá)投影變換:o o b Oa I-1 一 o N o o N o o o規(guī)范化。留意在把變成哈,看到了齊次坐標(biāo)的使用,這對于你來說已經(jīng)不生疏了吧?這個新的形式不僅 到達(dá)了上面原始投影變換的目的,而且使用了齊次坐標(biāo)理論,使得處理更加法律-Nx/z-Ny/z-(az+b)/z 1/的一步我們是使用齊次坐標(biāo)變一般 坐標(biāo)的規(guī)章完成的。這一步在透視投影過程中稱為透為集法(PerspectiveDivision),這是

14、透視投影變換的第2步,經(jīng)過這一步,就丟棄了原始的z值(得 到了 CVV中對應(yīng)的z值,后面解釋),頂點(diǎn)才算完成了投影。而在這兩步之間(Ny j az+b /的就是CVV裁剪過程,所以裁剪空間使用的是齊次坐標(biāo)/,主要緣由在 于透視除法會損失一些必要的信息(如原始Z,第4個-Z保存的)從而使裁剪變 得更加難以處理,這里我們不爭論CVV裁剪的細(xì)節(jié),只關(guān)注透視投影變換的兩 步。就是我們投影矩陣的第一個版本。你肯定會問為什么要把z寫成 az + b有兩個緣由:1) P的3個代數(shù)重量統(tǒng)一地除以分母-z,易于使用齊 次坐標(biāo)變?yōu)橐话阕鴺?biāo)來完成,使得處理更加全都、 iWj 效。2)后面的CVV是一個x,y,z的范

15、圍都為-1, 1的規(guī) 章體,便于進(jìn)行多邊形裁剪。而我們可以適當(dāng)?shù)倪xaz + b擇系數(shù)a和b,使得z 這個式子在z=-N的時候值為-1,而在z = -F的時候值為1,從而在z 方向上構(gòu)建CVV。接下來我們就求出a和b:F + N F - N-2FN F - N這樣我們就得到了透視投影矩陣的第一個版本: 使用這個版本的透視投影矩陣可以從Z方向上構(gòu)建CVV,但是x和y方向仍舊 沒有限制在-1,1中,我們的透視投影矩陣的下一個版本就要解決這個問題。o o b Oa t1 o N o o N o o o投影矩陣verl為了能在x和y方向把頂點(diǎn)從Frustum情形變成CVV情形,我們開頭對x和y 進(jìn)行處理

16、。先來觀看我們目前得到的最終變換結(jié)果:/ -Nx/z / -Ny/z -(az+b)/z J我們知道-Nx/z的有效范圍是投影平面的左邊界值(記為left)和右邊界值(記-left-leftright - left為 right),即left, right, -Ny / z 那么為bottom, top。而現(xiàn)在我們想把-Nx / z 屬于 left, right映射到 x 屬于-1, 1中,-Ny / z 屬于bottom, top映射到 y 屬于-1, 1中。 你想到了什么?哈,就是我們簡潔的線性插值,你都已經(jīng)把握了!我們解決掉它:x - (-1)1 - M)- bottom y - (-1

17、) z _ top - bottom i - (-i)2Nx / -Z right + left x =right - left right - left2Ny / -ztop - bottomtop + bottomtop - bottom那么我們得到了最終的投影點(diǎn):/2Nx /-zright +left/right -leftright -leftpj =2Ny/-ztop +bottomtop - bottomtop -bottom(az+b)/z下面要做的就是從這個新形式動身反推出下一個版本的透視投影矩陣。留意到 az+b /是z /經(jīng)過透視除法的形式,而P,只變化了 x和y重量的形式

18、, az+b和-z是不變的,那么我們做透視除法的逆處理一一給F每個重量乘上-z,得 到top + bottom+ btop - bottomright + left +zright 一 left而這個結(jié)果又是這么來的:right - leftright - left2Ntop + bottom0 top - bottom top - bottom00TF + N-2FNM就是最終的透視變換矩陣。相機(jī)空間中的頂點(diǎn),假如在視錐體中,那么變換后 就在CVV中。假如在視錐體外,變換后就在CVV外。而CVV本身的規(guī)章性對 于多邊形的裁剪很有利。OpenGL在構(gòu)建透視投影矩陣的時候就使用了 M的形 式。留意到M的最終一行不是(0 0 0 1)而是(0 0-1 0),因此可以看出透視變換不 是一種仿射變換,它是非線性的。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論