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

天行健 君子當自強而不息

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) 評論(0)  編輯 收藏 引用

公告

導航

統計

常用鏈接

隨筆分類(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>
            久久男女视频| 影音先锋亚洲电影| 国产精品视频网址| 欧美中文在线视频| 亚洲视频图片小说| 亚洲第一黄网| 欧美激情视频一区二区三区在线播放| 欧美在线地址| 亚洲国产精选| 亚洲天堂成人| 亚洲精品一区二区三区不| 亚洲人体偷拍| 久久一区二区三区av| 久久精品国产综合| 日韩网站在线观看| 久久久久免费视频| 亚洲一区图片| 欧美v国产在线一区二区三区| 亚洲天天影视| 欧美日本不卡高清| 玖玖玖免费嫩草在线影院一区| 欧美v日韩v国产v| 美女主播一区| 国产精品美女久久久浪潮软件| 久久精品在线| 国产精品伦理| 中文精品99久久国产香蕉| 亚洲国产精品www| 欧美一级久久久| 性欧美办公室18xxxxhd| 欧美激情片在线观看| 欧美高清视频在线| 亚洲国产成人午夜在线一区| 久久久久久久综合| 久久视频一区| 国产一区二区高清视频| 亚洲清纯自拍| 极品少妇一区二区三区精品视频| 亚洲欧美区自拍先锋| 亚洲欧美久久久久一区二区三区| 欧美日韩亚洲综合在线| 美女精品一区| 亚洲五月婷婷| 亚洲免费高清| 欧美国产精品专区| 欧美一级片久久久久久久| 国产在线精品一区二区夜色| 美女国内精品自产拍在线播放| 欧美日本精品| 一区二区三区视频在线| 欧美日韩高清在线| 亚洲一级二级| 久久久精品一品道一区| 亚洲精品婷婷| 国产一区三区三区| 免费久久久一本精品久久区| 亚洲一区欧美| 亚洲日本免费电影| 久久国产精品电影| 亚洲欧洲在线免费| 久久久久在线| 亚洲肉体裸体xxxx137| 欧美在线免费观看| 亚洲欧洲日产国产网站| 国产综合久久久久久鬼色| 欧美大成色www永久网站婷| 亚洲欧美久久久久一区二区三区| 亚洲成色999久久网站| 欧美影院精品一区| 一区二区三区av| 亚洲精品在线视频| 国语自产精品视频在线看一大j8 | 国产日韩精品一区| 欧美午夜视频在线观看| 欧美精品一区二区三区四区| 欧美在线不卡| 久久精品人人| 久久久午夜电影| 久久精品系列| 欧美激情精品| 欧美另类一区二区三区| 欧美色一级片| 国产精品成人一区| 国产精品免费看片| 国产精品国产亚洲精品看不卡15| 欧美激情1区2区| 国产综合18久久久久久| 国产精品99久久久久久久久久久久| 欧美韩国在线| 国产精品人人爽人人做我的可爱| 国产精品尤物| 国产精品国产成人国产三级| 久久av二区| 欧美三级日本三级少妇99| 最新中文字幕一区二区三区| 蜜月aⅴ免费一区二区三区| 久久精品国产成人| 国产美女高潮久久白浆| 在线精品国产成人综合| 欧美一二区视频| 亚洲精品一区在线| 欧美在线精品一区| 欧美日韩一区综合| 亚洲国产美女| 欧美成va人片在线观看| 午夜国产精品影院在线观看| 免费美女久久99| 国产精品久久久久久久久免费桃花| 在线精品国产成人综合| 久久国产精品色婷婷| 亚洲一区在线看| 欧美午夜在线一二页| 亚洲私人黄色宅男| 亚洲欧美日韩爽爽影院| 国产亚洲美州欧州综合国| 一区二区在线观看视频在线观看| 欧美一区成人| 欧美在线综合视频| 亚洲黄色高清| 亚洲欧洲视频| 欧美成人精品1314www| 亚洲国产精品久久久久| 男女视频一区二区| 久久国产精品第一页| 狠狠干成人综合网| 欧美fxxxxxx另类| 欧美xxxx在线观看| 亚洲老司机av| 一本大道久久a久久综合婷婷| 欧美另类videos死尸| 午夜精品成人在线| 欧美中文字幕视频在线观看| 免费观看成人网| 男男成人高潮片免费网站| 一本久道久久久| 久久久久99| 欧美一区二区三区免费观看视频| 久久嫩草精品久久久久| 久久精品国产清自在天天线| 欧美国产日韩一区二区| 亚洲裸体在线观看| 久久综合久久综合久久| 久久久精品国产免大香伊| 欧美视频在线一区| 亚洲美女一区| 亚洲一二三区精品| 亚洲欧美日韩一区二区三区在线观看 | 久久成人免费电影| 蜜桃av噜噜一区| 久久久久成人精品免费播放动漫| 欧美精品色综合| 美女视频黄 久久| 国产欧美亚洲日本| 一区二区三区精品| 亚洲激情综合| 免费亚洲婷婷| 欧美 日韩 国产 一区| 国产亚洲综合精品| 亚洲免费视频网站| 亚洲女女女同性video| 欧美日韩在线免费观看| 亚洲国产高潮在线观看| 在线看无码的免费网站| 久久久久一区| 亚洲第一黄色| 亚洲天堂偷拍| 国产日本亚洲高清| 欧美在线观看一区二区| 久久久午夜视频| 在线观看中文字幕不卡| 美女主播精品视频一二三四| 欧美激情亚洲视频| 亚洲视频在线一区| 国产乱码精品一区二区三区av| 亚洲一级一区| 亚洲神马久久| 欧美成人在线免费观看| 亚洲欧洲一级| 久久久久国色av免费观看性色| 国内精品嫩模av私拍在线观看| 久久成人免费网| 在线亚洲伦理| 久久午夜精品| 亚洲在线一区二区三区| 国内精品久久国产| 欧美午夜不卡在线观看免费| 欧美一区二视频在线免费观看| 亚洲激情成人网| 久久麻豆一区二区| 亚洲欧美国产高清va在线播| 亚洲国产精品成人精品| 国产欧美在线观看| 欧美激情一区| 久久一区二区精品| 欧美一级片在线播放| 欧美一区二区三区久久精品茉莉花 | 午夜精品久久久久99热蜜桃导演| 欧美刺激午夜性久久久久久久| 久久精品国产一区二区电影| 亚洲午夜视频在线|