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

天行健 君子當自強而不息

Using Key?Framed Skeletal Animation(3)

Assuming you want more than one animation set loaded at once, you can even create a class that contains an array (or rather, a linked list) of cAnimationSet classes, which means that you can access a whole slew of animations with one interface! This class, called cAnimationCollection, is also derived from the cXParser class, so you can parse .X files directly from the class in which you'll be storing the animations.

Here's the class declaration for cAnimationCollection:

class cAnimationCollection : public cXParser
{
public:
DWORD m_NumAnimationSets;
cAnimationSet *m_AnimationSets;
protected:
// Parse an .X file object
BOOL ParseObject(IDirectXFileData *pDataObj,
IDirectXFileData *pParentDataObj,
DWORD Depth,
void **Data, BOOL Reference);
public:
cAnimationCollection();
~cAnimationCollection();
	BOOL Load(char *Filename);
void Free();
void Map(D3DXFRAME *RootFrame);
void Update(char *AnimationSetName, DWORD Time);
};

The details of each function in the cAnimationCollection class are not very important at this point so I'll get back to them in a bit. At this point, all you're interested in is reading in that animation data from an .X file. The custom .X parser contained in the cAnimationCollection class does just that, it loads the data from the Animation objects' data into the dizzying array of objects you've just seen.

For every AnimationSet object you encounter in the .X file being parsed, you need to allocate a cAnimationSet class and add it to the linked list of animation sets already loaded. The most current cAnimationSet object is stored at the start of the linked list, which makes it easy to determine which animation−set data you are currently using.

From here, you can appropriately parse the Animation objects. If you were to keep the most current cAnimationSet object at the start of your linked list, every following Animation object that you parse would belong to that animation−set object. The same goes for the AnimationKey objects, their data would belong to the first cAnimation object in the linked list.

I will skip the constructors and destructors for all the different classes because you only need them to clear and release each class's data. You're only interested in a couple functions, the first being cAnimationCollection::ParseObject, which deals with each animation object being parsed from an .X file.

The ParseObject function starts by checking whether the currently enumerated object is an AnimationSet. If it is, a new cAnimationSet object is allocated and linked to the list of objects, while the animation−set object is simultaneously named for further reference.

BOOL cAnimationCollection::ParseObject( 
IDirectXFileData *pDataObj,
IDirectXFileData *pParentDataObj,
DWORD Depth,
void **Data, BOOL Reference)
{
const GUID *Type = GetObjectGUID(pDataObj);
DWORD i;
	// Check if object is AnimationSet type
if(*Type == TID_D3DRMAnimationSet) {
// Create and link in a cAnimationSet object
cAnimationSet *AnimSet = new cAnimationSet();
AnimSet−>m_Next = m_AnimationSets;
m_AnimationSets = AnimSet;
		// Increase # of animation sets
m_NumAnimationSets++;
		// Set animation set name (set a default one if none)
if(!(AnimSet−>m_Name = GetObjectName(pDataObj)))
AnimSet−>m_Name = strdup("NoName");
}

As you can see, nothing special goes on with the animation set objects, you're merely allocating an object that will eventually hold the upcoming Animation data objects. Speaking of which, you want to parse the Animation objects next.

// Check if object is Animation type
if(*Type == TID_D3DRMAnimation && m_AnimationSets) {
// Add a cAnimation class to top−level cAnimationSet
cAnimation *Anim = new cAnimation();
Anim−>m_Next = m_AnimationSets−>m_Animations;
m_AnimationSets−>m_Animations = Anim;
	// Increase # of animations
m_AnimationSets−>m_NumAnimations++;
}

Again, nothing special going on there. In the preceding code, you're simply ensuring that there's a cAnimationSet object allocated at the start of the linked list. If there is, you can allocate and link a cAnimation object to the list in the cAnimationSet object.

While we're on the topic of the cAnimation object, the next bit of code retrieves the name of the frame instance located within the Animation object.

// Check if a frame reference inside animation object
if(*Type == TID_D3DRMFrame && Reference == TRUE && m_AnimationSets && m_AnimationSets−>m_Animations) {
// Make sure parent object is an Animation object
if(pParentDataObj && *GetObjectGUID(pParentDataObj) == TID_D3DRMAnimation) {
// Get name of frame and store it as animation
if(!(m_AnimationSets−>m_Animations−>m_Name = GetObjectName(pDataObj)))
m_AnimationSets−>m_Animations−>m_Name=strdup("NoName");
}
}

You can see in this code that only referenced frame objects are allowed in the Animation object, a fact that you can verify by checking the parent object's template GUID. Whew! So far this code is pretty easy, isn't it? Well, I don't want to burst your bubble, but the hardest is yet to come! In fact, the most difficult part of loading animation data from an .X file is loading the key data. Don't let me scare you away, though; the key data is nothing more than a time value and an array of values that represent the key data.

The remaining code in the ParseObject function checks to see which type of key data an AnimationKey object holds. Depending on the type of data, the code branches off and reads the data into the specific key objects (m_RotationKeys, m_TranslationKeys, m_ScaleKeys, and m_MatrixKeys) inside the current cAnimation object. Take a closer look to see how simple this code really is.

// Check if object is AnimationKey type
if(*Type == TID_D3DRMAnimationKey && m_AnimationSets && m_AnimationSets−>m_Animations) {
// Get a pointer to top−level animation object
cAnimation *Anim = m_AnimationSets−>m_Animations;
	// Get a data pointer
DWORD *DataPtr = (DWORD*)GetObjectData(pDataObj, NULL);
	// Get key type
DWORD Type = *DataPtr++;
	// Get # of keys to follow
DWORD NumKeys = *DataPtr++;

In addition to checking to see whether there are valid cAnimationSet and cAnimation objects at the start of the linked list of objects, the preceding code gets a pointer to the key data and pulls out the key type value and the number of keys to follow. Using the key type, the code then branches off to allocate the key−frame objects and load in the key data.

// Branch based on key type
switch(Type) {
case 0: // Rotation
delete [] Anim−>m_RotationKeys;
Anim−>m_NumRotationKeys = NumKeys;
Anim−>m_RotationKeys = new cAnimationQuaternionKey[NumKeys];
	for(i=0;i<NumKeys;i++) {
// Get time
Anim−>m_RotationKeys[i].m_Time = *DataPtr++;
		if(Anim−>m_RotationKeys[i].m_Time > m_AnimationSets−>m_Length)
m_AnimationSets−>m_Length = Anim−>m_RotationKeys[i].m_Time;
		// Skip # keys to follow (should be 4)
DataPtr++;
		// Get rotational values
		float *fPtr = (float*)DataPtr;
		Anim−>m_RotationKeys[i].m_quatKey.w = *fPtr++;
Anim−>m_RotationKeys[i].m_quatKey.x = *fPtr++;
Anim−>m_RotationKeys[i].m_quatKey.y = *fPtr++;
Anim−>m_RotationKeys[i].m_quatKey.z = *fPtr++;
		DataPtr+=4;
}
	break;

You'll recall from earlier in this chapter that rotation keys use quaternion values. These values are stored in w, x, y, z order; to make sure you use the proper values, you must read them into the key's quaternion object appropriately.

Next comes the code to load in the scaling and translation keys, which both use vectors to store the x−, y−, and z−axis information.

case 1: // Scaling
delete [] Anim−>m_ScaleKeys;
Anim−>m_NumScaleKeys = NumKeys;
Anim−>m_ScaleKeys = new cAnimationVectorKey[NumKeys];
	for(i=0;i<NumKeys;i++) {
// Get time
Anim−>m_ScaleKeys[i].m_Time = *DataPtr++;
		if(Anim−>m_ScaleKeys[i].m_Time > m_AnimationSets−>m_Length)
m_AnimationSets−>m_Length = Anim−>m_ScaleKeys[i].m_Time;
		// Skip # keys to follow (should be 3)
DataPtr++;
		// Get scale values
D3DXVECTOR3 *vecPtr = (D3DXVECTOR3*)DataPtr;
Anim−>m_ScaleKeys[i].m_vecKey = *vecPtr;
DataPtr+=3;
}
	break;
case 2: // Translation
delete [] Anim−>m_TranslationKeys;
Anim−>m_NumTranslationKeys = NumKeys;
Anim−>m_TranslationKeys = new cAnimationVectorKey[NumKeys];
	for(i=0;i<NumKeys;i++) {
// Get time
Anim−>m_TranslationKeys[i].m_Time = *DataPtr++;
		if(Anim−>m_TranslationKeys[i].m_Time > m_AnimationSets−>m_Length)
m_AnimationSets−>m_Length = Anim−>m_TranslationKeys[i].m_Time;
		// Skip # keys to follow (should be 3)
DataPtr++;
		// Get translation values
D3DXVECTOR3 *vecPtr = (D3DXVECTOR3*)DataPtr;
Anim−>m_TranslationKeys[i].m_vecKey = *vecPtr;
DataPtr+=3;
}
	break;

Last is the code to read an array of transformation matrix keys.

	case 4: // Transformation matrix
delete [] Anim−>m_MatrixKeys;
Anim−>m_NumMatrixKeys = NumKeys;
Anim−>m_MatrixKeys = new cAnimationMatrixKey[NumKeys];
		for(i=0;i<NumKeys;i++) {
// Get time
Anim−>m_MatrixKeys[i].m_Time = *DataPtr++;
			if(Anim−>m_MatrixKeys[i].m_Time > m_AnimationSets−>m_Length)
m_AnimationSets−>m_Length = Anim−>m_MatrixKeys[i].m_Time;
			// Skip # keys to follow (should be 16)
DataPtr++;
			// Get matrix values
D3DXMATRIX *mPtr = (D3DXMATRIX *)DataPtr;
Anim−>m_MatrixKeys[i].m_matKey = *mPtr;
DataPtr += 16;
}
		break;
}
}

Okay now, take a quick breather and look back at what you've just accomplished. So far, you've processed every AnimationSet, Animation, and AnimationKey object (not to mention referenced Frame objects that contain the bones' names), plus you've loaded the key objects full of the animation data. You're almost ready to start animating!

Almost is right; there is one small step left: matching the animation objects to their respective bone objects.


posted on 2008-04-24 19:27 lovedday 閱讀(289) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統(tǒng)計

常用鏈接

隨筆分類(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>
            亚洲一区二区三区精品在线| 亚洲自啪免费| 另类图片综合电影| 香蕉成人久久| 国产伪娘ts一区| 久久这里只有| 老司机午夜精品视频在线观看| 韩日欧美一区二区| 欧美激情亚洲| 欧美四级剧情无删版影片| 亚洲制服少妇| 久久99在线观看| 精品成人在线观看| 亚洲国产精品99久久久久久久久| 欧美黄色视屏| 亚洲一区二区三区四区在线观看| 亚洲午夜激情免费视频| 国产视频一区二区三区在线观看| 久久人人爽人人爽爽久久| 久久美女性网| 亚洲综合日韩在线| 久久米奇亚洲| 亚洲在线中文字幕| 巨胸喷奶水www久久久免费动漫| 亚洲精品视频一区| 午夜精品短视频| 亚洲日本免费| 亚洲欧美亚洲| 亚洲激情在线播放| 亚洲综合色在线| 亚洲精品国产拍免费91在线| 亚洲图片欧美一区| 亚洲国产精品一区二区久| 在线综合亚洲| 亚洲精品韩国| 久久狠狠婷婷| 午夜精品影院在线观看| 欧美不卡在线视频| 久久青草久久| 国产精品一香蕉国产线看观看| 亚洲国产欧美一区二区三区丁香婷| 国产乱码精品一区二区三区五月婷| 欧美不卡视频一区| 国产欧美一区二区三区国产幕精品 | 国产精品毛片一区二区三区| 久久亚洲欧美| 国产伦精品一区二区三区| 亚洲人成艺术| 亚洲黄页视频免费观看| 久久成人这里只有精品| 亚洲欧美在线aaa| 欧美日韩视频在线第一区| 欧美成人精品影院| 国语精品中文字幕| 亚洲欧美久久久| 亚洲欧美国产精品va在线观看| 欧美不卡三区| 亚洲高清一区二| 亚洲国产另类久久久精品极度| 欧美在线影院在线视频| 午夜久久久久久| 国产精品乱码人人做人人爱| 99精品99| 亚洲伊人网站| 国产精品videosex极品| 亚洲美女在线视频| 在线视频免费在线观看一区二区| 欧美高清你懂得| 亚洲大片精品永久免费| 亚洲人体大胆视频| 欧美成人免费视频| 亚洲精品久久久久| 99亚洲一区二区| 欧美日韩在线视频观看| 中日韩视频在线观看| 亚洲欧美在线免费观看| 国产精品免费久久久久久| 亚洲免费在线精品一区| 欧美中文字幕精品| 国产一区二区三区免费不卡| 久久国产精品网站| 欧美成人xxx| 亚洲免费成人av电影| 欧美女同视频| 日韩一区二区免费看| 亚洲一区二区网站| 国产区二精品视| 久久久亚洲一区| 亚洲人成人一区二区三区| 一区二区三区欧美在线观看| 国产精品乱码一区二区三区| 欧美一区二区三区四区在线观看地址| 久久九九久久九九| 亚洲国产一区二区三区青草影视| 欧美精品99| 亚洲女人小视频在线观看| 老巨人导航500精品| 一本色道久久综合亚洲二区三区| 国产精品一区二区女厕厕| 久久久久久久欧美精品| 日韩午夜在线| 美女主播精品视频一二三四| 一区二区三区av| 激情亚洲一区二区三区四区| 欧美激情视频在线播放| 亚洲综合精品四区| 亚洲国产欧美一区| 久久国产日韩| 亚洲视频中文| 亚洲第一精品夜夜躁人人躁| 欧美日韩综合精品| 老司机午夜精品视频| 亚洲一区二区四区| 亚洲国产欧美久久| 狼人天天伊人久久| 欧美在线免费视频| 正在播放欧美一区| 亚洲国产精品ⅴa在线观看| 国产精品热久久久久夜色精品三区| 久久婷婷亚洲| 午夜欧美不卡精品aaaaa| 亚洲精品欧美一区二区三区| 另类图片综合电影| 久久国产毛片| 性欧美长视频| 一区二区毛片| 亚洲国产视频直播| 影音先锋欧美精品| 国产午夜久久久久| 欧美日韩在线观看一区二区三区 | 欧美在线高清| 亚洲一区二区黄| av成人免费| 亚洲国产精品久久久久秋霞蜜臀 | 在线亚洲欧美视频| 亚洲国产欧美在线人成| 国产综合自拍| 国产亚洲毛片在线| 国产精品视频yy9299一区| 欧美日韩免费一区二区三区| 欧美精品videossex性护士| 你懂的亚洲视频| 免费在线日韩av| 老司机aⅴ在线精品导航| 久久久久国产精品麻豆ai换脸| 久久爱www.| 老牛影视一区二区三区| 久久综合色8888| 蜜桃av一区二区三区| 久久综合九色综合欧美狠狠| 久久久噜噜噜久噜久久| 久久免费高清视频| 牛牛国产精品| 欧美激情1区2区3区| 欧美韩国在线| 欧美日韩中文精品| 国产精品三级视频| 国产在线观看91精品一区| 国产一区二区在线观看免费播放| 国产一区二区三区奇米久涩| 激情久久久久久| 91久久精品一区二区别| 亚洲乱码国产乱码精品精可以看 | 欧美亚洲免费| 久久精品国产亚洲精品| 久久九九国产精品| 亚洲大片精品永久免费| 亚洲人成在线观看| 亚洲一区二区三区在线| 久久国产精品免费一区| 欧美激情第三页| 国产精品伊人日日| 亚洲国产精品久久91精品| 99精品免费| 久久久久久高潮国产精品视| 欧美11—12娇小xxxx| 一本色道久久| 久久久亚洲人| 国产精品99免费看| 又紧又大又爽精品一区二区| 日韩一级不卡| 久久久久久91香蕉国产| 亚洲人成网站在线播| 性做久久久久久久久| 免费看亚洲片| 国产欧美精品日韩精品| 亚洲欧洲日本在线| 久久国产精品亚洲77777| 亚洲国产美女久久久久| 小嫩嫩精品导航| 欧美日韩精品不卡| 伊人成人在线视频| 亚洲欧美日韩精品一区二区 | 亚洲欧美高清| 欧美国产精品久久| 欧美一区二区三区的| 欧美日韩一区综合| 亚洲精品乱码久久久久久黑人| 欧美一区二区三区在线观看| 亚洲精品国产品国语在线app|