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

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

D3D Animation Basis(1)

The D3DXFRAME object helps form a hierarchy of reference frames. These reference frames are used to
connect a series of meshes together, with each frame having its own transformation to apply to the mesh
connected to it. In this way of using frames to point to meshes, you can minimize the number of meshes used
because you can reference meshes instead of having to reload them.

For example, imagine you have a car that consists of a body and four wheels. The body and wheel form two
meshes. These two meshes are used in conjunction with five frames (one for the body and four for the tires).
When rendering, each frame's transformation is used to position and render the mesh that the frame uses. That
means one frame transforms and renders the body once, while the other frames transform and render the tire
mesh four times.

here is D3DXFRAME's define:

Encapsulates a transform frame in a transformation frame hierarchy.

typedef struct D3DXFRAME {
LPSTR Name;
D3DXMATRIX TransformationMatrix;
LPD3DXMESHCONTAINER pMeshContainer;
D3DXFRAME * pFrameSibling;
D3DXFRAME * pFrameFirstChild;
} D3DXFRAME, *LPD3DXFRAME;

Members

Name
Name of the frame.
TransformationMatrix
Transformation matrix.
pMeshContainer
Pointer to the mesh container.
pFrameSibling
Pointer to a sibling frame.
pFrameFirstChild
Pointer to a child frame.

Remarks

An application can derive from this structure to add other data.

As for the D3DXMESHCONTAINER object, it is used to contain a mesh as well as to link to a series of other
meshes (using a linked list). Why not just use the ID3DXBaseMesh object instead, you ask? Well, there's
more to D3DXMESHCONTAINER than you might expect. First, you can store any type of mesh, whether it's
regular, skinned, or progressive. Second, the D3DXMESHCONTAINER object holds material and effect data.

here is D3DXMESHCONTAINER define:

Encapsulates a mesh object in a transformation frame hierarchy.

typedef struct D3DXMESHCONTAINER {
LPSTR Name;
D3DXMESHDATA MeshData;
LPD3DXMATERIAL pMaterials;
LPD3DXEFFECTINSTANCE pEffects;
DWORD NumMaterials;
DWORD * pAdjacency;
LPD3DXSKININFO pSkinInfo;
D3DXMESHCONTAINER * pNextMeshContainer;
} D3DXMESHCONTAINER, *LPD3DXMESHCONTAINER;

Members

Name
Mesh name.
MeshData
Type of data in the mesh.
pMaterials
Array of mesh materials.
pEffects
Pointer to a set of default effect parameters.
NumMaterials
Number of materials in the mesh.
pAdjacency
Pointer to an array of three DWORDs per triangle of the mesh that contains adjacency information.
pSkinInfo
Pointer to the skin information interface.
pNextMeshContainer
Pointer to the next mesh container.

Remarks

An application can derive from this structure to add other data.

D3DXMESHDATA

Mesh data structure.

typedef struct D3DXMESHDATA {
D3DXMESHDATATYPE Type;
union {
LPD3DXMESH pMesh;
LPD3DXPMESH pPMesh;
LPD3DXPATCHMESH pPatchMesh;
};
} D3DXMESHDATA, *LPD3DXMESHDATA;

Members

Type
Defines the mesh data type.
pMesh
Pointer to a mesh.
pPMesh
Pointer to a progressive mesh.
pPatchMesh
Pointer to a patch mesh.

D3DXMESHDATATYPE

Defines the type of mesh data present in D3DXMESHDATA.

typedef enum D3DXMESHDATATYPE
{
D3DXMESHTYPE_MESH = 0x001,
D3DXMESHTYPE_PMESH = 0x002,
D3DXMESHTYPE_PATCHMESH = 0x003,
D3DXEDT_FORCE_DWORD = 0x7fffffff,
} D3DXMESHDATATYPE, *LPD3DXMESHDATATYPE;

Constants

D3DXMESHTYPE_MESH
The data type is a mesh.
D3DXMESHTYPE_PMESH
The data type is a progressive mesh.
D3DXMESHTYPE_PATCHMESH
The data type is a patch mesh.
D3DXEDT_FORCE_DWORD
Forces this enumeration to compile to 32 bits in size. Without this value, some compilers would allow this enumeration to compile to a size other than 32 bits. This value is not used.
 

Extending D3DXFRAME

By itself, the D3DXFRAME object is very useful, but unfortunately it lacks a few very essential tidbits of
information, namely data for containing transformations when animating meshes, functions to handle the
animation data, and a default constructor and destructor.

To correct these omissions, I have created an extended version of D3DXFRAME, which I call
D3DXFRAME_EX. This new object adds a total of two D3DXMATRIX objects and six functions to the mix.
The two matrix objects contain the original transformation of the frame (before any animation transformations
are applied) and the combined transformation from all parent frames to which the frame is connected (in the
hierarchy).

Here's how I defined the D3DXFRAME_EX structure along with the two matrix objects:

//-------------------------------------------------------------------------------------------
// Declare an extended version of D3DXFRAME that contains a constructor and destructor
// as well as a combined transformation matrix.
//-------------------------------------------------------------------------------------------
struct D3DXFRAME_EX : D3DXFRAME
{
D3DXMATRIX mat_combined; // combined matrix
D3DXMATRIX mat_original; // original transformation from .X

For now, let's
just move on to the functions, starting with the constructor. The constructor has the job of clearing out the
structure's data (including the original data from the base D3DXFRAME object).

D3DXFRAME_EX()
{
Name = NULL;
pMeshContainer = NULL;
pFrameSibling = pFrameFirstChild = NULL;

D3DXMatrixIdentity(&matCombined);
D3DXMatrixIdentity(&matOriginal);
D3DXMatrixIdentity(&TransformationMatrix);
}

On the flip side, the destructor has the job of freeing the data used by the D3DXFRAME_EX object.

~D3DXFRAME_EX()
{
delete[] Name; Name = NULL;
delete pFrameSibling; pFrameSibling = NULL;
delete pFrameFirstChild; pFrameFirstChild = NULL;
}

As you can see, the constructor and destructor are pretty typical in the way those things normally go−initialize
the object's data and free the resources when done. What comes next are a handful of functions that help you
search for a specific frame in the hierarchy, reset the animation matrices to their original states, update the
hierarchy after modifying a transformation, and count the number of frames in the hierarchy.

The first function, find, is used to find a specific frame in the hierarchy and return a pointer to it. If you're
not aware of this, each D3DXFRAME object (and the derived D3DXFRAME_EX object) has a Name data
buffer, which you're free to fill in with whatever text you find appropriate. Typically, frames are named after
bones that define the hierarchy.

To find a specific frame (and retrieve a pointer to the frame's object), just call the find function, specifying
the name of the frame you wish to find as the one and only parameter.

// Function to scan hierarchy for matching frame name
D3DXFRAME_EX* find(const char* frame_name)
{
// return this frame instance if name matched
if(Name && frame_name && !strcmp(frame_name, Name))
  return this;

if(pFrameSibling) // scan siblings
  return ((D3DXFRAME_EX*) pFrameSibling)->find(frame_name);

if(pFrameFirstChild) // scan children
  return ((D3DXFRAME_EX*) pFrameSibling)->find(frame_name);

return NULL; // no found
}

The find function compares the name you passed to the current frame's name; if they match, the pointer to
the frame is returned. If no match is found, then the linked list is scanned for matches using a recursive call to
find.

Next in the line of added functions is reset, which scans through the entire frame hierarchy (which, by the
way, is a linked list of child and sibling objects). For each frame found, it copies the original transformation to
the current transformation. Here's the code:

// reset transformation matrices to originals
void reset()
{
TransformationMatrix = mat_original;

if(pFrameSibling)
  ((D3DXFRAME_EX*) pFrameSibling)->reset();

if(pFrameFirstChild)
  ((D3DXFRAME_EX*) pFrameFirstChild)->reset();
}

Typically, you call reset to restore the frame hierarchy's transformation back to what it was when you
created or loaded the frames. the next function in the list is update_hierarchy, which has the job of rebuilding
the entire frame hierarchy's list of transformations after any one of those transformations has been altered.

Rebuilding the hierarchy is essential to making sure the mesh is rebuilt or rendered correctly after you have
updated an animation. let's just check out the code, which takes an optional transformation matrix to apply
to the root frame of the hierarchy.

// function to combine matrices in frame hierarchy
void update_hierarchy(D3DXMATRIX* mat_trans)
{
// use an identity matrix if none passed
if(mat_trans == NULL)
{
  D3DXMATRIX mat_identity;
  D3DXMatrixIdentity(&mat_identity);

  mat_trans = &mat_identity;
}

// combine matrices with supplied transformation matrix
mat_combined = TransformationMatrix * (*mat_trans);

// combine with sibling frames
if(pFrameSibling)
  ((D3DXFRAME_EX*) pFrameSibling)->update_hierarchy(mat_trans);

// combine with child frames
if(pFrameFirstChild)
  ((D3DXFRAME_EX*) pFrameFirstChild)->update_hierarchy(mat_combined);
}

the update_hierarchy function transforms the frames by their own transformation matrix
(stored in matTransformation) by a matrix that is passed as the optional parameter of the function. This
way, a frame inherits the transformation of its parent frame in the hierarchy, meaning that each transformation
applied winds its way down the entire hierarchy.

Last, with the D3DXFRAME_EX object you have the count function, which helps you by counting the
number of frames contained within the hierarchy. This is accomplished using a recursive call of the count
function for each frame contained in the linked list. For each frame found in the list, a counter variable (that
you provide as the parameter) is incremented. Check out the Count code to see what I mean.

void count(DWORD* num)
{
if(num == NULL) // error checking
  return;

(*num) += 1; // increase count of frames

// process sibling frames
if(pFrameSibling)
  ((D3DXFRAME_EX*) pFrameSibling)->count(num);

// process child frames
if(pFrameFirstChild)
  ((D3DXFRAME_EX*) pFrameFirstChild)->count(num);
}

And that pretty much wraps up the D3DXFRAME_EX object. If you're used to using the D3DXFRAME object
(and you should be if you're a DX9 user), then everything I've just shown you should be pretty easy to
understand.


posted on 2008-04-13 17:37 lovedday 閱讀(634) 評(píng)論(0)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(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>
            亚洲资源在线观看| 欧美精品一卡二卡| 久久人人97超碰人人澡爱香蕉| 亚洲视频一二区| 亚洲国产电影| 亚洲欧洲精品一区二区三区 | 国产精品99久久久久久久女警| 亚洲精品在线二区| 亚洲午夜久久久久久久久电影院 | 欧美亚洲第一页| 国产欧美日韩免费看aⅴ视频| 国产精品日日做人人爱| 国产视频精品va久久久久久| 国产亚洲精品久| 亚洲精品国精品久久99热一| 亚洲美女视频网| 亚洲欧美视频在线观看视频| 欧美在线三级| 欧美91视频| 亚洲视频在线观看| 久久久免费av| 欧美日韩的一区二区| 国产欧美精品在线| 99这里只有久久精品视频| 欧美在线一级va免费观看| 欧美波霸影院| 欧美一区二区三区视频免费播放| 欧美刺激午夜性久久久久久久| 国产精品色婷婷| 99www免费人成精品| 久久久久久久波多野高潮日日| 最新亚洲视频| 久久久亚洲人| 国产欧美日韩视频在线观看 | 亚洲精品在线视频| 久久久夜夜夜| 精品999在线播放| 一区二区三区产品免费精品久久75 | 欧美精品在线一区二区| 国产精品资源| 亚洲香蕉视频| 亚洲国产二区| 久久一区国产| 国产亚洲成精品久久| 亚洲在线观看| 亚洲精品欧美| 久久精品理论片| 国产欧美一区二区三区视频| 久久全球大尺度高清视频| 国产欧美一区二区三区另类精品| 亚洲一区二区三区777| 久久久久久久久久久一区| 亚洲图片在线观看| 国产精品成人一区二区三区夜夜夜| 99re66热这里只有精品4| 亚洲高清在线观看| 麻豆成人av| 亚洲国产一成人久久精品| 久久人人超碰| 久久久中精品2020中文| 国内精品伊人久久久久av影院| 久久久国产91| 久久人人爽国产| 亚洲激情一区| 亚洲精品资源| 国产精品第13页| 欧美中文字幕在线播放| 午夜精品久久久久久久男人的天堂| 国产精品乱看| 欧美在线亚洲| 免费成人毛片| 一区二区三区四区蜜桃| 日韩一级黄色av| 国产精品青草久久| 久久精品动漫| 美女图片一区二区| 亚洲美洲欧洲综合国产一区| 亚洲久久在线| 国产女主播一区二区| 久久米奇亚洲| 欧美大片91| 午夜伦理片一区| 午夜影院日韩| 1024亚洲| 日韩一级精品| 黄色成人片子| 亚洲乱码国产乱码精品精天堂| 国产精品视频专区| 美女视频黄a大片欧美| 欧美区国产区| 久久久久久尹人网香蕉| 蜜臀久久99精品久久久久久9| 亚洲特色特黄| 美日韩丰满少妇在线观看| 一本色道久久综合精品竹菊| 亚洲女女女同性video| 亚洲高清自拍| 亚洲在线观看| 一区二区欧美在线| 久久精彩视频| 亚洲欧美欧美一区二区三区| 久久久综合网| 欧美在线视频a| 欧美日韩一区二区在线观看| 欧美有码视频| 欧美三区在线观看| 欧美激情精品久久久六区热门| 国产精品腿扒开做爽爽爽挤奶网站| 欧美肥婆在线| 国产综合18久久久久久| 在线综合亚洲| 欧美日韩在线三区| 欧美成人午夜激情视频| 国产午夜精品视频免费不卡69堂| 亚洲精品视频啊美女在线直播| 国产亚洲精久久久久久| 艳女tv在线观看国产一区| 亚洲第一福利在线观看| 亚洲影视中文字幕| 中日韩在线视频| 欧美国产一区视频在线观看| 久久久久成人网| 国产美女在线精品免费观看| 亚洲每日更新| 99av国产精品欲麻豆| 老妇喷水一区二区三区| 久久久www免费人成黑人精品| 国产精品美女久久久久久免费| 99视频一区| 一区二区三区视频观看| 欧美国产一区二区三区激情无套| 欧美成年人在线观看| 一区免费观看| 久久综合伊人77777| 久久一二三四| 伊人夜夜躁av伊人久久| 久久精品综合一区| 欧美成人综合网站| 亚洲精品视频免费| 欧美激情综合亚洲一二区| 欧美成人三级在线| 亚洲欧洲日韩在线| 欧美激情一区| 亚洲青色在线| 中文在线一区| 国产精品自拍视频| 久久国产综合精品| 欧美 日韩 国产在线| 尤物精品国产第一福利三区| 裸体丰满少妇做受久久99精品| 欧美成人免费在线观看| 一区二区毛片| 国产亚洲精品久久久久久| 久久精品91久久久久久再现| 欧美va天堂在线| 午夜精品久久久久久99热| 久久精品一二三| 91久久在线视频| 国产精品高潮粉嫩av| 午夜精品久久久久久99热软件| 免费观看日韩av| 亚洲在线成人精品| 揄拍成人国产精品视频| 欧美经典一区二区| 亚洲午夜一区二区| 久久夜色精品国产欧美乱| 日韩亚洲在线观看| 国产模特精品视频久久久久| 久久一区国产| 亚洲女女女同性video| 亚洲国产成人高清精品| 亚洲综合日韩中文字幕v在线| 国内成+人亚洲+欧美+综合在线| 美女脱光内衣内裤视频久久网站| 亚洲午夜影视影院在线观看| 欧美69wwwcom| 久久精品日产第一区二区| 亚洲人久久久| 狠狠做深爱婷婷久久综合一区| 欧美久久电影| 久久精品首页| 亚洲一区影音先锋| 亚洲七七久久综合桃花剧情介绍| 国产精品你懂的在线| 久久婷婷人人澡人人喊人人爽| 一本久久青青| 亚洲国产欧洲综合997久久| 欧美一区二区三区免费大片| 亚洲欧洲在线一区| 国产一区自拍视频| 国产精品久久久一区二区| 欧美人妖在线观看| 久久青草福利网站| 小嫩嫩精品导航| 亚洲女同同性videoxma| 亚洲免费观看高清在线观看| 久久综合久久综合久久综合| 欧美尤物一区| 欧美在线免费观看| 午夜伦理片一区|