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

天行健 君子當自強而不息

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>
            久久久国产一区二区| 亚洲第一区在线| 亚洲一区二区精品| 国产精品国产三级国产aⅴ9色| 亚洲麻豆av| 国产精品99久久久久久宅男| 欧美视频一区二区| 久久岛国电影| 老司机aⅴ在线精品导航| 99国产精品久久久| 99视频+国产日韩欧美| 国产欧美精品一区| 欧美激情欧美激情在线五月| 欧美黄色aaaa| 欧美有码在线视频| 蜜桃久久精品乱码一区二区| 制服丝袜激情欧洲亚洲| 欧美一区激情视频在线观看| 亚洲第一在线综合网站| 99re这里只有精品6| 国产嫩草影院久久久久| 欧美风情在线| 国产精品五区| 欧美激情免费观看| 国产精品一区二区三区四区五区| 蜜臀av在线播放一区二区三区| 欧美高清不卡在线| 久久精品夜色噜噜亚洲a∨| 免费视频一区二区三区在线观看| 亚洲欧美不卡| 欧美成年人网站| 久久国产日韩| 欧美日韩综合久久| 欧美成在线视频| 国产伦精品一区二区三区四区免费| 欧美高清视频在线观看| 国产精品免费看片| 亚洲人成小说网站色在线| 国内精品99| 在线视频欧美日韩精品| 亚洲精品久久视频| 久久久久久色| 久久久久久久久久久一区| 国产精品高清在线观看| 亚洲国产小视频| 在线观看一区视频| 久久久91精品| 久久―日本道色综合久久| 国产精品欧美久久久久无广告| 亚洲电影欧美电影有声小说| 国产一区在线看| 亚洲综合色激情五月| 亚洲视频1区| 欧美日韩国产综合新一区| 亚洲第一免费播放区| 精品成人在线观看| 欧美专区在线观看一区| 久久精品99无色码中文字幕| 欧美性猛交视频| 一区二区三区日韩| 亚洲一区二区三区四区五区午夜| 美女露胸一区二区三区| 猫咪成人在线观看| 在线色欧美三级视频| 久久久久久久久久久成人| 久久亚洲综合色一区二区三区| 国产一区二区三区久久| 午夜久久福利| 久久久久成人精品免费播放动漫| 国产欧美日韩一区二区三区| 亚洲欧美美女| 久久久www成人免费毛片麻豆| 国产人久久人人人人爽| 欧美一区二区三区四区在线| 久久久999精品免费| 一区二区三区我不卡| 久久人人看视频| 亚洲国产精品一区二区久| 亚洲人成在线播放| 欧美精品18| 亚洲视频中文字幕| 欧美在线播放一区| 一区免费观看视频| 欧美黑人在线播放| 亚洲一区二区三区中文字幕在线| 欧美亚洲综合网| 尤物yw午夜国产精品视频| 欧美不卡视频一区发布| 99精品欧美一区二区蜜桃免费| 午夜精彩视频在线观看不卡| 国产亚洲精品一区二555| 麻豆成人av| 亚洲图片欧美一区| 麻豆成人在线观看| 亚洲视频一区二区免费在线观看| 国产精品最新自拍| 美女免费视频一区| 亚洲免费婷婷| 亚洲国产高清一区| 欧美一级片在线播放| 亚洲黄色影院| 国产日韩欧美精品在线| 欧美成人精品| 亚洲免费在线看| 亚洲激情一区| 久久久99久久精品女同性| 亚洲乱码日产精品bd| 国产亚洲观看| 国产精品扒开腿做爽爽爽软件| 久久久精品一区| 亚洲午夜女主播在线直播| 免费日本视频一区| 欧美在线不卡| 中文久久乱码一区二区| 亚洲电影免费观看高清完整版在线观看| 欧美精品麻豆| 久久综合精品国产一区二区三区| 亚洲一级片在线看| 亚洲国产婷婷| 蜜臀av一级做a爰片久久| 午夜综合激情| 亚洲亚洲精品在线观看 | 久久久久久一区二区| 99精品热6080yy久久| 欧美国产日韩一区二区三区| 久久精品二区亚洲w码| 亚洲私人影院| 一个色综合av| 亚洲精品欧美激情| …久久精品99久久香蕉国产| 国产麻豆午夜三级精品| 国产精品高潮呻吟久久av黑人| 欧美国产大片| 欧美77777| 欧美大片va欧美在线播放| 久久精品国产99国产精品澳门| 亚洲免费在线看| 亚洲专区一区二区三区| 亚洲天堂av在线免费| 亚洲视频 欧洲视频| 一本色道久久综合精品竹菊| 99国产精品99久久久久久粉嫩| 亚洲国产精品一区二区第四页av| 欧美成人午夜免费视在线看片| 玖玖综合伊人| 免费观看一区| 亚洲国产成人精品女人久久久 | 日韩视频在线观看| 最新国产の精品合集bt伙计| 欧美国产日韩在线| 91久久精品国产91性色tv| 亚洲国产精品va| 亚洲毛片一区| 亚洲天天影视| 欧美一区二区三区在线观看视频 | 久久精品国产久精国产思思| 亚欧成人在线| 久久久亚洲高清| 欧美激情精品久久久六区热门| 欧美黄色网络| 国产精品美女在线| 国内外成人在线视频| 在线欧美日韩| 一区二区冒白浆视频| 午夜精品偷拍| 另类av导航| 亚洲激情欧美激情| 亚洲已满18点击进入久久 | 亚洲国产精品成人va在线观看| 亚洲激情欧美激情| 亚洲主播在线播放| 久久久久久久久一区二区| 欧美激情亚洲国产| 国产精品日韩在线观看| 激情五月***国产精品| 日韩亚洲欧美一区| 欧美综合国产精品久久丁香| 欧美成人免费大片| 中日韩在线视频| 另类天堂视频在线观看| 欧美午夜久久久| 亚洲第一福利视频| 亚洲一区久久| 欧美va天堂va视频va在线| 一区二区三区精密机械公司| 久久九九久久九九| 国产精品白丝av嫩草影院| 1769国内精品视频在线播放| 亚洲天堂免费观看| 欧美成人国产一区二区| 亚洲摸下面视频| 欧美精彩视频一区二区三区| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲大胆人体在线| 在线亚洲激情| 麻豆久久精品| 国产综合久久久久久鬼色| 亚洲一区二区三区精品在线观看| 欧美+亚洲+精品+三区| 亚洲先锋成人|