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

天行健 君子當(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>
            樱花yy私人影院亚洲| 在线成人激情视频| 亚洲一区二区三区777| 亚洲精品一区二区三区av| 欧美成人中文字幕在线| 在线视频免费在线观看一区二区| 91久久精品国产91久久性色tv| 免费在线成人| 一本色道**综合亚洲精品蜜桃冫| 亚洲最快最全在线视频| 欧美亚洲成人网| 久久精品夜色噜噜亚洲aⅴ| 欧美主播一区二区三区美女 久久精品人| 国产精品国产精品国产专区不蜜| 欧美专区在线观看| 美女主播一区| 亚洲一区二区在线免费观看| 欧美一级免费视频| 亚洲欧洲美洲综合色网| 日韩视频一区二区三区| 国产亚洲二区| 欧美成人精品1314www| 欧美日韩国产影片| 欧美在线观看一区二区| 老司机久久99久久精品播放免费| 亚洲麻豆一区| 性欧美大战久久久久久久久| 狠狠色丁香久久婷婷综合_中| 亚洲福利视频二区| 国产精品视频一二| 欧美黑人多人双交| 国产精品久久福利| 亚洲第一色在线| 国产偷自视频区视频一区二区| 欧美国产日韩一区二区在线观看| 国产精品高清一区二区三区| 欧美91大片| 国产乱码精品一区二区三区不卡| 欧美激情a∨在线视频播放| 国产精品国产一区二区| 亚洲区中文字幕| 很黄很黄激情成人| 亚洲免费视频在线观看| 日韩一区二区免费高清| 久久亚洲一区| 久久久精品动漫| 国产精品日韩| 99re国产精品| 亚洲精品乱码久久久久久黑人| 欧美在线91| 午夜亚洲福利| 欧美视频免费| 亚洲美女黄网| 日韩亚洲欧美一区二区三区| 久久一区欧美| 久久亚洲美女| 黑人中文字幕一区二区三区| 亚洲欧美视频在线| 亚洲欧美一区二区精品久久久 | 欧美二区在线播放| 国产网站欧美日韩免费精品在线观看| 日韩亚洲欧美高清| 99国产精品久久久久久久| 欧美aⅴ99久久黑人专区| 久色成人在线| 一区久久精品| 久久久青草婷婷精品综合日韩| 久久成人国产精品| 国产一区二区日韩精品| 欧美一区深夜视频| 久久尤物视频| 亚洲成人资源| 欧美成人自拍| 亚洲精品视频一区二区三区| 99国产精品久久久| 欧美日韩一视频区二区| 夜夜嗨av一区二区三区网页| 亚洲一区国产视频| 国产精品影院在线观看| 欧美一二三区精品| 久久综合色天天久久综合图片| 国产揄拍国内精品对白| 久久精品免视看| 欧美激情久久久| 夜夜嗨av一区二区三区网页| 国产精品不卡在线| 欧美在线网站| 亚洲第一级黄色片| 亚洲午夜高清视频| 国产欧美欧美| 久热这里只精品99re8久| 最新日韩精品| 亚洲欧美日韩国产成人| 国产深夜精品| 蘑菇福利视频一区播放| 一本色道久久综合| 久久久午夜电影| 亚洲精品乱码久久久久久按摩观 | 久久综合99re88久久爱| 亚洲国产第一| 欧美一区二区三区视频在线| 国产亚洲一区二区三区| 欧美肥婆在线| 午夜视频在线观看一区二区三区| 欧美成人在线免费观看| 亚洲在线视频网站| 黄色成人在线| 欧美三级乱码| 免费成人高清在线视频| 亚洲永久免费精品| 欧美电影免费观看高清完整版| 亚洲女性裸体视频| 亚洲精品国产精品乱码不99 | 欧美日韩成人在线播放| 欧美影院在线| 在线亚洲成人| 亚洲大胆美女视频| 久久久www| 亚洲尤物影院| 一级成人国产| 亚洲国语精品自产拍在线观看| 国产精品免费看| 欧美日韩三级电影在线| 麻豆久久婷婷| 久久久久99精品国产片| 亚洲欧美日韩一区二区三区在线观看| 亚洲电影免费在线| 麻豆成人在线| 久久久综合网站| 欧美一级视频免费在线观看| 在线亚洲自拍| 夜夜爽www精品| 亚洲日本欧美在线| 亚洲国产高潮在线观看| 在线不卡中文字幕| 国产视频亚洲| 国产日韩久久| 国产精品影片在线观看| 国产精品久久久久久福利一牛影视 | 亚洲一区二区毛片| 一区二区三区国产精品| 日韩午夜免费视频| 亚洲日本中文字幕| 亚洲精品日本| 日韩亚洲国产欧美| 99视频精品全国免费| 99re6这里只有精品视频在线观看| 亚洲全部视频| 日韩视频在线观看免费| 99精品福利视频| 亚洲一区二区三区视频| 亚洲在线国产日韩欧美| 午夜日韩在线观看| 久久精品夜色噜噜亚洲a∨| 久久久久久久久蜜桃| 乱人伦精品视频在线观看| 麻豆av一区二区三区| 免费在线视频一区| 亚洲高清资源| 一区二区三区欧美日韩| 亚洲免费视频网站| 久久久久国产一区二区三区四区| 久久久久成人精品免费播放动漫| 噜噜爱69成人精品| 欧美精品综合| 国产精品一区二区三区四区五区| 国产精品专区一| 1000部精品久久久久久久久| 亚洲激情啪啪| 亚洲免费在线看| 久久精品亚洲一区二区三区浴池| 麻豆视频一区二区| 91久久精品美女| 亚洲欧美电影院| 裸体歌舞表演一区二区| 欧美乱大交xxxxx| 国产欧美精品一区aⅴ影院| 在线观看的日韩av| 亚洲一区二区三区精品视频| 久久久久九九视频| 亚洲国产美女| 午夜精品久久久久久久99水蜜桃 | 国产日产欧美a一级在线| 在线观看成人av| 亚洲尤物影院| 欧美激情欧美狂野欧美精品| 亚洲天堂av在线免费| 久久另类ts人妖一区二区| 欧美视频精品在线观看| 亚洲高清一区二| 午夜一区不卡| 亚洲精品国产拍免费91在线| 亚洲欧美日韩天堂一区二区| 欧美高清成人| 伊人久久男人天堂| 欧美一级网站| 亚洲作爱视频| 欧美激情综合色| 影音先锋欧美精品| 久久精品天堂|