Posted on 2008-08-10 22:36
orlando 閱讀(1333)
評(píng)論(1) 編輯 收藏 引用
OpenGL程序員們習(xí)慣于管理變換矩陣的堆棧的概念。雖然DirectX并沒(méi)有一個(gè)像OpenGL所采用的關(guān)于堆棧的內(nèi)置概念,但是D3DX庫(kù)確實(shí)包括一個(gè)叫ID3DXMatrixStack的幫助接口。這個(gè)接口包含基本的堆棧操作,例如通過(guò)Push與Pop以及一些函數(shù)方法,來(lái)幫助構(gòu)建變換。然而與OpenGL不同,你必須明確的將堆棧的內(nèi)容傳遞給SetTransform,因?yàn)樵O(shè)備本身并不維護(hù)一個(gè)堆棧。當(dāng)渲染一個(gè)復(fù)雜物體的時(shí)候,堆棧可以被用來(lái)跟蹤和管理變換狀態(tài)。

假設(shè)知道船只在海中的位置和取向,也知道炮塔相對(duì)于船的位置以及炮管相對(duì)于炮塔的位置。與為每個(gè)物體計(jì)算多個(gè)矩陣然后存儲(chǔ)每個(gè)矩陣相反,可以使用一個(gè)堆棧并按下列的步驟來(lái)渲染整個(gè)船只:
1、使用D3DXCreateMatrixStack創(chuàng)建一個(gè)堆棧接口。
2、為船只的位置計(jì)算矩陣并將該矩陣壓入堆棧。
3、將棧頂設(shè)置為當(dāng)前世界變換并渲染船體。
4、對(duì)棧做Push操作并連接炮塔的相對(duì)變換。
5、將棧頂設(shè)置為當(dāng)前世界變換并渲染炮塔。
6、對(duì)棧做Push操作并連接第一根炮管的相對(duì)變換。
7、將棧頂設(shè)置為當(dāng)前世界變換并渲染第一根炮管。
8、對(duì)棧做Pop操作,這就將炮塔變換置于棧頂。
9、對(duì)棧叫做Push操作并連接第二根炮管的相對(duì)變換。
10、將棧頂設(shè)置為當(dāng)前世界變換并渲染第二根炮管。
11、對(duì)棧做Pop操作,這就將炮塔變換置于棧頂。
12、對(duì)棧做Pop操作,這就將船只變換置于棧頂。
13、以同樣的方式渲染船只的其他部分。