摘要: 為了方便加載.x文件中的框架和網(wǎng)格模型數(shù)據(jù),Direct3D提供了一個(gè)ID3DXAllocateHierarchy接口,該接口中有4個(gè)純虛函數(shù):用來(lái)創(chuàng)建框架的CreateFrame(),創(chuàng)建網(wǎng)格容器的CreateMeshContainer(),銷毀框架的DestroyFrame(),銷毀網(wǎng)格容器的DestroyMeshContainer()。應(yīng)用程序會(huì)在相應(yīng)的時(shí)機(jī)自動(dòng)調(diào)用這些對(duì)應(yīng)的函數(shù),以構(gòu)建或者銷毀對(duì)應(yīng)的框架或網(wǎng)格模型。
閱讀全文
摘要: 骨骼動(dòng)畫(huà)是目前最流行也最復(fù)雜的角色動(dòng)畫(huà),它包含以下幾個(gè)重要元素:骨骼、動(dòng)畫(huà)。骨骼動(dòng)畫(huà)思想的起源很簡(jiǎn)單,自然界中的大多數(shù)動(dòng)物都擁有一套骨骼,身體的皮毛血肉都依附于骨骼,當(dāng)骨骼開(kāi)始運(yùn)動(dòng)的時(shí)候,依附于對(duì)應(yīng)骨骼的皮毛血肉都隨骨骼一起運(yùn)動(dòng)。在三維圖形編程領(lǐng)域,角色的軀體是由網(wǎng)格模型來(lái)表示的,網(wǎng)格模型通常由大量三角形圖元組成,而三角形又是由頂點(diǎn)組成的。為了模仿現(xiàn)實(shí)世界中角色自身的動(dòng)作,就需要為角色網(wǎng)格模型添加一套骨骼,同時(shí)需要確定哪些頂點(diǎn)依附于哪塊骨骼,這樣當(dāng)骨骼運(yùn)動(dòng)時(shí)就能牽引依附骨骼的頂點(diǎn)一起運(yùn)動(dòng),這就是骨骼動(dòng)畫(huà)的基本原理。
閱讀全文
In order to understand "delete this" :
First Step------dive into "delete p"
delete p 執(zhí)行了哪兩個(gè)步驟?
delete p 是一個(gè)兩步的過(guò)程:調(diào)用析構(gòu)函數(shù),然后釋放內(nèi)存。delete p產(chǎn)生的代碼看上去是這樣的(假設(shè)是Fred*類型的):
// 原始碼:delete p;
if (p != NULL)
{
p->~Fred();
operator delete(p);
}
p->~Fred() 語(yǔ)句調(diào)用 p 指向的Fred 對(duì)象的析構(gòu)函數(shù)。
operator delete(p) 語(yǔ)句調(diào)用內(nèi)存釋放原語(yǔ) void operator delete(void* p)。
Second Step-------"delete this"
成員函數(shù)調(diào)用delete this合法嗎?
只要你小心,一個(gè)對(duì)象請(qǐng)求自殺(delete this),是可以的。
以下是我對(duì)“小心”的定義:
你必須100%的確定,this對(duì)象是用 new分配的(不是用new[],也不是用定位放置 new,也不是一個(gè)棧上的局部對(duì)象,也不是全局的,也不是另一個(gè)對(duì)象的成員,而是明白的普通的new)。
你必須100%的確定,該成員函數(shù)是this對(duì)象最后調(diào)用的的成員函數(shù)。
你必須100%的確定,剩下的成員函數(shù)(delete this之后的)不接觸到 this對(duì)象任何一塊(包括調(diào)用任何其他成員函數(shù)或訪問(wèn)任何數(shù)據(jù)成員)。
你必須 100%的確定,在delete this之后不再去訪問(wèn)this指針。換句話說(shuō),你不能去檢查它,將它和其他指針比較,和 NULL比較,打印它,轉(zhuǎn)換它,對(duì)它做任何事。
自然,對(duì)于這種情況還要習(xí)慣性地告誡:當(dāng)你的指針是一個(gè)指向基類類型的指針,而沒(méi)有虛析構(gòu)函數(shù)時(shí)(也不可以 delete this)。
注意:因?yàn)槭窃陬惓蓡T函數(shù)里面delete this的,所以在此語(yǔ)句以后,不能訪問(wèn)任何的成員變量及虛函數(shù),否則一定非法。
摘要: 使用類CDXUTMeshFile進(jìn)行網(wǎng)格模型的繪制,首先在OnCreateDevice()里創(chuàng)建CDXUTMeshFile對(duì)象,接著在OnFrameRender()里渲染網(wǎng)格模型,最后在OnDestroyDevice()里釋放該對(duì)象所申請(qǐng)的資源。
閱讀全文
摘要: 使用CDXUTMesh進(jìn)行網(wǎng)格模型的繪制,首先在OnCreate()函數(shù)中創(chuàng)建CDXUTMesh對(duì)象,接著在OnFrameRender()中繪制(先繪制不透明的網(wǎng)格,再繪制半透明的網(wǎng)格)。
閱讀全文
摘要: 類CDXUTMeshFile位于DXUTMesh.h和DXUTMesh.cpp中,繼承自類CDXUTMeshFrame,其實(shí)類 CDXUTMeshFrame本身只完成一些基礎(chǔ)操作,不是最終使用的一個(gè)類,CDXUTMeshFile在CDXUTMeshFrame的基礎(chǔ)上將各種操作進(jìn)一步封裝。
在.x網(wǎng)格模型中使用框架的主要目的是實(shí)現(xiàn)模型自身包含的動(dòng)畫(huà),而CDXUTMeshFile和CDXUTMeshFrame雖然考慮了網(wǎng)格模型的層次框架,可是并沒(méi)有實(shí)現(xiàn)對(duì)網(wǎng)格模型動(dòng)畫(huà)的播放,所以通常不直接使用這兩個(gè)類,因?yàn)閷?duì)于不包含動(dòng)畫(huà)信息的靜態(tài)網(wǎng)格模型CDXUTMesh類就已經(jīng)足夠了。當(dāng)然也完全可以像使用CDXUTMesh類一樣使用CDXUTMeshFile類來(lái)操作不包含動(dòng)畫(huà)信息的網(wǎng)格模型。
閱讀全文
摘要: 類CDXUTMeshFrame封裝了CDXUTMesh,與CDXUTMesh不同的是,類CDXUTMeshFrame可以包含框架層次結(jié)構(gòu),適用于更復(fù)雜的網(wǎng)格模型,框架層次正是骨骼動(dòng)畫(huà)所必須的。
閱讀全文
摘要: 類CDXUTMesh主要用于從一個(gè)指定的網(wǎng)格模型中加載數(shù)據(jù)、渲染模型以及銷毀網(wǎng)格模型,它將整個(gè)網(wǎng)格模型作為一個(gè)整體進(jìn)行操作,沒(méi)有考慮網(wǎng)格模型內(nèi)部的框架層次,對(duì)于不包含動(dòng)畫(huà)信息的網(wǎng)格模型,使用該類是一個(gè)比較好的選擇。
閱讀全文
摘要: 最后一類是渲染函數(shù),類CDXUTMesh重載了兩個(gè)渲染函數(shù)Render(),其作用都是用來(lái)渲染當(dāng)前的網(wǎng)格模型。所不同的是,第一個(gè)函數(shù)用在固定函數(shù)流水線中,第二個(gè)函數(shù)用在可編程流水線技術(shù)中,這兩個(gè)函數(shù)的最后兩個(gè)參數(shù)用于指定是否渲染網(wǎng)格模型中的不透明和半透明部分。
閱讀全文
摘要: 第三類是設(shè)置渲染選項(xiàng)函數(shù)。其中UseMeshMaterials()函數(shù)用于設(shè)置是否使用網(wǎng)格模型自身的材質(zhì)和紋理進(jìn)行渲染,如果調(diào)用該函數(shù)并將參數(shù) m_bUseMaterials設(shè)置為T(mén)RUE,則在渲染時(shí)使用網(wǎng)格模型自身的材質(zhì)和紋理,這也是默認(rèn)資源,如果將參數(shù)m_bUseMaterials設(shè)置為FALSE,則在渲染時(shí)不使用網(wǎng)格模型自身的材質(zhì)和紋理,自然就使用當(dāng)前為Direct3D設(shè)置的材質(zhì)和紋理渲染網(wǎng)格模型。
閱讀全文