Ogre动画加载之节点动画、mesh动画及骨骼动画加载方法

在Max中,动画分为两种动画,即Node Animations动画及Mesh Animations动画:

导出文件之后,Node Animations动画是在xx.scene文件中,

<node name="huosaixinganzuzhong_qinang_Catheterization">
            <position x="-14.3185" y="84.3693" z="39.3585"/>
            <scale x="0.641439" y="0.64144" z="0.64144"/>
            <rotation qx="-0.00690901" qy="-0.338498" qz="-0.205336" qw="0.918264"/>
            <animations>
                <animation name="huosaixinganzuzhong_qinang_Catheterization_Anhuosaixinganzu_qinang_Catheterization" enable="false" loop="false" interpolationMode="linear" rotationInterpolationMode="linear" length="10">
                    <keyframe time="0">
                        <translation x="-14.3185" y="84.3693" z="39.3585"/>
                        <rotation qx="-0.00690901" qy="-0.338498" qz="-0.205336" qw="0.918264"/>
                        <scale x="0.641439" y="0.64144" z="0.64144"/>
                    </keyframe>
                    <keyframe time="0.25">
                        <translation x="-14.3185" y="84.3693" z="39.3585"/>
                        <rotation qx="-0.00690901" qy="-0.338498" qz="-0.205336" qw="0.918264"/>
                        <scale x="0.641439" y="0.64144" z="0.64144"/>
                    </keyframe>
                    <keyframe time="0.5">
                        <translation x="-14.3185" y="84.3693" z="39.3585"/>
                        <rotation qx="-0.00690901" qy="-0.338498" qz="-0.205336" qw="0.918264"/>
                        <scale x="0.641439" y="0.64144" z="0.64144"/>
                    </keyframe>
                 <span style="white-space:pre">	</span>......................
                    <keyframe time="10">
                        <translation x="-14.3185" y="84.3693" z="39.3585"/>
                        <rotation qx="-0.00690901" qy="-0.338498" qz="-0.205336" qw="0.918264"/>
                        <scale x="0.641439" y="0.64144" z="0.64144"/>
                    </keyframe>
                </animation>
            </animations>
            <node name="huosaixinganzhong_qinang_Catheterization">
                <position x="1.80421" y="-1.25923" z="-3.50464"/>
                <scale x="0.81164" y="1.09026" z="0.811641"/>
                <rotation qx="-0.680035" qy="-0.241997" qz="-0.317626" qw="0.614901"/>
                <entity name="huosaixinganzhong_qinang_Catheterization" castShadows="true" receiveShadows="true" meshFile="huosaixinganzhong_qinang_Catheterization.mesh">
                    <subentities>
                        <subentity index="0" materialName="12-Default_qinang_Catheterization"/>
                    </subentities>
                </entity>
                <animations>
                    <animation name="huosaixinganzhong_qinang_Catheterization_Anhuosaixinganzu_qinang_Catheterization" enable="false" loop="false" interpolationMode="linear" rotationInterpolationMode="linear" length="10">
                        <keyframe time="0">
                            <translation x="1.80421" y="-1.25923" z="-3.50464"/>
                            <rotation qx="-0.680035" qy="-0.241997" qz="-0.317626" qw="0.614901"/>
                            <scale x="0.81164" y="1.09026" z="0.811641"/>
                        </keyframe>
                        <keyframe time="0.25">
                            <translation x="2.00894" y="-1.29527" z="-3.69881"/>
                            <rotation qx="-0.680035" qy="-0.241997" qz="-0.317626" qw="0.614901"/>
                            <scale x="0.81164" y="1.09026" z="0.811641"/>
                        </keyframe>
                        <keyframe time="0.5">
                            <translation x="2.21368" y="-1.33129" z="-3.89296"/>
                            <rotation qx="-0.680035" qy="-0.241997" qz="-0.317626" qw="0.614901"/>
                            <scale x="0.81164" y="1.09026" z="0.811641"/>
                        </keyframe>
                        <keyframe time="0.75">
                            <translation x="2.41842" y="-1.36732" z="-4.08713"/>
                            <rotation qx="-0.680035" qy="-0.241997" qz="-0.317626" qw="0.614901"/>
                            <scale x="0.81164" y="1.09026" z="0.81164"/>
                        </keyframe>
                        <keyframe time="1">
                            <translation x="2.62315" y="-1.40336" z="-4.2813"/>
                            <rotation qx="-0.680035" qy="-0.241997" qz="-0.317626" qw="0.614901"/>
                            <scale x="0.81164" y="1.09026" z="0.811641"/>
                        </keyframe>
                        <keyframe time="1.25">
                            <translation x="2.82789" y="-1.43939" z="-4.47546"/>
                            <rotation qx="-0.680035" qy="-0.241997" qz="-0.317626" qw="0.614901"/>
                            <scale x="0.81164" y="1.09026" z="0.811641"/>
                        </keyframe>
                        ...................
                        </animation>
                    </animations>
                </node>
            </node>
        </node>

其中,动画为组动画,上例代码中大组为:huosaixinganzuzhong_qinang_Catheterization,其中包含一个实体:huosaixinganzhong_qinang_Catheterization及一个小组youshouzuzhong_qinang_Catheterization,而小组youshouzuzhong_qinang_Catheterization中又包含一个实体youshouzhong。

上述代码为Node Animations动画,其中含有骨骼动画,在组动画中,在设置动画名称时,如果设置的是组(不管是大组,还是大组中的小组),一经设置,该组中的所有实体都具有相同设置,如果不想具有统一设置,需设置到具体的实体。

而Mesh Animations动画设置后,相关动画信息是保存于实体mesh文件中,通过OgreXMLConverter.exe程序打开mesh文件,我们可以发现文件中的动画信息如下:

<animations>
        <animation name="Anqinang_qinang_Catheterization" length="3.33333">
            <tracks>
                <track target="submesh" index="0" type="morph">
                    <keyframes>
                        <keyframe time="0">
                            <position x="-1.58943" y="1.58688" z="4.40104" />
                            <position x="-1.58157" y="1.54572" z="4.36043" />
                            <position x="-1.53318" y="1.50714" z="4.41092" />
                            <position x="-1.53318" y="1.50714" z="4.41092" />
                            <position x="-1.54067" y="1.54639" z="4.44964" />
                            <position x="-1.58943" y="1.58688" z="4.40104" />
                            <position x="-1.57888" y="1.63509" z="4.43217" />
<span style="white-space:pre">			</span>    ............
                            <position x="-1.4892" y="1.46244" z="4.46453" />
                            <position x="-1.49738" y="1.46591" z="4.45844" />
                            <position x="-1.49738" y="1.46591" z="4.45844" />
                            <position x="-1.47142" y="1.43938" z="4.41488" />
                            <position x="-1.46384" y="1.43652" z="4.42197" />
                            <position x="-1.42566" y="1.42693" z="4.38227" />
                            <position x="-1.46384" y="1.43652" z="4.42197" />
                            <position x="-1.47142" y="1.43938" z="4.41488" />
                            <position x="-1.47142" y="1.43938" z="4.41488" />
                            <position x="-1.43234" y="1.42957" z="4.37424" />
                            <position x="-1.42566" y="1.42693" z="4.38227" />
                        </keyframe>
                    </keyframes>
                </track>
            </tracks>
        </animation>
    </animations>

现在分别介绍三种动画:骨骼动画、节点动画(Node Animations)和实体动画(Mesh Animations)的加载方法。

1、骨骼动画:一旦含有骨骼的实体,如果想要展现max中该有的动作,仅仅加载实体是不够的,必须将相应的动画加载进去,而骨骼动画实质上归属于实体动画,设置方式和实体动画一样,只是不需要设置动画时间。

加载方式如下:

Ogre::SceneManager* m_pSceneManager;
	Ogre::SceneNode *scenenode;
	Ogre::Entity *ent;
	Ogre::Node *node;
	Ogre::AnimationState *m_anXiaoduguan_Zuoshou;
	if((m_pSceneManager->hasSceneNode("zuoshou_qinang_Catheterization")))
	{
		ent = m_pSceneManager->getEntity("zuoshou_qinang_Catheterization");//获取实体
		m_anXiaoduguan_Zuoshou = ent->getAnimationState("Anzuoshou");//获取动画,动画名称为Anzuoshou
		m_anXiaoduguan_Zuoshou->setLoop(true);//设置动画循环播放
		m_anXiaoduguan_Zuoshou->setEnabled(true);//设置动画使能,使动画能够被播放
	}

注:实体动画,必须通过获取实体。

2、节点动画:

由于节点动画信息是保存在scene文件中,所以需要从scene文件中加载,加载方式如下:

先初始化:

Ogre::SceneManager* m_pSceneManager;
	Ogre::SceneNode *scenenode;
	Ogre::Entity *ent;
	Ogre::Node *node;
	Ogre::AnimationState *m_anXiaoduguan_Zuoshou;
	if (m_pSceneManager->getSceneNode("huosaixinganzuzhong_qinang_Catheterization"))
	{
		m_anXiaoduguan_Huisaixinganzu = m_pSceneManager->getAnimationState("huosaixinganzhong_qinang_Catheterization_Anhuosaixinganzu_qinang_Catheterization");
		m_anXiaoduguan_Huisaixinganzu->setEnabled(true);
		m_anXiaoduguan_Huisaixinganzu->setLoop(false);

		m_anXiaoduguan_Youshouzu = m_pSceneManager->getAnimationState("youshouzhong_Anhuosaixinganzu_qinang_Catheterization");
		m_anXiaoduguan_Youshouzu->setEnabled(true);
		m_anXiaoduguan_Youshouzu->setLoop(false);
	}

在设置动画时间,如我们如通过slider来控制我们的动画,slider传来的值为n。那么时间加载如下:

double dTimeNode = 3.33f/100*n;//3.33f为动画的总时间,如果需要动画加载快或者慢,通过在max中控制动画的帧数来控制
m_anXiaoduguan_Huisaixinganzu->setTimePosition(dTimeNode);

3、实体动画:

实体动画的初始化方式和骨骼动画一致,不再赘述。

而时间加载一般通过

bool frameRenderingQueued(const Ogre::FrameEvent& evt);

函数控制,也可以自己设定时间,如果通过上述函数控制,控制方式一般如下:

_aniStateXishou->addTime(evt.timeSinceLastFrame);
m_time += evt.timeSinceLastFrame;

实体动画时间加载方式多变,需根据自我需求,自我设定。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-03 19:15:02

Ogre动画加载之节点动画、mesh动画及骨骼动画加载方法的相关文章

[寒江孤叶丶的Cocos2d-x之旅_39]Cocos骨骼动画功能解密

原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列] 博客地址:http://blog.csdn.net/qq446569365 原创文章,首发地址:http://www.cocos.com/cocos/dynamic/2015/0908/82.html 在游戏中,人物的各种动作是必不可少,一般实现人物动作的方式有两种,序列帧动画或骨骼动画.Cocos在更新到2.x版本之后,便没有了骨骼动画的功能,使得开发者非常困扰.终于在本次更新中,Cocos编辑器将骨骼动画添加

cocos2dx - v2.3.3编辑器骨骼动画

接上一节内容:cocos2dx - v2.3.3编辑器简单使用及不同分辨率适配 本节主要Cocos骨骼动画的创建及使用 一.新建 用Cocos Studio工具新建一个状态栏项目.如下图: 当然也可以新建一个空的Cocos项目,然后在 文件->新建文件 中选择骨骼动画来创建新的骨骼动画,如下图 因为这里只讲简单用法,着重使用,所有直接创建英雄示例动画. 二.添加动画 选择动画模式,并点击如下播放按钮,可以看到现在默认的动画. 示例中只有ALL动画,我们需要将每个动画按起始结束帧率分开,添加如下动

cocosudio 骨骼动画制作

首先 基本步骤转官方文档 后续 学习实现 新建骨骼动画 首先点击屏幕右上角的 文件->新建文件(快捷键:Command+N),打开如下界面,选择骨骼动画,点创建: 主界面介绍 首先我们需要了解一下编辑器界面中各个部分的功能, 我们常用的空间的位置已经不需要使用了 1.资源列表,这里显示你项目中所有资源,如果想编辑骨骼,首先需要将骨骼动画的图片导入进来. 2.渲染区域,也就是我们的画布.这里是资源布局的编辑区域,在这个区域可以各个图片和骨骼进行移动,缩放,旋转的操作,所有的图片.骨骼.动画的绑定与

layaAir引擎制作游戏的图集动画、时间轴动画、和骨骼动画总结二

一.角色序列帧.ani动画的制作 1.在项目管理器中创建动画文件 2.创建动画模板,编辑动效名称 3.编辑序列帧动画 .ani格式动画的代码控制 1.动画加载loadAnmition() 2.播放与停止.动效模板切换 3.动画帧位置控制 4.动画播放完成事件 uui截图: Laya.init(1334, 750); Laya.loader.load(["res/comp.atlas","res/role.atlas"],Laya.Handler.create(thi

LayaAir之骨骼动画(基础)

LayaAir可以是用DragonBone和Spine生成的骨骼动画文件,但是需要将他们的动画文件进行转化,转化后的文件才能够被LayaAir识别.而无论是DragonBone还是Spine都不是LayaAir官方工具,转化的安全和兼容性有些问题,这是一个坑.到目前为止此转化有2个问题:①对版本的支持 , 存在迟滞性②只支持图集模式无论怎么样 , 总算是部分支持 . 现在先以DragonBone为例讲解骨骼动画.Ⅰ, DragonBone骨骼动画 , 以Rooster_Ani为例:一 : 开始导

3DSMAX 中的CS 骨骼动画插件初探

王玉培 郑利平1 合肥工业大学计算机与信息学院VCC 研究室, 合肥 230009 摘要:首先介绍了3DSMAX 中的CS 骨骼动画制作方法,通过Biped 骨架可以快速方便的制 作两足动物的动画.并介绍了基于3DSMAX SDK 的插件开发,SDK 中类库的组织方式和3DSMAX 的场景组织,最后介绍了和3D引擎密切相关的骨骼动画导出插件的开发过程. 关键词:骨骼动画 插件开发 Biped Preliminary Study on the CS Skeletal Animation Plug-

cocos2dx 2.2.1 骨骼动画使用

使用骨骼动画: // 加载资源文件 png 图片,plist 文件和 ExportJson 动画文件,一般而言可以在场景运行之初加载此资源 CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("resTest/Hero/Hero.ExportJson"); CCArmature* _pArrmature = CCArmature::create("Hero"); _pA

【Away3D代码解读】(五):动画模块及骨骼动画

动画模块核心存放在away3d.animators包里: Away3D支持下面几种动画格式: VertexAnimator:顶点动画 SkeletonAnimator:骨骼动画 UVAnimator:UV动画 SpriteSheetAnimator:二维切换动画 ParticleAnimator:粒子动画 PathAnimator:路径动画 这几种动画都有各自的特点及应用场景,一般而在3D游戏中应用得最广泛的是骨骼动画,因为骨骼动画是人物动画的核心,我们下半段会专门详解这个动画: 动画简介 核心

Unity Spine Skeleton Animation 2D骨骼动画 For Game 介绍

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. 首先我们来看到底什么是骨骼动画: 在早期的机器上,渲染本身已经占用了很多CPU资源,因此,对于渲染,往往采取的是一种空间换时间的策略,以避免在模型的渲染中继续加重CPU的负担.帧动画模型在这种条件下应运而生.比较著名的帧动画格式是Quake2所采用的MD2.到今天为止,帧动画依然存在,只不过帧动

Spine Skeleton Animation 2D骨骼动画 For Game 介绍

首先我们来看到底什么是骨骼动画: 在早期的机器上,渲染本身已经占用了很多CPU资源,因此,对于渲染,往往采取的是一种空间换时间的策略,以避免在模型的渲染中继续加重CPU的负担.帧动画模型在这种条件下应运而生.比较著名的帧动画格式是Quake2所采用的MD2.到今天为止,帧动画依然存在,只不过帧动画更多地是来描述小且动作相对少些的物体. GPU出现后,CPU的问题早已不像以前那么突出,一些新的手段和技术也可以被应用进来了.骨骼动画相对于帧动画而言,更加灵活多变,但同时,骨骼动画需要更多的计算量,因