Ogre实时动画的制作过程

138 篇文章 0 订阅

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

 

 
Ogre作为一个强大的图形引擎,很好的支持骨骼动画,主要包括:(1)提供了从.max模型导出到.mesh和.skeleton动画文件的工具;(2)支持软硬件顶点混合技术,也就是Vertex Blending。关于这两个方面的阐述颇多,在此不再叙述。

       此外,Ogre的程序还可以方便的手动控制骨骼运动,也就是不利用.mesh和.skeleton中的骨骼关键桢,而是直接用函数调用来控制。这样做可以使动画更加灵活,例如使人物的头部随着某个目标物体的移动而转动,当然你还可以通过外部输入(例如鼠标)来控制骨骼。手动控制骨骼的方法如下:

        (1)在初始化( 如CreateScene() )时,做以下工作:

                     Entity *ent = mSceneMgr->createEntity("Sample", "Sample.mesh");
                     SkeletonInstance* skel = ent->getSkeleton();
                     manuallyControlledBone = skel->getBone("Bone01");
                     manuallyControlledBone->setManuallyControlled(true);

        (2)在每桢循环( 如FrameStarted() )时加上控制骨骼的函数:

                     manuallyControlledBone->yaw(Degree(evt.timeSinceLastFrame*100));

       好了,就这么简单!

       如果想在手动控制的同时利用.mesh和.skeleton的骨骼动画,同样简单,只需在上述代码中加上几行就可以了(着色内容):

(1)Entity *ent = mSceneMgr->createEntity("Sample", "Sample.mesh"); SkeletonInstance* skel = ent->getSkeleton(); Animation* anim = skel->getAnimation("Hit"); manuallyControlledBone = skel->getBone("Bone01"); manuallyControlledBone->setManuallyControlled(true); anim->destroyTrack(manuallyControlledBone->getHandle());//不能少
(2)mAnimState->addTime(evt.timeSinceLastFrame);
manuallyControlledBone->yaw(Degree(evt.timeSinceLastFrame*100));
3DS MAX是一个强大通用的建模工具,能方便的制作骨骼动画。Ogre是一个开源的图形引擎,在骨骼动画方面支持Vertex blending,它也提供了对多种模型的导入,当然少不了3DS MAX模型。

       在此我将叙述从3DS MAX建立模型,到最终利用此模型在OGRE中制作实时动画的全过程。本文只给出各个步骤,对每个步骤的实现细节不予叙述。

       首先当然是安装3DS MAX和OGRE SDK,另外特别值得一提的是需要安装OGRE为导出.MAX文件而制作的插件。安装后在3DS MAX的菜单中可以看到(你也可以在MAX中设置OGRE工具栏)。具体安装方法可在网上搜索或在OGRE网站查看。

       接着,就是在3DS MAX中建立模型了。第一,需要建立网格模型;第二,建立骨骼,并为网格顶点绑定骨骼。这里一定要细心调整骨骼权值。具体方法可查看MAX的一些教程。

       然后,你需要利用前面安装的插件将.max文件导出成.mesh和.skeleton文件,以供OGRE使用。方法是在MAX菜单max script下选择ogre exporter,然后根据弹出的插件对话框适当设置后,将.max文件导出为.mesh.xml和.skeleton.xml文件(注意它们都是.xml文件),由于是.xml文件因此可以很方便的查看文件数据,接下来要利用ogre的命令行工具xmlconverter.exe将.mesh.xml和.skeleton.xml文件转换为.mesh和.skeleton文件(这两个正是ogre要用的文件)。

       最后,就是在OGRE中显式加载.mesh文件,而对应的.skeleton文件会被自动加载,接下来你就可以调用OGRE中的函数来实现实时动画了。可以调用函数来调用在max模型中指定的动画(如走路、射击等),方法请参看OGRE教程;还可以调用函数来手动控制骨骼而生成动画,具体方法请参看本BLOG中的另一篇文章《OGRE中手动控制骨骼的方法》。在实现这些动画时,OGRE都默认的采用了VERTEX BLENDING技术。

       以上就是从MAX建模到OGRE实时动画的制作过程了。

转自:http://blog.csdn.net/pizi0475/article/details/5356261

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值