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

天行健 君子當自強而不息

Working with skeletal animation(5)

Loading Skinned Meshes from .X

Loading a skinned mesh from an .X file is much like loading a standard mesh. Using a custom .X parser, you must enumerate your .X file objects using ParseObject. When it comes to processing a Mesh object, instead of calling the D3DXLoadMeshFromXof function to load the mesh data, you call the D3DXLoadSkinMeshFromXof function, which takes one additional parameter−a pointer to an ID3DXSkinInfo object. Check out the D3DXLoadSkinMeshFromXof prototype to see what I mean.

Loads a skin mesh from a DirectX .x file data object.

HRESULT D3DXLoadSkinMeshFromXof(
LPD3DXFILEDATA pxofMesh,
DWORD Options,
LPDIRECT3DDEVICE9 pD3DDevice,
LPD3DXBUFFER * ppAdjacency,
LPD3DXBUFFER * ppMaterials,
LPD3DXBUFFER * ppEffectInstances,
DWORD * pMatOut,
LPD3DXSKININFO * ppSkinInfo,
LPD3DXMESH * ppMesh
);

Parameters

pxofMesh
[in] Pointer to an ID3DXFileData interface, representing the file data object to load.
Options
[in] Combination of one or more flags, from the D3DXMESH enumeration, specifying creation options for the mesh.
pD3DDevice
[in] Pointer to an IDirect3DDevice9 interface, the device object associated with the mesh.
ppAdjacency
[out] Address of a pointer to an ID3DXBuffer interface. When this method returns, this parameter is filled with an array of three DWORDs per face that specify the three neighbors for each face in the mesh.
ppMaterials
[out] Address of a pointer to an ID3DXBuffer interface. When the method returns, this parameter is filled with an array of D3DXMATERIAL structures.
ppEffectInstances
[out] Pointer to a buffer containing an array of effect instances, one per attribute group in the returned mesh. An effect instance is a particular instance of state information used to initialize an effect. See D3DXEFFECTINSTANCE. For more information about accessing the buffer, see ID3DXBuffer.
pMatOut
[out] Pointer to the number of D3DXMATERIAL structures in the ppMaterials array, when the method returns.
ppSkinInfo
[out] Address of a pointer to an ID3DXSkinInfo interface, which represents the skinning information.
ppMesh
[out] Address of a pointer to an ID3DXMesh interface, which represents the loaded mesh.

Return Values

If the function succeeds, the return value is D3D_OK. If the function fails, the return value can be one of the following: D3DERR_INVALIDCALL.

D3DXERR_INVALIDDATA E_OUTOFMEMORY

Remarks

This method takes a pointer to an internal object in the .x file, enabling you to load the frame hierarchy.

For mesh files that do not contain effect instance information, default effect instances will be generated from the material information in the .x file. A default effect instance will have default values that correspond to the members of the D3DMATERIAL9 structure.

The default texture name is also filled in, but is handled differently. The name will be Texture0@Name, which corresponds to an effect variable by the name of "Texture0" with an annotation called "Name." This will contain the string file name for the texture.

When you are ready to load a mesh from an enumerated Mesh template, call the D3DXLoadSkinMeshFromXof function instead of calling D3DXLoadMeshFromXof. Make sure to supply an ID3DXSkinInfo object where it is shown in the prototype. Whether or not the Mesh template contains a skinned mesh doesn't matter−the D3DXLoadSkinMeshFromXof function will load regular and skinned meshes without a hitch. Here's an example:

// Define the mesh and skinned mesh info objects
ID3DXMesh *pMesh;
ID3DXSkinInfo *pSkinInfo;

// Define buffers to hold the material data and adjacency data
ID3DXBuffer *pMaterialBuffer = NULL, *pAdjacencyBuffer = NULL;

// DWORD to hold the number of materials being loaded
DWORD NumMaterials;

// Load the skinned mesh from IDirectXFileDataObject pDataObj
D3DXLoadSkinMeshFromXof(pDataObj, D3DXMESH_SYSTEMMEM, pDevice, &pAdjacencyBuffer,
&pMaterialBuffer, NULL, &NumMaterials, &pSkinInfo, &pMesh);

Just because you used the D3DXLoadSkinnedMeshFromXof function, that doesn't mean a skinned mesh was loaded. First you need to check the pSkinInfo object. If it's set to NULL, then a skinned mesh wasn't loaded. If it's a valid object (non−NULL), then you need to check whether any bones exist.

The easiest way to see whether bones exist is to call ID3DXSkinInfo::GetNumBones. The GetNumBones function will return the number of bones loaded from the Mesh template. If the number is 0, then there are no bones, and you can free the ID3DXSkinInfo object (using Release). If bones do exist, then you can continue using the skinned mesh.

Check out this example, which tests whether a skinned mesh was loaded. If so, the example checks to see whether the mesh contains any bones.

// Set a flag is there's a skinned mesh and bones to use
BOOL SkinnedMesh = FALSE;
if(pSkinInfo && pSkinInfo−>GetNumBones())
SkinnedMesh = TRUE;
else
{
// Free the skinned mesh info data object
if(pSkinInfo)
{
pSkinInfo−>Release();
pSkinInfo = NULL;
}
}

If the SkinnedMesh flag is set to TRUE, then the pSkinInfo object is valid and you're ready to work with the skinned mesh. The next step is to create another mesh object that will contain the actual deforming mesh as you change the bones' orientations.

 

Creating a Secondary Mesh Container

After you create the skinned mesh, you need to create a second mesh container. Why, you ask? Well, the skinned mesh object you loaded from the D3DXLoadSkinMeshFromXof function is sort of the base of reference for your mesh's vertex data. Since these vertices are in the right positions to match the orientations of the bones, it would mess up things quite a bit if you started altering those positions.

Let's leave things well enough alone and instead create a second mesh object (an ID3DXMesh object) that contains an exact duplicate of the skinned mesh. You need to read the vertex data from the skinned mesh data, apply the various bone transformations, and write the resulting vertex data to this duplicate mesh container (which I call the secondary mesh or secondary mesh container) that you use to render. Makes sense, doesn't it?

As I mentioned, the secondary mesh is an identical match to the skinned mesh; everything from the number of vertices to the indices needed is the same. The easiest way to duplicate the skinned mesh object is to use the ID3DXMesh::CloseMeshFVF function.

Clones a mesh using a flexible vertex format (FVF) code.

HRESULT CloneMeshFVF(
DWORD Options,
DWORD FVF,
LPDIRECT3DDEVICE9 pDevice,
LPD3DXMESH * ppCloneMesh
);

Parameters

Options
[in] A combination of one or more D3DXMESH flags specifying creation options for the mesh.
FVF
[in] Combination of FVF codes, which specifies the vertex format for the vertices in the output mesh. For the values of the codes, see D3DFVF.
pDevice
[in] Pointer to an IDirect3DDevice9 interface representing the device object associated with the mesh.
ppCloneMesh
[out, retval] Address of a pointer to an ID3DXMesh interface, representing the cloned mesh.

Return Values

If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be one of the following: D3DERR_INVALIDCALL, E_OUTOFMEMORY.

Remarks

ID3DXBaseMesh::CloneMeshFVF is used to reformat and change the vertex data layout. This is done by creating a new mesh object. For example, use it to to add space for normals, texture coordinates, colors, weights, etc. that were not present before.

ID3DXBaseMesh::UpdateSemantics updates the vertex declaration with different semantic information without changing the layout of the vertex buffer. This method does not modify the contents of the vertex buffer. For example, use it to relabel a 3D texture coordinate as a binormal or tangent or vice versa.

The Options parameter of CloneMeshFVF is just like the one from the calls to D3DXLoadMeshFromX, D3DXLoadMeshFromXof, and D3DXLoadSkinMeshFromXof, so take your pick. I tend to set Options flags to 0, but feel free to change it.

As for the FVF parameter, you only need to supply the FVF from the skinned mesh object using the skinned mesh's GetFVF function. Also, don't forget to supply the valid IDirect3DDevice9 object you are using, as well as a pointer to an ID3DXMesh object that will be your secondary mesh container.

Here's a bit of code that demonstrates cloning a skinned mesh to create your secondary mesh:

// pSkinMesh = ID3DXMesh object
ID3DXMesh *pMesh; // Secondary mesh container
pSkinMesh−>CloneMeshFVF(0, pMesh−>GetFVF(), pDevice, &pMesh);

All this talk of cloning reminds me of Star Wars Episode II: Attack of the Clones. Good thing your cloned secondary meshes aren't going to try to take over the universeor are they? Well heck, those clones aren't going anywhere without a little effort, so let's get back to work and see what's next in line.

After you've created the secondary mesh container, it's time to map your bones to the frame hierarchy. Why didn't we do this previously, when I was discussing bones and frames? Easy−the bone data was loaded until you called D3DXLoadSkinMeshFromXof!


posted on 2008-04-23 19:17 lovedday 閱讀(640) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久噜噜噜精品国产亚洲综合 | 亚洲巨乳在线| 激情综合久久| 伊人久久综合97精品| 黄色日韩精品| 亚洲高清成人| 亚洲午夜国产成人av电影男同| 亚洲最快最全在线视频| 午夜精品久久久久99热蜜桃导演| 亚洲欧美日产图| 久久亚洲视频| 亚洲美女精品成人在线视频| 亚洲欧美一区二区在线观看| 久久人人97超碰精品888| 欧美精品成人91久久久久久久| 国产精品二区在线观看| 国内视频一区| 亚洲图片欧美午夜| 久久久国产一区二区三区| 亚洲第一区在线| 99国产精品国产精品毛片| 午夜伦理片一区| 欧美激情精品久久久久久蜜臀| 国产精品久久久久免费a∨大胸| 国产在线拍偷自揄拍精品| 亚洲精品一级| 欧美性感一类影片在线播放| 国产精品伦一区| 亚洲欧洲日产国码二区| 亚洲欧美日韩另类精品一区二区三区 | 久久精品女人| 国产精品草莓在线免费观看| 一区二区三区亚洲| 亚洲欧美一区二区精品久久久| 免费不卡中文字幕视频| 中文久久精品| 欧美激情影音先锋| 在线成人国产| 久久久国产精品亚洲一区| 在线一区二区三区四区五区| 久久一区二区三区国产精品| 国产伦一区二区三区色一情| 在线视频你懂得一区二区三区| 欧美成人dvd在线视频| 久久都是精品| 国产一级一区二区| 翔田千里一区二区| 在线中文字幕一区| 欧美日韩一区二区在线视频 | 亚洲美女毛片| 欧美91大片| 久久亚洲美女| 精品成人一区二区| 噜噜噜噜噜久久久久久91| 欧美一区二区三区视频免费| 国产精品老牛| 亚洲欧美伊人| 亚洲午夜精品视频| 国产精品电影网站| 亚洲欧美日韩国产一区| 夜夜嗨av色综合久久久综合网 | 亚洲欧美在线高清| 国产欧美91| 久久久久久久久久久久久9999| 午夜久久资源| 伊人久久综合| 亚洲激情成人| 欧美日韩亚洲成人| 午夜精品久久久久久久久久久久久| 日韩亚洲欧美一区| 国产精品嫩草99a| 久久精品91久久久久久再现| 久久国产日韩欧美| 亚洲成人在线免费| 亚洲日韩中文字幕在线播放| 欧美日本在线观看| 亚洲男同1069视频| 欧美在现视频| 亚洲另类自拍| 亚洲一卡二卡三卡四卡五卡| 国产一区二区精品久久91| 欧美国产综合| 99re国产精品| 国产日韩欧美91| 亚洲承认在线| 欧美视频在线观看 亚洲欧| 欧美在线免费视屏| 久久综合九色综合欧美狠狠| 一本色道久久综合精品竹菊| 亚洲制服av| 亚洲精选成人| 欧美在线日韩在线| 99日韩精品| 欧美在线免费观看亚洲| 亚洲日韩欧美一区二区在线| 亚洲美女一区| 在线播放一区| 在线视频一区观看| 影音先锋成人资源站| 日韩视频一区二区三区| 韩日精品中文字幕| 亚洲视频综合| 亚洲精品日韩激情在线电影| 午夜免费在线观看精品视频| 99在线精品观看| 久久天天躁狠狠躁夜夜av| 亚洲免费一在线| 欧美激情第六页| 媚黑女一区二区| 国产乱码精品一区二区三区忘忧草 | 亚洲欧美日韩一区在线| 久久综合福利| 欧美在线www| 欧美色欧美亚洲高清在线视频| 蜜乳av另类精品一区二区| 国产精品久久久久久久久久尿 | 一区二区三区视频在线观看| 亚洲国产高清在线| 久久福利视频导航| 午夜久久久久久| 欧美日韩免费高清| 亚洲国产精品va在线看黑人动漫 | 在线不卡中文字幕播放| 亚洲欧美资源在线| 午夜精品免费| 国产精品vvv| 日韩一级在线| 亚洲网友自拍| 欧美日本一区| 亚洲毛片av| av成人动漫| 欧美精品一区二| 亚洲精品久久久久久一区二区| 亚洲国产裸拍裸体视频在线观看乱了| 性做久久久久久免费观看欧美| 亚洲欧美视频| 久久不射中文字幕| 亚洲欧洲在线一区| 国产综合精品一区| 欧美一级在线播放| 久久漫画官网| 在线观看国产日韩| 久久人人97超碰国产公开结果 | 欧美成黄导航| 亚洲国产成人tv| 欧美xart系列高清| 亚洲黄网站在线观看| 99国产一区| 国产精品久久久久久一区二区三区| 亚洲性感美女99在线| 欧美在线观看一区| 在线电影院国产精品| 狂野欧美激情性xxxx| 亚洲国产精品一区二区www在线| 99国产精品久久久久老师 | 欧美不卡在线视频| 亚洲三级毛片| 欧美一级专区免费大片| 国产精品国产福利国产秒拍| 国产精品99久久久久久久久久久久| 欧美一区二区播放| 尤物yw午夜国产精品视频明星 | 久久久久在线| 日韩午夜电影| 久久久欧美精品| 日韩午夜电影在线观看| 国产精品日韩精品欧美在线| 久久大综合网| 99v久久综合狠狠综合久久| 欧美在线观看网站| 亚洲毛片一区| 国产亚洲精品久久飘花| 另类av一区二区| 亚洲午夜一区| 亚洲国产精品99久久久久久久久| 亚洲欧美一区二区视频| 亚洲激情专区| 国产午夜亚洲精品理论片色戒| 麻豆av一区二区三区| 亚洲图片激情小说| 亚洲大胆人体视频| 久久九九精品99国产精品| 日韩午夜免费| 亚洲国产91精品在线观看| 国产日韩精品一区| 欧美日韩一区二区视频在线| 麻豆av一区二区三区久久| 亚洲女女女同性video| 亚洲激情偷拍| 欧美成人午夜激情视频| 欧美一区二区三区男人的天堂| 夜夜夜久久久| 亚洲三级色网| 伊人夜夜躁av伊人久久| 国产乱子伦一区二区三区国色天香| 欧美日韩国产电影| 欧美成人三级在线| 老司机久久99久久精品播放免费 | 欧美chengren| 亚洲精品视频免费|