透視投影矩陣推導(dǎo)_第1頁(yè)
透視投影矩陣推導(dǎo)_第2頁(yè)
透視投影矩陣推導(dǎo)_第3頁(yè)
透視投影矩陣推導(dǎo)_第4頁(yè)
透視投影矩陣推導(dǎo)_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、在上一篇文章中我們討論了透視投影變換的原理,分析了OpenGL所使用的透視投影矩陣的生成方法。正如我們所說(shuō),不同的圖形API因?yàn)樽笥沂肿鴺?biāo)系、行向量列向量矩陣以及變換范圍等等的不同導(dǎo)致了矩陣的差異,可以有幾十個(gè)不同的透視投影矩陣,但它們的原理大同小異。這次我們準(zhǔn)備討論一下Direct3D(以下簡(jiǎn)稱D3D)以及J2ME平臺(tái)上的JSR184(M3G)(以下簡(jiǎn)稱M3G)的透視投影矩陣,主要出于以下幾個(gè)目的:(1)       我們?cè)趯?xiě)圖形引擎的時(shí)候需要采用不同的圖形API實(shí)現(xiàn),當(dāng)前主要是OpenGL和D3D。雖然二者的推導(dǎo)極為相似,但D3D

2、的自身特點(diǎn)導(dǎo)致了一些地方仍然需要澄清。(2)       DirectX SDK的手冊(cè)中有關(guān)于透視投影矩陣的一些說(shuō)明,但并不詳細(xì),甚至有一些錯(cuò)誤,從而使初學(xué)者理解起來(lái)變得困難,而這正是本文寫(xiě)作的目的。(3)       M3G是J2ME平臺(tái)上的3D開(kāi)發(fā)包,采用了OpenGL作為底層標(biāo)準(zhǔn)進(jìn)行封裝。它的透視投影矩陣使用OpenGL的環(huán)境但又進(jìn)行了簡(jiǎn)化,值得一提。本文努力讓讀者清楚地了解D3D與M3G透視投影矩陣的原理,從而能夠知道它與OpenGL的一些差別,為構(gòu)建跨API的圖形引

3、擎打好基礎(chǔ)。需要指出的一點(diǎn)是為了完全理解本文的內(nèi)容,請(qǐng)讀者先理解上一篇文章深入探索透視投影變換的內(nèi)容,因?yàn)镺penGL和它們的透視投影矩陣的原理非常相似,因此這里不會(huì)像上一篇文章從基礎(chǔ)知識(shí)講起,而是對(duì)比它們的差異來(lái)推導(dǎo)變換矩陣。我們開(kāi)始!OpenGL與D3D的基本差異前面提到,不同API的基本差異導(dǎo)致了最終變換矩陣的不同,而導(dǎo)致OpenGL和D3D的透視投影矩陣不同的原因有以下幾個(gè):(1)       OpenGL默認(rèn)使用右手坐標(biāo)系,而D3D 默認(rèn)使用左手坐標(biāo)系。(2)     

4、60; OpenGL使用列向量矩陣乘法而D3D使用行向量矩陣乘法。(3)       OpenGL的CVV的Z范圍是-1, 1,D3D的CVV的Z范圍是0, 1。    以上這些差異導(dǎo)致了最終OpenGL和D3D的透視投影矩陣的不同。D3D的透視投影矩陣推導(dǎo)我們先來(lái)看最最基本的透視關(guān)系圖(上一篇文章開(kāi)始的時(shí)候使用的圖):這里我們考察的是xz平面上的關(guān)系,yz平面上的關(guān)系同理。這里o是相機(jī)位置。np是近裁剪平面,也是投影平面,N是它到相機(jī)的距離。fp是遠(yuǎn)裁剪平面,F(xiàn)是它到相機(jī)的位置。p是需要投影的點(diǎn),p是投

5、影之后的點(diǎn)。根據(jù)相似三角形定理,我們有則有注意到OpenGL使用右手坐標(biāo)系,因此應(yīng)該使用-N(請(qǐng)參考上一篇文章的這一步),而D3D使用左手坐標(biāo)系,因此使用N,這是二者的不同點(diǎn)之一。這樣,我們得到投影之后的點(diǎn)第三個(gè)信息點(diǎn)是變換之后的z在投影平面上的位置,也就是N,它已經(jīng)沒(méi)用了,我們把p寫(xiě)成從而用第三個(gè)沒(méi)用信息點(diǎn)它來(lái)存儲(chǔ)z(如果讀者對(duì)這一點(diǎn)不太了解,請(qǐng)參考上一篇文章)。接下來(lái)我們求出a和b,從而在z方向上構(gòu)建CVV。請(qǐng)注意這里是OpenGL和D3D的另一個(gè)不同點(diǎn),OpenGL的CVV的z范圍是-1, 1,而D3D的CVV的z范圍是0, 1。也就是說(shuō),D3D 中在近裁剪平面上的點(diǎn)投影之后的點(diǎn)會(huì)處于C

6、VV的z=0平面上,而在遠(yuǎn)裁剪平面上的點(diǎn)投影之后的點(diǎn)會(huì)在CVV的z=1平面上。這樣我們的計(jì)算方程就是從而我們得到了透視投影矩陣的第一個(gè)版本即這個(gè)時(shí)候第三個(gè)分量變換到CVV情形了,CVV的z范圍是0,1。接下來(lái)根據(jù)上一篇文章所講到的,我們要把前兩個(gè)分量變成CVV情形,CVV的x和y范圍是-1, 1,如下圖所示:使用線性插值,我們有:這里left和right是投影平面的左右范圍,top和bottom是投影平面的上下范圍。xcvv和ycvv是我們需要算出的在CVV情形中的x和y,也就是我們要計(jì)算出的結(jié)果。但在算出它們之前,我們先把上面的式子寫(xiě)成:這里有一個(gè)需要注意的地方,如果投影平面在x方向上居中,

7、則那么第一個(gè)式子就可以銷掉等號(hào)兩邊的1/2,寫(xiě)成同理,如果投影平面在y方向上居中,則第二個(gè)式子可以寫(xiě)成則我們現(xiàn)在分兩種情況討論:(1)       投影平面的中心和x-y平面的中心重合(在x和y方向上都居中)(2)       一般情況我們分別討論:(1)特殊情況方程這組是特殊情況,方程比較簡(jiǎn)單,但也是使用頻率最高的方式(這是D3DXMatrixPerspectiveLH、D3DXMatrixPerspectiveRH、D3DXMatrixPerspectiveFovLH、D

8、3DXMatrixPerspectiveFovRH四個(gè)方法所使用的情況)。我們導(dǎo)出它:則我們反推出透視投影矩陣:其中而r-l和t-b可以分別看作是投影平面的寬w和高h(yuǎn)。最后那個(gè)矩陣就是D3D的透視投影矩陣之一。另外呢,如果我們不知道right、left、top以及bottom這幾個(gè)參量,也可以根據(jù)視野(FOV Field Of View)參量來(lái)求得。下面是兩個(gè)平面的視野關(guān)系圖:  其中,兩個(gè)fov分別是在x-z以及y-z平面上的視野。如果只給了一個(gè)視野,也可以通過(guò)投影平面的寬高比計(jì)算出來(lái):用一個(gè)視野算出w或者h(yuǎn),然后用寬高比算出h或者w。(2)一般情況的方程這組方程比較繁瑣

9、,但更具一般性(和OpenGL一般矩陣的推導(dǎo)一致,這也是D3DXMatrixPerspectiveOffCenterLH和D3DXMatrixPerspectiveOffCenterRH兩個(gè)方法所使用的情況)。我們導(dǎo)出它:我們繼續(xù)反推出透視投影矩陣:其中最后那個(gè)矩陣就是D3D的一般透視投影矩陣。好了,目前為止,我們已經(jīng)導(dǎo)出了D3D的兩個(gè)透視投影矩陣。下面我把上一篇導(dǎo)出的OpenGL的透視投影矩陣寫(xiě)出來(lái),大家可以拿它和剛剛導(dǎo)出的D3D的一般性透視投影矩陣做一個(gè)對(duì)比。如果仔細(xì)觀察,可以發(fā)現(xiàn)二者在元素的布局上是一個(gè)轉(zhuǎn)置的關(guān)系,這個(gè)就是由它們使用的左右手坐標(biāo)系以及使用的行列矩陣的差異造成的。而另外在一

10、些元素的細(xì)節(jié)上也存在著差異,這是由于D3D的CVV的z范圍不同造成的??梢?jiàn)在原理相同的情況下,細(xì)微的環(huán)境差異可以造成非常大的變化,而這就是透視投影矩陣存在諸多不同版本的原因。一般情況的透視投影矩陣也可以使用視野方式來(lái)定義,方法和特殊情況相同。M3G的透視投影矩陣M3G是對(duì)OpenGL進(jìn)行的一個(gè)封裝,它的透視投影變換矩陣被放到了類Camera里面。因?yàn)樗庋b了OpenGL,因此環(huán)境和OpenGL相同:右手坐標(biāo)系、列向量乘法、CVV范圍-1, 1。它唯一和OpenGL有些差異的地方就在于它只使用投影平面的中心和x-y平面的中心重合(在x和y方向上都居中)的情況(就是我們上面D3D的第一種特殊情況)。我們用OpenGL透視投影矩陣最終版本來(lái)說(shuō)明(再次提醒,如果讀者對(duì)此感到迷惑,請(qǐng)參考第一篇文章):上面是OpenGL透視投影矩陣的最終版本,

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論