转自:http://blog.csdn.net/yanonsoftware/article/details/1281516

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

最新文章

  1. 原生JavaScript实现hasClass、addClass、removeClass、toggleClass
  2. POJ2104 K-th Number [分块做法]
  3. Win10 驱动装不上,提示:Windows 无法验证此设备所需的驱动程序的数字签名。该值受安全引导策略保护,无法进行修改或删除。
  4. Java中的弱引用
  5. Git保存密码
  6. sql server操作类(本人自己写的)
  7. 重新初始化 VS2010
  8. JS时间自动更新
  9. c# 修改appConfig文件节点
  10. Using Open Source Static Libraries in Xcode 4
  11. jquery api 笔记(2) 事件 事件对象
  12. hdu-1890-Robotic Sort splay区间翻转
  13. 错误 1 未能找到元数据文件“C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/wwwroot/7cb4fcd
  14. 随机数生成类Random用法
  15. 对.Net Core结合Docker和Jexus的实践
  16. Python &amp; 机器学习之项目实践
  17. Ubuntu16.04搭建kubernetes v1.11.2集群
  18. 新建虚拟机_XP系统(二)
  19. 『编程题全队』Alpha 阶段冲刺博客Day1
  20. EasyTouch的使用官方文档操作步骤

热门文章

  1. TPatch动态补丁系统(iOS)
  2. SAP 用事务码SQVI 做简单报表 .
  3. python 练习 3
  4. Windows NT访问权限
  5. Linux内核简介
  6. hdu 1805Expressions(二叉树构造的后缀表达式)
  7. 使用Node.js实现数据推送
  8. cycleInterpolator 循环加速器
  9. JSON生成c#类代码小工具(转)
  10. EF Code First:实体映射,数据迁移,重构(1)