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

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