// 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,分別是:NodeAnimationTrack、NumericAnimationTrack、VertexAnimationTrack。
在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的動畫管理結構比較混亂。Entity,Skeleton,Animation,AnimationState,SkeletonInstance之間的依賴關係過於複雜,並且存在循環依賴。