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之间的依赖关系过于复杂,并且存在循环依赖。

 

 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值