網格模型高級技術(19) 摘要:
一個網格模型中可以包含多個動畫集,在渲染網格時通過動畫控制器可以在各個動畫集之間進行切換,從而可以在渲染網格模型時根據具體情況播放不同的動畫。這里將具有多個骨骼動畫的網格模型稱為"多骨骼動畫網格模型",當然骨骼動畫網格模型也完全可以具有蒙皮信息,下面的示例程序演示了渲染多骨骼動畫網格模型時骨骼動畫之間的切換,骨骼動畫間的切換是通過動畫控制器來完成的。
網格模型高級技術(18) 摘要: cSkinMesh類的實現與cAnimMesh的實現基本相同,區別在以下幾點。
首先是在load_from_xfile()中增加了對網格模型骨骼矩陣的保存,接下來是DrawMeshContainer()的實現,該函數負責當前網格容器中具體網格模型的渲染.
網格模型高級技術(17) 摘要: 蒙皮骨骼動畫網格模型接口是對上一節骨骼動畫網格模型接口的擴展,添加了處理蒙皮信息的功能。
為了在網格模型中包含蒙皮信息,需要進一步擴展D3DXMESHCONTAINER_DERIVEED。
網格模型高級技術(16) 摘要:
Direct3D通過索引頂點混合,擴展了使用多個混合矩陣對頂點進行混合的支持。在索引頂點混合中,混合矩陣被保存在矩陣調色板(可以看成一個矩陣數組)中,使用矩陣索引來引用特定的混合矩陣。矩陣索引使用8位無符號整數表示,由每個頂點提供,因為Direct3D中限定每個頂點最多受到4個混合矩陣的影響,所以每個頂點最多具有4個矩陣索引,每個頂點的矩陣索引被組合成一個DWORD類型的整數存儲和表示。因為每個頂點最多受4個混合矩陣的影響,所以在渲染一個三角形時最多可能需要使用12個混合矩陣,在這種情況下,矩陣調色板中最少需要包含12個混合矩陣。
網格模型高級技術(15) 摘要:
在骨骼動畫網格模型中,骨骼的變動導致軀體網格模型的改變,于是就有了骨骼動畫。網格模型是由一個個頂點構成的,如果任意一個頂點只受一塊骨骼影響,那么網格模型在運動時很容易出現裂縫,特別是在一些結合部位,如肩關節、肘關節等。盡管可以使用縫合技術縮小這些裂痕,但當關節的旋轉比較極端時,例如前臂繞肘關節旋轉120度時,就會在肘關節處出現一個較大的剪缺。這是因為只有一個多邊形跨越在上臂和前臂之間的整個間隙,間隙越大,裂縫就越大,最終的渲染效果也越差。
網格模型高級技術(14) 摘要:
使用cAnimMesh類包含3個步驟,首先在回調函數OnCreateDevice()中創建cAnimMesh類的實例,接著在回調函數
OnFrameRender()中渲染網格模型,最后在回調函數OnDestroy()中釋放網格模型。
網格模型高級技術(13) 摘要:
類cAnimMesh是最關鍵的一個類,所有與骨骼動畫相關的具體實現細節都封裝在該類中,該類還定義了類cAllocateHierarchy的一個對象m_alloc_hierarchy,該對象完成從文件中加載動畫網格模型的骨骼層次結構、動畫數據以及其他用于繪制模型的幾何數據。
網格模型高級技術(12) 摘要:
為了方便加載.x文件中的框架和網格模型數據,Direct3D提供了一個ID3DXAllocateHierarchy接口,該接口中有4個純虛函數:用來創建框架的CreateFrame(),創建網格容器的CreateMeshContainer(),銷毀框架的DestroyFrame(),銷毀網格容器的DestroyMeshContainer()。應用程序會在相應的時機自動調用這些對應的函數,以構建或者銷毀對應的框架或網格模型。
網格模型高級技術(11) 摘要:
骨骼動畫是目前最流行也最復雜的角色動畫,它包含以下幾個重要元素:骨骼、動畫。骨骼動畫思想的起源很簡單,自然界中的大多數動物都擁有一套骨骼,身體的皮毛血肉都依附于骨骼,當骨骼開始運動的時候,依附于對應骨骼的皮毛血肉都隨骨骼一起運動。在三維圖形編程領域,角色的軀體是由網格模型來表示的,網格模型通常由大量三角形圖元組成,而三角形又是由頂點組成的。為了模仿現實世界中角色自身的動作,就需要為角色網格模型添加一套骨骼,同時需要確定哪些頂點依附于哪塊骨骼,這樣當骨骼運動時就能牽引依附骨骼的頂點一起運動,這就是骨骼動畫的基本原理。
網格模型高級技術(10) 摘要:
使用類CDXUTMeshFile進行網格模型的繪制,首先在OnCreateDevice()里創建CDXUTMeshFile對象,接著在
OnFrameRender()里渲染網格模型,最后在OnDestroyDevice()里釋放該對象所申請的資源。
網格模型高級技術(9) 摘要:
使用CDXUTMesh進行網格模型的繪制,首先在OnCreate()函數中創建CDXUTMesh對象,接著在OnFrameRender()中繪制(先繪制不透明的網格,再繪制半透明的網格)。
網格模型高級技術(8) 摘要:
漸變(tweening)網格模型是Direct3D中實現模型動畫最簡單的方式和途徑,它的原理也非常簡單。例如對于場景內的某個網格模型,最初只記錄
t0時刻和t1時刻該網格模型的狀態(即這兩個時刻網格模型中所有頂點的位置),對于t0到t1這段時間內的任意時刻t_current,根據該時刻距離
t0和t1時刻的遠近,實時地分配給這兩個網格模型不同的權重,然后按照這兩個網格模型中頂點的不同位置和它們各自的權重進行插值,計算出
t_current時刻整個網格模型中所有頂點的位置,從而實現動畫效果。
網格模型高級技術(7) 摘要:
增強網格模型是運行鑲嵌技術將原始網格模型的三角形面進行細分,形成更加精細(三角形面更多)的網格模型,這對于逐頂點進行的光照效果會更好。網格模型鑲嵌技術主要用在層次細節場景中當模型距離觀察者較近時,使模型的顯示更精細。
增強網格模型可以通過對原始網格模型進行鑲嵌細分模型得到,Direct3D提供了功能函數D3DXTessellateNPatches()來完成這一工作。該函數根據指定的參數,由顯卡的鑲嵌器(tessellator)對網格模型中的多邊形進行細分,從而使原來的三維物體表面變得更加光滑細致。
網格模型高級技術(6) 摘要: 層次細節網格模型(progress
mesh)是一種特殊的網格模型,它的頂點數據以樹狀形式組織,可以隨意增加或降低模型的復雜程度,從而比普通的網格模型具有更大的靈活性,層次細節網格模型對于層次細節場景的渲染非常理想。當模型距離觀察者較遠時可以降低模型的復雜程度,提高渲染速度。而當模型距離觀察者較近時可以使用復雜的模型,從而提高視覺效果。Direct3D用ID3DXPMesh來表示層次細節網格模型對象,而不是ID3DXMesh。
網格模型高級技術(5) 摘要:
Direct3D對加載到內存中的網格模型提供了優化功能,通過網格模型優化可以明顯提高三維模型的渲染速度,這對渲染速度要求較高的三維圖形程序和游戲具有非常重要的現實意義。
對于程序員而言,對網格模型進行優化是比較簡單的,只需調用接口ID3DXMesh的方法Optimize().
網格模型高級技術(4) 摘要: 為了使一個.x文件產生動畫,必須至少提供一個動畫集,每個動畫集都應具有一個對某個框架的引用。模板
AnimationSet用來定義動畫集。
Animation是一個完全開放的模板,一般情況下,用模板AnimationKey來填充它。
網格模型高級技術(3) 摘要:
通過前面的介紹,可以建立起一個網格模型,但這個網格模型是渾然一體的,而在現實生活中,為了能獨立對一個物體的不同部分進行變換,必須將模型分割成不同的模塊,在.x文件中使用框架(frame)對一個網格模型的不同部分進行組織和管理。框架僅僅是一個外殼,在框架中通常需要包含具體的網格和一個框架變換矩陣,其中框架變換矩陣用于指定該框架包含的部分在整個模型中的初始位置。
網格模型高級技術(2) 摘要: 我們在cube_1.x的基礎上添加材質、法線和紋理,構成cube_2.x。
在光照模型運算時需要用到法向量,法向量分為面法向量和頂點法向量。在基于逐頂點計算的光照模型中,需要使用頂點法向量。通常頂點法向量的計算過程是:先將共享該頂點的幾個面的面法向量相加并除以共享該頂點的面的個數,接著歸一化這個結果。
網格模型高級技術(1) 摘要:
在三維圖形程序設計中,網格模型占有非常重要的地位,而且也是比較復雜的部分,特別是包含動畫和蒙皮信息的網格模型。
.x文件格式最初是為傳統的Direct3D保留模式而設計的,在DirectX
6.0問世后,針對立即模式對它作過一次擴展。要想在Direct3D程序中靈活自如地使用網格模型,應當深入理解.x文件格式。