深度探討透視投影坐標(biāo)系

深度探討透視投影坐標(biāo)系

ID:18122853

大?。?1.50 KB

頁(yè)數(shù):10頁(yè)

時(shí)間:2018-09-14

深度探討透視投影坐標(biāo)系_第1頁(yè)
深度探討透視投影坐標(biāo)系_第2頁(yè)
深度探討透視投影坐標(biāo)系_第3頁(yè)
深度探討透視投影坐標(biāo)系_第4頁(yè)
深度探討透視投影坐標(biāo)系_第5頁(yè)
資源描述:

《深度探討透視投影坐標(biāo)系》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)

1、3d圖形程序,就一定會(huì)做坐標(biāo)變換。而談到坐標(biāo)變換,就不得不提起投影變換,因?yàn)樗撬凶儞Q中最不容易弄懂的。但有趣的是,各種關(guān)于透視變換的文檔卻依然是簡(jiǎn)之又簡(jiǎn),甚至還有前后矛盾的地方。看來如此這般光景,想要弄清楚它,非得自己動(dòng)手不可了。所以在下面的文章里,作者嘗試推導(dǎo)一遍這個(gè)難纏的透視變換,然后把它套用到DX和PS2lib的實(shí)例中去。1.一般概念所謂透視投影變換,就是view空間到project空間的帶透視性質(zhì)的坐標(biāo)變換步驟(這兩個(gè)空間的定義可以參考其他文檔和書籍)。我們首先來考慮它應(yīng)該具有那些變換性質(zhì)。很顯然,

2、它至少要保證我們?cè)趘iew空間中所有處于可視范圍內(nèi)的點(diǎn)通過變換之后,統(tǒng)統(tǒng)落在project空間的可視區(qū)域內(nèi)。好極了,我們就從這里著手——先來看看兩個(gè)空間的可視區(qū)域。由于是透視變換,view空間中的可見范圍既是常說的視平截體(viewfrustum)。如圖,(圖1)它就是由前后兩個(gè)截面截成的這個(gè)棱臺(tái)。從view空間的x正半軸看過去是下圖這個(gè)樣子。(圖2)接下來是project空間的可視范圍。這個(gè)空間應(yīng)當(dāng)是處于你所見到的屏幕上。實(shí)際上將屏幕表面視作project空間的xoy平面,再加一條垂直屏幕向里(或向外)的z軸

3、(這取決于你的坐標(biāo)系是左手系還是右手系),這樣就構(gòu)成了我們想要的坐標(biāo)系。好了,現(xiàn)在我們可以用視口(viewport)的大小來描述這個(gè)可視范圍了。比如說全屏幕640*480的分辨率,原點(diǎn)在屏幕中心,那我們得到的可視區(qū)域?yàn)橐粋€(gè)長(zhǎng)方體,它如下圖(a)所示。(圖3)但是,這樣會(huì)帶來一些設(shè)備相關(guān)性而分散我們的注意力,所以不妨先向DirectX文檔學(xué)學(xué),將project空間的可視范圍定義為x∈[-1,1],y∈[-1,1],z∈[0,1]的一個(gè)立方體(上圖b)。這實(shí)際上可看作一個(gè)中間坐標(biāo)系,從這個(gè)坐標(biāo)系到上面我們由視口得出

4、的坐標(biāo)系,只需要對(duì)三個(gè)軸向做一些放縮和平移操作即可。另外,這個(gè)project坐標(biāo)系對(duì)clip操作來說,也是比較方便的。2.推導(dǎo)過程先從project空間的x正半軸看看我們的變換目標(biāo)。(圖4)這個(gè)區(qū)域的上下邊界為y’=±1,而圖2中的上下邊界為y=±z*tan(fov/2),要實(shí)現(xiàn)圖2到圖4的變換,我們有y’=y*cot(fov/2)/z。這下完了,這是一個(gè)非線性變換,怎么用矩陣計(jì)算來完成呢?還好我們有w這個(gè)分量。注意到我們?cè)谧鐾队白儞Q之前所進(jìn)行的兩次坐標(biāo)變換——world變換和view變換,他們只是一系列旋轉(zhuǎn)平

5、移和縮放變換的疊加。仔細(xì)觀察這些變換矩陣,你會(huì)發(fā)現(xiàn)它們其實(shí)不會(huì)影響向量的w分量。換句話說,只要不是故意,一個(gè)w分量等于1的向量,再來到投影變換之前他的w分量仍舊等于1。好的,接下來我們讓w’=w*z,新的w就記錄下了view空間中的z值。同時(shí)在y分量上我們退而求其次,只要做到y(tǒng)’=y*cot(fov/2)。那么,在做完線性變換之后,我們?cè)儆孟蛄康膟除以w,就得到了我們想要的最終的y值。x分量的變換可以如法炮制,只是fov要換一換。事實(shí)上,很多用以生成投影變換矩陣的函數(shù)都使用了aspect這個(gè)參數(shù)。這個(gè)參數(shù)給出了

6、視平截體截面的縱橫比(這個(gè)比值應(yīng)與viewport的縱橫比相等,否則變換結(jié)果會(huì)失真)。如果我們按照慣例,定義aspect=sizeofX/sizeofY。那么我們就可以繼續(xù)使用同一個(gè)fov而給出x分量的變換規(guī)則:x’=x*cot(fov/2)/aspect?,F(xiàn)在只剩下z分量了。我們所渴望的變換應(yīng)將z=Znear變換到z=0,將z=Zfar變換到z=1。這個(gè)很簡(jiǎn)單,但是等等,x,y最后還要除以w,你z怎能例外。既然也要除,那么z=Zfar就不能映射到z=1了。唔,先映射到z=Zfar試試。于是,有z’=Zfar*

7、(z-Znear)/(Zfar–Znear)。接下來,看看z’/z的性質(zhì)。令f(z)=z’/z=Zfar*(z-Znear)/(z*(Zfar–Znear))。則f’(z)=Zfar*Znear/(z^2*(Zfar–Znear)),顯而易見f’(z)>0。所以除了z=0是一個(gè)奇點(diǎn),函數(shù)f(z)是一個(gè)單調(diào)增的函數(shù)。因此,當(dāng)Znear≤z≤Zfar時(shí),f(Znear)≤f(z)≤f(Zfar),即0≤f(z)≤1。至此,我們可以給出投影變換的表達(dá)式了。x’=x*cot(fov/2)/aspecty’=y*cot(

8、fov/2)z’=z*Zfar/(Zfar–Znear)–Zfar*Znear/(Zfar–Znear)w’=z以矩陣表示,則得到變換矩陣如下,cot(fov/2)/aspect0000cot(fov/2)0000Zfar/(Zfar-Znear)100-Zfar*Znear/(Zfar-Znear)0。做完線性變換之后,再進(jìn)行所謂的“歸一化”,即用w分量去除結(jié)果向量。  現(xiàn)在我們考慮

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。