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

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