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

天行健 君子當自強而不息

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>
            欧美在线一二三四区| 久久久久成人精品| 欧美香蕉视频| 国产精品theporn88| 欧美日韩中文| 国产精品一区二区久久国产| 欧美色区777第一页| 国产精品久久久久99| 国产精品久久综合| 国产婷婷成人久久av免费高清 | 麻豆精品一区二区av白丝在线| 久久激情网站| 亚洲国产精品电影| 99riav久久精品riav| 亚洲欧美日韩精品在线| 老巨人导航500精品| 欧美三级午夜理伦三级中视频| 国产精品日韩在线播放| 永久555www成人免费| 一区二区三区国产在线| 久久久www成人免费毛片麻豆| 亚洲电影av在线| 亚洲嫩草精品久久| 欧美aa在线视频| 国产欧美亚洲精品| 日韩一级大片在线| 久久久精品视频成人| 亚洲在线日韩| 久久久激情视频| 亚洲国产成人av好男人在线观看| 亚洲三级观看| 欧美在线观看网站| 欧美日韩亚洲一区二区三区| 国产日韩精品视频一区二区三区| 亚洲欧洲三级| 美女精品国产| 午夜视频久久久| 欧美三级网页| 99伊人成综合| 欧美激情按摩在线| 久久九九国产精品| 国产精品一区二区黑丝| 一区二区高清在线观看| 你懂的国产精品| 欧美一区二区视频免费观看| 国产精品久久久久久久第一福利 | 91久久香蕉国产日韩欧美9色 | 欧美一级久久久| 欧美日韩免费一区二区三区视频| 亚洲第一在线| 欧美顶级大胆免费视频| 久久精品夜色噜噜亚洲aⅴ| 国产视频一区在线| 欧美一区二区三区视频| 亚洲午夜av| 国产精品成人v| 亚洲永久视频| 亚洲综合清纯丝袜自拍| 国产精品呻吟| 午夜一区二区三区不卡视频| 亚洲视频网站在线观看| 国产精品v欧美精品v日韩精品| 夜夜夜久久久| 一区二区精品在线| 国产精品美女久久| 欧美在线观看一二区| 欧美一级专区免费大片| 国产手机视频一区二区| 久久男人资源视频| 老司机一区二区三区| 亚洲国产一区视频| 亚洲国产日韩一区二区| 欧美日韩国产高清| 亚洲欧美三级伦理| 午夜亚洲性色福利视频| 国产一区二区高清| 欧美电影在线免费观看网站| 欧美国产综合视频| 亚洲欧美日韩在线不卡| 欧美影院视频| 亚洲麻豆国产自偷在线| 一本高清dvd不卡在线观看| 国产精品影视天天线| 免费成人黄色片| 男女精品网站| 一区二区三区免费网站| 亚洲三级影院| 国产欧美视频在线观看| 免费91麻豆精品国产自产在线观看| 欧美ed2k| 欧美在线看片| 欧美jizzhd精品欧美巨大免费| 亚洲香蕉视频| 久久夜色撩人精品| 亚洲女女女同性video| 久久国产欧美日韩精品| 亚洲乱码国产乱码精品精| 亚洲一区二三| 亚洲国产一区二区a毛片| 在线性视频日韩欧美| 在线观看成人一级片| 99国产一区| 在线观看视频亚洲| 亚洲一二三区在线| 亚洲精品美女| 久久国产精品黑丝| 亚洲一区二区在线视频| 久久久久久网址| 午夜欧美精品| 欧美日韩成人| 欧美成人一区二区| 国产日韩专区在线| 在线亚洲观看| 亚洲人午夜精品| 久久精品官网| 欧美中文在线视频| 国产精品九九| 日韩一本二本av| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美日韩午夜| 欧美成ee人免费视频| 国产精品综合网站| 亚洲视频第一页| 一本色道久久综合一区| 久久伊人亚洲| 久热精品视频在线观看| 国产伦精品免费视频| 一本久道久久久| 亚洲午夜激情| 欧美日韩亚洲三区| 日韩视频精品在线| 夜夜嗨网站十八久久| 欧美成人嫩草网站| 亚洲成色最大综合在线| 亚洲国产成人久久综合一区| 欧美综合国产| 欧美成年人视频| 亚洲观看高清完整版在线观看| 久久久99久久精品女同性 | 亚洲精品一区二区三区不| 亚洲激情国产精品| 国产精品一香蕉国产线看观看| 久久精品国产96久久久香蕉 | 欧美精品免费在线观看| 欧美国产精品一区| 亚洲国产精品一区| 久久噜噜亚洲综合| 免费观看成人www动漫视频| 国产尤物精品| 久久久久久久波多野高潮日日| 久久久久久久综合日本| 国产婷婷色一区二区三区四区| 午夜亚洲福利| 欧美成人亚洲成人日韩成人| 亚洲电影av| 欧美日韩精品在线观看| 一区二区三区视频在线看| 亚洲欧美日韩国产中文在线| 国产精品毛片在线看| 午夜伦欧美伦电影理论片| 蜜臀久久久99精品久久久久久| 亚洲国产毛片完整版| 欧美精品久久久久久久免费观看| 日韩视频一区二区| 欧美伊久线香蕉线新在线| 好看的日韩视频| 欧美激情女人20p| 亚洲欧美国产va在线影院| 久久免费视频网站| 一片黄亚洲嫩模| 国内自拍一区| 欧美日韩免费观看一区| 欧美亚洲一区二区在线观看| 亚洲国产成人不卡| 午夜免费日韩视频| 亚洲激情不卡| 国产欧美日韩精品一区| 欧美+亚洲+精品+三区| 亚洲午夜久久久久久尤物| 快播亚洲色图| 亚洲一区在线播放| 亚洲国产精品久久久久秋霞不卡| 欧美视频手机在线| 浪潮色综合久久天堂| 亚洲视频一区在线| 亚洲第一黄色网| 午夜精品一区二区三区在线视| 一区二区三区在线高清| 欧美视频免费看| 欧美风情在线| 久久久91精品国产一区二区三区 | 亚洲片国产一区一级在线观看| 午夜精品福利电影| 日韩亚洲成人av在线| 国产一区二区中文| 国产精品av久久久久久麻豆网| 可以看av的网站久久看| 午夜精品国产更新| 中文国产一区| 99成人在线|