• Ogre骨骼动画


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

  • 相关阅读:
    Freemarker空值判断
    php集成开发环境IDE
    mysql卸载
    Apache网站根目录
    冒泡排序
    线程操作
    通过滚轮改变图片大小
    Timer计时器
    写异常日志
    异常处理
  • 原文地址:https://www.cnblogs.com/hnfxs/p/3185370.html
Copyright © 2020-2023  润新知