




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、在上一篇文章中我們討論了透視投影變換的原理,分析了 Ope nGL所使用的透視 投影矩陣的生成方法。正如我們所說,不同的圖形API因為左右手坐標(biāo)系、行向 量列向量矩陣以及變換范圍等等的不同導(dǎo)致了矩陣的差異,可以有幾十個不同的 透視投影矩陣,但它們的原理大同小異。這次我們準(zhǔn)備討論一下 Direct3D (以 下簡稱D3D以及J2ME平臺上的JSR184(M3G (以下簡稱M3G的透視投影矩 陣,主要出于以下幾個目的:(1)我們在寫圖形引擎的時候需要采用不同的圖形 API實現(xiàn),當(dāng)前主要是OpenGL和D3D雖然二者的推導(dǎo)極為相似,但 D3D的自身特點導(dǎo)致了一些地 方仍然需要澄清。(2)Direct
2、XSDK的手冊中有關(guān)于透視投影矩陣的一些說明,但并不詳細(xì),甚至有一些錯誤,從而使初學(xué)者理解起來變得困難, 而這正是本文寫作的目 的。(3)M3G 是J2ME平臺上的3D開發(fā)包,采用了 OpenG!作為底層標(biāo)準(zhǔn)進(jìn)行封裝。它的透視投影矩陣使用 Ope nG啲環(huán)境但又進(jìn)行了簡化,值得一提。本文努力讓讀者清楚地了解D3D與 M3G透視投影矩陣的原理,從而能夠知道它與 OpenG啲一些差別,為構(gòu)建跨 API的圖形引擎打好基礎(chǔ)。需要指出的一點是為 了完全理解本文的內(nèi)容,請讀者先理解上一篇文章 深入探索透視投影變換的 內(nèi)容,因為OpenGL和它們的透視投影矩陣的原理非常相似,因此這里不會像上 一篇文章從基礎(chǔ)
3、知識講起,而是對比它們的差異來推導(dǎo)變換矩陣。我們開始!OpenGl與D3D的基本差異前面提到,不同API的基本差異導(dǎo)致了最終變換矩陣的不同,而導(dǎo)致OpenGL和D3D的透視投影矩陣不同的原因有以下幾個:(1)Ope nGL 默認(rèn)使用右手坐標(biāo)系,而 D3D默認(rèn)使用左手坐標(biāo)系OpenGL riiUjandeci coordinate system D3D lefthanded coordinate system(2)Ope nGL 使用列向量矩陣乘法而 D3D使用行向量矩陣乘法TbcyXfg hzfJk inDHD Row-V ector MultiplicationQpenGL- Column-
4、Vector Miitiplkation(3)OpenGL 的 CVV勺 Z 范圍是-1, 1 , D3D的 CVV勺 Z范圍是0, 1以上這些差異導(dǎo)致了最終OpenGL和D3D的透視投影矩陣的不同。D3D的透視投影矩陣推導(dǎo)我們先來看最最基本的透視關(guān)系圖(上一篇文章開始的時候使用的圖):這里我們考察的是xz平面上的關(guān)系,yz平面上的關(guān)系同理。這里o是相機(jī)位置。 np是近裁剪平面,也是投影平面,N是它到相機(jī)的距離。fp是遠(yuǎn)裁剪平面,F(xiàn) 是它到相機(jī)的位置。p是需要投影的點,p'是投影之后的點。根據(jù)相似三角形 定理,我們有g(shù)po = &qlp'Q則有 匚=乙二楚'=
5、N蘭同理”二X z zzz注意到OpenGL使用右手坐標(biāo)系,因此應(yīng)該使用-N(請參考上一篇文章的這一步) 而D3D使用左手坐標(biāo)系,因此使用N,這是二者的不同點之一。這樣,我們得到 投影之后的點第三個信息點是變換之后的z在投影平面上的位置,也就是 N,它已經(jīng)沒用了, 我們把p'寫成N從而用第三個沒用信息點它來存儲 z (如果讀者對這一點不太了解,請參考上一 篇文章)。接下來我們求出a和b,從而在z方向上構(gòu)建CVV請注意這里是OpenGL 和D3D的另一個不同點,OpenGL勺CVV勺z范圍是-1,1,而D3D的 CVV勺z 范圍是0, 1。也就是說,D3D中在近裁剪平面上的點投影之后的點
6、會處于CVV的z=0平面上,而在遠(yuǎn)裁剪平面上的點投影之后的點會在 CVV勺z=1平面上。這 樣我們的計算方程就是從而我們得到了透視投影矩陣的第一個版本fN000N0000a10bPersp Pr oj =b =-F_NFQ =NNFJfN00yX0N00Z00a1az + bb1°0b< z丿這個時候第三個分量變換到 CVV情形了,CVV勺z范圍是0,1。接下來根據(jù)上 一篇文章所講到的,我們要把前兩個分量變成 CVV青形,CVV勺x和y范圍是-1, 1,如下圖所示:使用線性插值,我們有:right - leftbottom% - (-1)1-(-1)=幾叩(1)top - bo
7、ttom 1 (1)這里left和right是投影平面的左右范圍,top和bottom是投影平面的上下范 圍。xcvv和ycvv是我們需要算出的在 CVV青形中的x和y,也就是我們要計算 出的結(jié)果。但在算出它們之前,我們先把上面的式子寫成:Nx/z 碩林1r =+ right left right left 22Ny/t/z _ botlom _ ycvv 1lop- bottom lop- bottom 22這里有一個需要注意的地方,如果投影平面在 x方向上居中,則_ 碩 二 1_right - left 2那么第一個式子就可以銷掉等號兩邊的 1/2,寫成rigid - left 2同理,如
8、果投影平面在y方向上居中,則第二個式子可以寫成縛/z_兒仰top 一 bottom 2則我們現(xiàn)在分兩種情況討論:(1)投影平面的中心和x-y平面的中心重合(在x和y方向上都居中)(2)一般情況我們分別討論:(1)特殊情況方程top-bottom 2這組是特殊情況,方程比較簡單,但也是使用頻率最高的方式(這是D3DXMatrixPerspectiveLH、D3DXMatrixPerspectiveRH、D3DXMatrixPerspectiveFovLH、D3DXMatrixPerspectiveFovRH 四個方法所使用的情況)。我們導(dǎo)出它:2Nx(right 一 left )z 2Nytop
9、 - bottom )z則我們反推出透視投影矩陣:(2M3r(2Nx、Tf £yT< 2Nr-ln02N0 0n h(right -2Nyj?ivpr(rights left)2冊top - bottom>(top - bottom)z其Vt-bwwaz + baz + b00 1z1L z jI 00b oj其中a =F-N NFF-N而r-l和t-b可以分別看作是投影平面的寬 w和高h(yuǎn)。最后那個矩陣就是D3D的 透視投影矩陣之一。另外呢,如果我們不知道right、left、top以及bottom這幾個參量,也可以根據(jù)視野(FOV- Field Of View )參量來
10、求得。下面是兩 個平面的視野關(guān)系圖:2 鮎 w2二尸-Z2N尿7 =沏才r-l22Nw=_72同理=cot 21 其中蟲7h22N伽、=匚 atU£-b2cot-2其中,兩個fov分別是在X-Z以及y-z平面上的視野。如果只給了一個視野, 可以通過投影平面的寬高比計算出來:waspect _ ratio 二h=w =血 x asp&ct _ rafio或者=aspect _ ratio用一個視野算出w或者h(yuǎn),然后用寬高比算出h或者w0(2) 般情況的方程right left right leftlefi _ J 亠 12 2bottomCVV right + leftrigh
11、t _ left right left2喙top bottomycvvUl lop - bottom top 一 bottom1 十一 top bottom top - bottom22這組方程比較繁瑣,但更具一般性(和Ope nGL一般矩陣的推導(dǎo)一致,這也是D3DXMatrixPerspectiveOffCenterLH 和 D3DXMatrixPerspectiveOffCenterRH 兩 個方法所使用的情況)。我們導(dǎo)出它:1我們繼續(xù)反推出透視投影矩陣:2N% rightright 一 left right - lefi 2Ny/top + bottom top 一 bottom top
12、 一 bottom az-b(right、zright-lefiright-left2防top + bottom ptop 一 bottomtop 一 bottomaz+ b2J2Nr-l2Nt_b b + tb-t0其中F-N , NF b 最后那個矩陣就是D3D的一般透視投影矩陣 好了,目前為止,我們已經(jīng)導(dǎo)出了 D3D的兩個透視投影矩陣。下面我把上一篇導(dǎo) 出的OpenGL的透視投影矩陣寫出來,大家可以拿它和剛剛導(dǎo)出的 D3D的一般性 透視投影矩陣做一個對比。(2Nr-l0227r-l t +&0_ matrix (Ope/i GL)=0t-bt -b000ab0-1o丿其中a *
13、2NFb 如果仔細(xì)觀察,可以發(fā)現(xiàn)二者在元素的布局上是一個轉(zhuǎn)置的關(guān)系, 這個就是由它 們使用的左右手坐標(biāo)系以及使用的行列矩陣的差異造成的。而另外在一些元素的細(xì)節(jié)上也存在著差異,這是由于D3D的CVV勺z范圍不同造成的。可見在原理相 同的情況下,細(xì)微的環(huán)境差異可以造成非常大的變化, 而這就是透視投影矩陣存 在諸多不同版本的原因。一般情況的透視投影矩陣也可以使用視野方式來定義, 方法和特殊情況相同。M3G勺透視投影矩陣M3G是對OpenG進(jìn)行的一個封裝,它的透視投影變換矩陣被放到了類 Camera里 面。因為它封裝了 OpenGL因此環(huán)境和OpenGl相同:右手坐標(biāo)系、列向量乘法、 CVV范圍-1,
14、1。它唯一和OpenGL有些差異的地方就在于它只使用投影平面 的中心和x-y平面的中心重合(在x和y方向上都居中)的情況(就是我們上面 D3D的第一種特殊情況)。我們用 Ope nG透視投影矩陣最終版本來說明(再次 提醒,如果讀者對此感到迷惑,請參考第一篇文章):(2Nr-l02Nr-l t +b0prqj _ matrix (Open GL)0t-bt-b000abt o0-1其中F + Ma =F7 , 2NF D 上面是OpenGL透視投影矩陣的最終版本,也是一般性版本,我們要把它變成特 殊性,版本,非常簡單,和上面D3D的特殊情況一樣,我們從對x和y進(jìn)行插值 的那一步來看:-吆-*一1)尸 _1_ (_1)f b1 1)r-l r-l 22% b _y !.t-b t-b 2 +2和D3D的第一種情況一樣,銷掉兩邊
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年藥物經(jīng)濟(jì)評估試題及答案
- 二手車評估領(lǐng)域的新技術(shù)試題及答案
- 科技在食品檢驗中的應(yīng)用趨勢試題及答案
- 食品檢驗中的統(tǒng)計學(xué)應(yīng)用試題及答案
- 第1講 運(yùn)動的描述-2026版大一輪高考物理復(fù)習(xí)
- 預(yù)算與評估的一致性分析試題及答案
- 教師述職報告會議
- 小學(xué)語文習(xí)得策略及試題設(shè)計
- 汽車維修工車主使用注意事項試題及答案
- 2024年統(tǒng)計學(xué)考試技巧與注意事項試題及答案
- 中西文化差異圖解PPT
- 2022年應(yīng)急救援安全應(yīng)知應(yīng)會考試題庫(500題)
- GB/T 8162-2018結(jié)構(gòu)用無縫鋼管
- GB/T 39712-2020快速施工用海工硫鋁酸鹽水泥
- GB/T 23319.2-2009紡織品洗滌后扭斜的測定第2部分:機(jī)織物和針織物
- GB/T 22294-2008糧油檢驗大米膠稠度的測定
- GB 5009.44-2016食品安全國家標(biāo)準(zhǔn)食品中氯化物的測定
- 設(shè)備供應(yīng)售后維修服務(wù)方案
- 10556 交通運(yùn)輸安全工程 自考考試大綱
- 懸臂吊技術(shù)方案
- 報聯(lián)商——有效溝通PPT通用課件
評論
0/150
提交評論