Ogre學習筆記(8):骨骼動畫

       OGRE的基本動畫控制是很簡單的,設置一個動畫的操作是這樣:

       // Set idle animation

mAnimationState = ent->getAnimationState( "Idle" );  

mAnimationState->setLoop( true );

mAnimationState->setEnabled( true );

(上面這段代碼來自Intermediate Tutorial1 – Ogre Wiki)從一個Entity對象中得到AnimationState指針,然後設置一些屬性,在每幀需要調用:

       mAnimationState->addTime( evt.timeSinceLastFrame );

 

 

Skeleton的加載:

SkeletalApplication::createScene()

SkeletonPtr skel = SkeletonManager::getSingleton().load("jaiqua.skeleton",

                     ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);

這個語句用來讀取骨骼文件。讀取的操作在“Skeleton::loadImpl”函數中。此函數主要執行了兩步操作,一是調用“SkeletonSerializer::importSkeleton()”,二是“Load any linked skeletons”。動畫信息存儲在Skeleton的“AnimationList mAnimationsList”成員變量中。

Mesh類從存儲了一個“SkeletonPtr mSkeleton”, SkeletonPtr是一個“SharedPtr<Skeleton>”的派生類。在load一個mesh是:

MeshSerializerImpl::readMesh()――case M_MESH_SKELETON_LINK

――》MeshSerializerImpl::readSkeletonLink()
      
――》Mesh::setSkeletonName()
      
――》ResourceManager::load()――得到骨骼指針

Animation類的對象就是“An animation sequence”,各種類型的動畫序列都由這個類來管理。它管理了三種類型的Track list,分別是:NodeAnimationTrackNumericAnimationTrackVertexAnimationTrack

Entity的構造函數中,如果Mesh含有骨骼動畫或者頂點動畫,則會new一個AnimationStateSet對象,並調用“mesh->_initAnimationState(mAnimationState);”。

 

 

動畫的計算:

Entity中保存了一個SkeletonInstance對象指針,它是Skeleton的派生類。

主要運算就在“void Entity::updateAnimation(void)”函數中。

à Entity::cacheBoneMatrices
      
à Skeleton::setAnimationState
      
此函數先是調用“Skeleton::reset”,然後針對每個enabled animation state,找到其對應的Animation,然後調用Animation::apply()來計算每個Bone的狀態。

 

整體感覺OGRE的動畫管理結構比較混亂。EntitySkeletonAnimationAnimationStateSkeletonInstance之間的依賴關係過於複雜,並且存在循環依賴。

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章