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

天行健 君子當(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>
            亚洲精品免费在线观看| 小黄鸭视频精品导航| 久久久久久久久蜜桃| 美女视频黄免费的久久| 一片黄亚洲嫩模| 久久久蜜桃一区二区人| 亚洲国产一区二区三区青草影视 | 亚洲经典在线看| 亚洲美女免费精品视频在线观看| 美女日韩欧美| 欧美α欧美αv大片| 亚洲深夜福利网站| 午夜精品三级视频福利| 一区二区在线视频| 亚洲精品国久久99热| 欧美精品一区二区三区在线看午夜| 国产麻豆9l精品三级站| 久久精品国产精品亚洲精品| 欧美激情无毛| 亚洲影院在线| 亚洲图片欧洲图片av| 久久综合狠狠综合久久激情| 农村妇女精品| 亚洲欧美电影院| 久久亚洲精品欧美| 亚洲图片激情小说| 久久久久99精品国产片| 一区二区av在线| 欧美一区在线视频| 中文一区二区在线观看| 欧美一区二区三区日韩| 中国亚洲黄色| 老司机免费视频一区二区三区| 亚洲欧美日韩精品久久亚洲区| 久久精品一区蜜桃臀影院| 亚洲手机在线| 欧美成人久久| 久久精品一区二区国产| 亚洲精品永久免费精品| 亚洲狠狠婷婷| 亚洲欧美在线视频观看| 日韩一二在线观看| 久久高清一区| 亚洲欧美精品在线观看| 欧美成va人片在线观看| 久久免费的精品国产v∧| 欧美色大人视频| 欧美成人激情视频| 国产精品久久久久久久久久免费 | 久久精品麻豆| 欧美亚州在线观看| 日韩午夜免费视频| 亚洲精品四区| 免费日韩成人| 欧美成人午夜激情视频| 国产午夜精品理论片a级大结局 | 午夜视频一区二区| 欧美精品粉嫩高潮一区二区 | 亚洲午夜久久久久久久久电影院 | 99re热这里只有精品免费视频| 黑人一区二区三区四区五区| 午夜精品一区二区三区在线播放| 亚洲午夜未删减在线观看| 欧美人与禽猛交乱配| 亚洲国产影院| 一二三四社区欧美黄| 欧美—级在线免费片| 亚洲欧洲精品一区二区三区 | 亚洲一区久久| 在线中文字幕不卡| 久久av一区二区三区漫画| 欧美特黄一区| 亚洲午夜久久久| 亚洲欧美日韩国产一区| 国产精品免费看| 亚洲欧美日韩一区二区| 久久精品日产第一区二区| 狠狠88综合久久久久综合网| 久久日韩粉嫩一区二区三区| 欧美福利网址| 夜夜嗨av一区二区三区四季av | 亚洲精品你懂的| 在线天堂一区av电影| 欧美性色aⅴ视频一区日韩精品| 亚洲午夜久久久久久久久电影院 | 亚洲三级国产| 亚洲激情欧美激情| 欧美日韩成人在线播放| 在线视频中文亚洲| 久久视频免费观看| 亚洲精品一区在线| 国产精品美女久久福利网站| 午夜视频在线观看一区| 欧美激情第10页| 亚洲午夜极品| 精品成人国产| 国产精品白丝jk黑袜喷水| 欧美一二三视频| 亚洲欧洲日本一区二区三区| 午夜欧美精品| 最新国产成人av网站网址麻豆 | 久久久国产精品亚洲一区 | 亚洲国产裸拍裸体视频在线观看乱了| 一区二区三区日韩在线观看| 国产伦精品一区二区三区免费| 久久久久久9999| 一区二区三区视频在线观看| 久久久久久国产精品mv| 制服丝袜亚洲播放| 一色屋精品视频免费看| 国产精品av久久久久久麻豆网| 久久www免费人成看片高清| 99视频精品全国免费| 理论片一区二区在线| 午夜精品美女自拍福到在线 | 精品福利免费观看| 国产精品美女久久福利网站| 欧美不卡在线视频| 久久国产精品网站| 亚洲免费网站| 日韩天堂在线观看| 亚洲国产欧美一区二区三区同亚洲| 欧美一区二区三区免费观看| 一二三区精品| 久久久久久黄| 亚洲理论电影网| 久久青青草综合| 亚洲一区国产一区| 日韩视频一区二区三区在线播放免费观看| 久久蜜臀精品av| 欧美一区二区视频在线| 亚洲尤物视频网| 一区二区高清在线观看| 亚洲精品久久久久久久久久久久久 | 久久久精品动漫| 欧美一区二区福利在线| 亚洲与欧洲av电影| 亚洲一区免费网站| 亚洲桃花岛网站| 亚洲天堂av电影| 亚洲校园激情| 亚洲一区二区精品在线| 亚洲午夜av在线| 亚洲中午字幕| 亚洲主播在线播放| 亚洲综合色自拍一区| 99热精品在线观看| 欧美一区二区性| 一区二区三区黄色| 欧美午夜a级限制福利片| 欧美国产综合视频| 欧美了一区在线观看| 欧美精品一区二区三区很污很色的| 欧美不卡在线| 欧美极品色图| 欧美日韩在线视频一区| 欧美视频在线观看一区二区| 国产精品大片wwwwww| 国产精品自拍一区| 精品动漫3d一区二区三区| ●精品国产综合乱码久久久久 | 性欧美video另类hd性玩具| 午夜精品福利在线观看| 久久精品国产一区二区三| 久久伊人亚洲| 欧美精品免费在线观看| 欧美性理论片在线观看片免费| 国产精品腿扒开做爽爽爽挤奶网站 | 亚洲砖区区免费| 美女精品在线| 久久国产日本精品| 亚洲午夜av| 欧美一区在线直播| 欧美高潮视频| 国产精品乱码一区二区三区| 狠狠久久婷婷| 在线亚洲伦理| 老司机午夜精品视频| 99精品欧美一区| 久久国产高清| 欧美天堂亚洲电影院在线观看| 国产一区二区三区成人欧美日韩在线观看| 亚洲国产aⅴ天堂久久| 一区二区三区四区在线| 久久久噜噜噜久久中文字免| 亚洲国产婷婷| 欧美亚洲免费在线| 欧美日韩精品免费在线观看视频| 国产在线麻豆精品观看| 亚洲色图在线视频| 免费观看一级特黄欧美大片| 一区二区三区久久网| 欧美aa在线视频| 国产日产欧美a一级在线| 六月婷婷一区| 亚洲午夜激情在线| 亚洲女同性videos| 久久国产加勒比精品无码| 欧美 日韩 国产一区二区在线视频| 99伊人成综合|