青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當(dāng)自強(qiáng)而不息

網(wǎng)格模型高級(jí)技術(shù)(12)

為了方便加載.x文件中的框架和網(wǎng)格模型數(shù)據(jù),Direct3D提供了一個(gè)ID3DXAllocateHierarchy接口,該接口中有4個(gè)純虛函數(shù):用來(lái)創(chuàng)建框架的CreateFrame(),創(chuàng)建網(wǎng)格容器的CreateMeshContainer(),銷(xiāo)毀框架的DestroyFrame(),銷(xiāo)毀網(wǎng)格容器的DestroyMeshContainer()。應(yīng)用程序會(huì)在相應(yīng)的時(shí)機(jī)自動(dòng)調(diào)用這些對(duì)應(yīng)的函數(shù),以構(gòu)建或者銷(xiāo)毀對(duì)應(yīng)的框架或網(wǎng)格模型。

This interface is implemented by the application to allocate or free frame and mesh container objects. Methods on this are called during loading and destroying frame hierarchies.

Method Description
ID3DXAllocateHierarchy::CreateFrame Requests allocation of a frame object.
ID3DXAllocateHierarchy::CreateMeshContainer Requests allocation of a mesh container object.
ID3DXAllocateHierarchy::DestroyFrame Requests deallocation of a frame object.
ID3DXAllocateHierarchy::DestroyMeshContainer Requests deallocation of a mesh container object.

 

ID3DXAllocateHierarchy::CreateFrame

Requests allocation of a frame object.

HRESULT CreateFrame(
LPCSTR Name,
LPD3DXFRAME * ppNewFrame
);

Parameters

Name
[in] Name of the frame to be created.
ppNewFrame
[out, retval] Returns the created frame object.

Return Values

The return values of this method are implemented by an application programmer. In general, if no error occurs, program the method to return D3D_OK. Otherwise, program the method to return an appropriate error message from D3DERR or D3DXERR, as this will cause D3DXLoadMeshHierarchyFromX to fail also, and return the error.

 

ID3DXAllocateHierarchy::CreateMeshContainer

Requests allocation of a mesh container object.

HRESULT CreateMeshContainer(
LPCSTR Name,
CONST D3DXMESHDATA * pMeshData,
CONST D3DXMATERIAL * pMaterials,
CONST D3DXEFFECTINSTANCE * pEffectInstances,
DWORD NumMaterials,
CONST DWORD * pAdjacency,
LPD3DXSKININFO pSkinInfo,
LPD3DXMESHCONTAINER * ppNewMeshContainer
);

Parameters

Name
[in] Name of the mesh.
pMeshData
[in] Pointer to the mesh data structure.
pMaterials
[in] Array of materials used in the mesh.
pEffectInstances
[in] Array of effect instances used in the mesh. 
NumMaterials
[in] Number of materials in the materials array.
pAdjacency
[in] Adjacency array for the mesh.
pSkinInfo
[in] Pointer to the skin mesh object if skin data is found.
ppNewMeshContainer
[out, retval] Returns the created mesh container.

Return Values

The return values of this method are implemented by an application programmer. In general, if no error occurs, program the method to return D3D_OK. Otherwise, program the method to return an appropriate error message from D3DERR or D3DXERR, as this will cause D3DXLoadMeshHierarchyFromX to fail also, and return the error.

 

ID3DXAllocateHierarchy::DestroyFrame

Requests deallocation of a frame object.

HRESULT DestroyFrame(
LPD3DXFRAME pFrameToFree
);

Parameters

pFrameToFree
[in] Pointer to the frame to be deallocated.

Return Values

The return values of this method are implemented by an application programmer. In general, if no error occurs, program the method to return D3D_OK. Otherwise, program the method to return an appropriate error message from D3DERR or D3DXERR, as this will cause D3DXLoadMeshHierarchyFromX to fail also, and return the error.

 

ID3DXAllocateHierarchy::DestroyMeshContainer

Requests deallocation of a mesh container object.

HRESULT DestroyMeshContainer(
LPD3DXMESHCONTAINER pMeshContainerToFree
);

Parameters

pMeshContainerToFree
[in] Pointer to the mesh container object to be deallocated.

Return Values

The return values of this method are implemented by an application programmer. In general, if no error occurs, program the method to return D3D_OK. Otherwise, program the method to return an appropriate error message from D3DERR or D3DXERR, as this will cause D3DXLoadMeshHierarchyFromX to fail also, and return the error.

 

cAllocateHierarchy類(lèi)繼承自ID3DXAllocateHierarchy接口,在cAllocateHierarchy類(lèi)需要重載這4個(gè)純虛函數(shù)以實(shí)現(xiàn)動(dòng)畫(huà)網(wǎng)格模型數(shù)據(jù)的加載和釋放。

該類(lèi)的定義如下:

class cAllocateHierarchy : public ID3DXAllocateHierarchy
{
private:
HRESULT AllocateName(LPCSTR name, LPSTR* ret_name);
public:
STDMETHOD(CreateFrame)(LPCSTR name, LPD3DXFRAME* ret_frame);
	STDMETHOD(CreateMeshContainer)(LPCSTR name, 
CONST D3DXMESHDATA* mesh_data,
CONST D3DXMATERIAL* xmaterials,
CONST D3DXEFFECTINSTANCE* effect_instances,
DWORD num_materials,
CONST DWORD* adjacency,
LPD3DXSKININFO skin_info,
LPD3DXMESHCONTAINER* ret_mesh_container);
    STDMETHOD(DestroyFrame)(THIS_ LPD3DXFRAME frame_to_free);
STDMETHOD(DestroyMeshContainer)(THIS_ LPD3DXMESHCONTAINER base_mesh_container);
};
 

函數(shù)AllocateFrame()用來(lái)為框架生成一個(gè)名稱(chēng):

HRESULT cAllocateHierarchy::AllocateName(LPCSTR name, LPSTR* ret_name)
{
if(name != NULL)
{
UINT length = (UINT)strlen(name) + 1;
		*ret_name = new CHAR[length];
		if(*ret_name == NULL)
return E_OUTOFMEMORY;
		memcpy(*ret_name, name, length * sizeof(CHAR));
}
else
{
*ret_name = NULL;
}
	return S_OK;
}

 

函數(shù)CreateFrame()的作用在于生成一個(gè)新的擴(kuò)展框架,并按照指定的參數(shù)為該框架命名:

HRESULT cAllocateHierarchy::CreateFrame(LPCSTR name, LPD3DXFRAME* ret_frame)
{
*ret_frame = NULL;
	D3DXFRAME_DERIVED* new_frame = new D3DXFRAME_DERIVED;
	if(new_frame == NULL)
return E_OUTOFMEMORY;
	HRESULT hr = AllocateName(name, &new_frame->Name);
	if(FAILED(hr))
{
delete new_frame;
return hr;
}
	D3DXMatrixIdentity(&new_frame->TransformationMatrix);
D3DXMatrixIdentity(&new_frame->CombinedTransformMatrix);
	new_frame->pMeshContainer   = NULL;
new_frame->pFrameSibling = NULL;
new_frame->pFrameFirstChild = NULL;
	*ret_frame = new_frame;
	return S_OK;
}

 

在一個(gè)框架創(chuàng)建好后,需要?jiǎng)?chuàng)建該框架的網(wǎng)格容器,這通過(guò)函數(shù)CreateMeshContainer()來(lái)實(shí)現(xiàn):

HRESULT cAllocateHierarchy::CreateMeshContainer(LPCSTR name, 
CONST D3DXMESHDATA* mesh_data,
CONST D3DXMATERIAL* xmaterials,
CONST D3DXEFFECTINSTANCE* effect_instances,
DWORD num_materials,
CONST DWORD* adjacency,
LPD3DXSKININFO skin_info,
LPD3DXMESHCONTAINER* ret_mesh_container)
{
*ret_mesh_container = NULL;
	if(mesh_data->Type != D3DXMESHTYPE_MESH)
return E_FAIL;
	ID3DXMesh* mesh_ptr = mesh_data->pMesh;
DWORD fvf = mesh_ptr->GetFVF();
	if(fvf == 0)
return E_FAIL;
	// create a mesh container and zero it
	D3DXMESHCONTAINER_DERIVED* new_mesh_container = new D3DXMESHCONTAINER_DERIVED;
	if(new_mesh_container == NULL)
return E_OUTOFMEMORY;
	memset(new_mesh_container, 0, sizeof(D3DXMESHCONTAINER_DERIVED));
	// copy mesh name
	HRESULT hr = AllocateName(name, &new_mesh_container->Name);
	if(FAILED(hr))
{
DestroyMeshContainer(new_mesh_container);
return hr;
}
	IDirect3DDevice9* device;
mesh_ptr->GetDevice(&device);
	new_mesh_container->MeshData.Type = D3DXMESHTYPE_MESH;
	// be sure mesh contain normal
if(!(fvf & D3DFVF_NORMAL))
{
hr = mesh_ptr->CloneMeshFVF(mesh_ptr->GetOptions(), fvf | D3DFVF_NORMAL, device,
&new_mesh_container->MeshData.pMesh);
		if(FAILED(hr))
{
release_com(device);
DestroyMeshContainer(new_mesh_container);
return hr;
}
		mesh_ptr = new_mesh_container->MeshData.pMesh;
D3DXComputeNormals(mesh_ptr, NULL);
}
else
{
new_mesh_container->MeshData.pMesh = mesh_ptr;
mesh_ptr->AddRef(); // !! important, so DestroyMeshContainer() will not crash.
}
	// load materials and textures
	UINT num_faces = mesh_ptr->GetNumFaces();
	new_mesh_container->NumMaterials = max(1, num_materials);
new_mesh_container->pMaterials = new D3DXMATERIAL[new_mesh_container->NumMaterials];
new_mesh_container->ppTextures = new LPDIRECT3DTEXTURE9[new_mesh_container->NumMaterials];
new_mesh_container->pAdjacency = new DWORD[num_faces * 3];
	if((new_mesh_container->pAdjacency == NULL) || (new_mesh_container->pMaterials == NULL) ||
(new_mesh_container->ppTextures == NULL))
{
release_com(device);
DestroyMeshContainer(new_mesh_container);
return E_OUTOFMEMORY;
}
	memcpy(new_mesh_container->pAdjacency, adjacency, sizeof(DWORD) * num_faces * 3);
memset(new_mesh_container->ppTextures, 0, sizeof(LPDIRECT3DTEXTURE9) * new_mesh_container->NumMaterials);
	D3DXMATERIAL* xmaterials_ptr = new_mesh_container->pMaterials;
	if(num_materials > 0)
{
memcpy(xmaterials_ptr, xmaterials, sizeof(D3DXMATERIAL) * num_materials);
xmaterials_ptr->MatD3D.Ambient = xmaterials_ptr->MatD3D.Diffuse;
		for(UINT i = 0; i < num_materials; i++)
{
if(xmaterials_ptr[i].pTextureFilename != NULL)
{
WCHAR w_texture_path[MAX_PATH];
WCHAR w_filename[MAX_PATH];
				RemovePathFromFileName(xmaterials_ptr[i].pTextureFilename, w_filename);
DXUTFindDXSDKMediaFileCch(w_texture_path, MAX_PATH, w_filename);
				if(FAILED( D3DXCreateTextureFromFileW(device, w_texture_path, &new_mesh_container->ppTextures[i]) ))
new_mesh_container->ppTextures[i] = NULL;
}
}
}
else
{
xmaterials_ptr[0].pTextureFilename = NULL;
memset(&xmaterials_ptr[0].MatD3D, 0, sizeof(D3DMATERIAL9));
		xmaterials_ptr[0].MatD3D.Diffuse.r = 0.5f;
xmaterials_ptr[0].MatD3D.Diffuse.r = 0.5f;
xmaterials_ptr[0].MatD3D.Diffuse.b = 0.5f;
xmaterials_ptr[0].MatD3D.Specular = xmaterials_ptr[0].MatD3D.Diffuse;
xmaterials_ptr[0].MatD3D.Ambient = xmaterials_ptr[0].MatD3D.Diffuse;
}
	release_com(device);
	*ret_mesh_container = new_mesh_container;
	return S_OK;
}

在此實(shí)現(xiàn)的骨骼動(dòng)畫(huà)網(wǎng)格模型中沒(méi)有涉及到蒙皮信息,所以在CreateMeshContainer()函數(shù)中沒(méi)有處理參數(shù)skin_info指向的蒙皮信息。

 

函數(shù)DestroyFrame()只有一個(gè)參數(shù)指向準(zhǔn)備釋放的框架對(duì)象:

HRESULT cAllocateHierarchy::DestroyFrame(LPD3DXFRAME frame_to_free) 
{
SAFE_DELETE_ARRAY(frame_to_free->Name);
SAFE_DELETE(frame_to_free);
	return S_OK;
}

 

函數(shù)DestroyMeshContainer()也只有一個(gè)參數(shù)指向?qū)⒁尫诺木W(wǎng)格容器對(duì)象:

HRESULT cAllocateHierarchy::DestroyMeshContainer(LPD3DXMESHCONTAINER base_mesh_container)
{
if(base_mesh_container == NULL)
return S_OK;
	D3DXMESHCONTAINER_DERIVED* mesh_container = (D3DXMESHCONTAINER_DERIVED*) base_mesh_container;
	SAFE_DELETE_ARRAY(mesh_container->Name);
SAFE_DELETE_ARRAY(mesh_container->pAdjacency);
SAFE_DELETE_ARRAY(mesh_container->pMaterials);
	if(mesh_container->ppTextures != NULL)
{
for(UINT i = 0; i < mesh_container->NumMaterials; i++)
release_com(mesh_container->ppTextures[i]);
}
	SAFE_DELETE_ARRAY(mesh_container->ppTextures);
	SAFE_RELEASE(mesh_container->MeshData.pMesh);
SAFE_RELEASE(mesh_container->pSkinInfo);
	SAFE_DELETE(mesh_container);
	return S_OK;
}

posted on 2008-06-11 14:56 lovedday 閱讀(2195) 評(píng)論(3)  編輯 收藏 引用

評(píng)論

# re: 網(wǎng)格模型高級(jí)技術(shù)(12) 2010-04-04 11:58 chuckey

誰(shuí)寫(xiě)的這種文章,也太無(wú)聊了,全就抄了一下.  回復(fù)  更多評(píng)論   

# re: 網(wǎng)格模型高級(jí)技術(shù)(12) 2010-07-14 14:52 騾子寶

博主能出來(lái)解釋一下嗎?看得云里霧里的。
FRAME是每個(gè)骨骼創(chuàng)建一個(gè)FRAME嗎?每個(gè)FRMAE都創(chuàng)建一個(gè)CONTAINER嗎?  回復(fù)  更多評(píng)論   

# re: 網(wǎng)格模型高級(jí)技術(shù)(12) 2011-05-22 13:04

看看  回復(fù)  更多評(píng)論   


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(lèi)(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲黄色性网站| 亚洲一区二区精品在线| 中文网丁香综合网| 一本色道久久综合亚洲精品小说| 亚洲激情另类| 日韩一级免费| 亚洲欧美春色| 欧美在线观看天堂一区二区三区 | 欧美精选午夜久久久乱码6080| 欧美自拍偷拍午夜视频| 久久久久久久999精品视频| 久久伊伊香蕉| 欧美不卡视频| 国产精品久久久久永久免费观看| 国产精品自在线| 狠狠色噜噜狠狠狠狠色吗综合| 在线观看一区视频| 一级成人国产| 欧美专区亚洲专区| 欧美激情一区二区在线| 亚洲麻豆av| 欧美在线视频一区二区三区| 久久综合九色99| 欧美三级资源在线| 激情视频亚洲| 亚洲综合第一| 欧美韩日高清| 亚久久调教视频| 久久精品女人| 国产精品日韩欧美一区| 欧美午夜精品久久久久久久| 国产精品久久久久一区二区三区共| 国产视频在线观看一区| 99re6热只有精品免费观看| 欧美在线视频在线播放完整版免费观看| 美国十次成人| 亚洲影院在线| 欧美日韩一区不卡| 亚洲国产小视频| 久久免费国产精品1| 一本色道久久| 欧美bbbxxxxx| 伊人久久大香线蕉av超碰演员| 在线综合亚洲| 亚洲黄色尤物视频| 久久精品国产99精品国产亚洲性色| 欧美色视频在线| 99国产精品99久久久久久粉嫩| 久久亚洲欧洲| 亚洲国产电影| 欧美亚洲综合另类| 亚洲免费观看高清在线观看 | 欧美激情综合色| 影音先锋日韩资源| 久久久久久噜噜噜久久久精品| 宅男噜噜噜66一区二区66| 欧美电影免费观看大全| 亚洲大胆人体视频| 欧美大片在线影院| 巨乳诱惑日韩免费av| 韩国成人精品a∨在线观看| 久久国产福利| 久久av最新网址| 精品成人一区二区三区| 免费观看国产成人| 女生裸体视频一区二区三区| 亚洲国产精品999| 欧美/亚洲一区| 午夜激情综合网| 亚洲视频网站在线观看| 欧美伊人久久久久久久久影院 | 久久精品网址| 欧美一区二区三区另类 | 蜜臀av性久久久久蜜臀aⅴ| 欧美在线免费视频| 亚洲国产精品久久久久婷婷884| 久久综合网hezyo| 久热精品视频在线| 日韩视频欧美视频| 一区二区激情小说| 国产亚洲一级高清| 亚洲国产精品欧美一二99| 欧美日韩视频在线观看一区二区三区| 一本色道久久综合狠狠躁篇怎么玩| 亚洲精品免费在线| 国产嫩草一区二区三区在线观看| 久久久噜噜噜久噜久久| 欧美黄色一区二区| 欧美一区二区三区四区高清| 久久精品夜色噜噜亚洲a∨ | 亚洲美女少妇无套啪啪呻吟| 日韩视频在线一区| 国产一区99| 亚洲区欧美区| 国产亚洲欧美aaaa| 亚洲欧洲在线播放| 国产精品久久久久久亚洲调教| 久久久另类综合| 欧美日韩精选| 久久只有精品| 国产精品成人一区二区艾草| 久久激情一区| 欧美激情 亚洲a∨综合| 欧美日本国产| 久久久久久久久综合| 欧美精品在线极品| 男人的天堂成人在线| 国产精品久久久久影院亚瑟| 欧美黄网免费在线观看| 国产精品人人做人人爽 | 日韩天堂在线观看| 狠狠久久五月精品中文字幕| 日韩视频精品在线观看| 香港久久久电影| 亚洲午夜羞羞片| 亚洲高清av在线| 亚洲性色视频| aⅴ色国产欧美| 久久五月激情| 久久xxxx精品视频| 欧美深夜福利| 亚洲精品免费一区二区三区| 国语自产精品视频在线看一大j8| 日韩视频二区| 最新国产成人在线观看 | 久久激情五月婷婷| 亚洲综合三区| 欧美日韩免费观看一区三区| 欧美国产激情二区三区| 狠狠色综合一区二区| 亚洲午夜女主播在线直播| 亚洲精品久久久久久久久久久久久| 欧美一级理论片| 欧美伊久线香蕉线新在线| 国产精品午夜av在线| 亚洲天堂视频在线观看| 亚洲欧美视频在线| 国产精品区一区二区三区| 亚洲桃花岛网站| 香蕉av福利精品导航| 国产精品萝li| 小黄鸭视频精品导航| 欧美亚洲一区三区| 国产一区二区无遮挡| 久久国产日本精品| 欧美国产乱视频| 日韩视频精品| 欧美图区在线视频| 亚洲在线视频免费观看| 性伦欧美刺激片在线观看| 国产欧美日韩免费| 久久精品五月| 亚洲国产精品精华液网站| 亚洲毛片一区| 国产精品视频精品视频| 久久国产乱子精品免费女 | 欧美成人一区二区| aⅴ色国产欧美| 国产精品中文字幕欧美| 久久久久久久高潮| 91久久中文| 亚洲欧美综合网| 国产综合在线看| 欧美成人免费全部| 欧美激情精品久久久久久免费印度| 欧美视频官网| 99在线热播精品免费| 一区二区三区四区五区视频| 欧美视频一区二区三区…| 亚洲欧美日韩精品一区二区| 久久久五月婷婷| 日韩视频专区| 国产片一区二区| 欧美成人久久| 午夜精品久久久久久久久久久久久| 久久亚洲一区二区| 亚洲视频欧美在线| 在线成人黄色| 国产精品久久久久aaaa| 久热精品在线| 小处雏高清一区二区三区 | 一区二区三区鲁丝不卡| 久久亚洲影院| 亚洲男女自偷自拍| 亚洲精品美女在线观看| 国产一区二区你懂的| 欧美日韩国产三级| 久久米奇亚洲| 性色av一区二区三区| 亚洲精品永久免费精品| 男人插女人欧美| 久久精品国产一区二区电影| 日韩图片一区| 亚洲国产欧美一区二区三区同亚洲 | 一区二区欧美在线| 影音欧美亚洲| 国产免费一区二区三区香蕉精| 欧美精品色网| 麻豆乱码国产一区二区三区| 欧美一区国产二区|