三维动画在OGRE中应用的研究 第7页

三维动画在OGRE中应用的研究 第7页

4 基本动画实例

4.1 OGRE CameraTrack 实例分析

1OGRE CameraTrack定义了一个10秒种的动画,这个动画包含一个动画轨迹(上下翻转)。让这个动画应用到当前摄像机上去,程序运行时,用户的视角应该在上下翻转。

本工程只有两个文件: CameraTrack.cpp, CameraTrack.h.并且 CameraTrack.h是空文件。在CameraTrack.cpp中只包含了一个头文件ExampleApplication.h  ,它定义了应用程序类 CameraTrackApplication, 该类的createScene函数负责初始化工作。我们看到CameraTrackApplication继承自ExampleApplication, CameraTrack工程中指定了附加包含路径ExampleApplication.hExampleFrameListener.h。所有的示例文件都引用这两个文件,因它们定义了简单通用的应用程序框架(FrameWork),例如定义了指向Root对象、摄像机、场景管理器、帧监听器、渲染窗口的指针。其中Root OGRE系统的入口点,通过Root对象可以调出配置对话框以配置渲染系统(RenderSystem);还可以获取到引擎其它部分的指针,如SceneManagerRenderSystemResource managers等;Root对象还提供一个startRendering方法来开始一个连续渲染过程。

2.接下来我们了解一下OGRE 的场景组织方式,就像一棵树,树有根、有枝干、有叶子和果实。最基本的两个概念,是场景节点 (SceneNode) 实体 (Entity) 。场景节点就像树枝,实体就像枝头的果实。我们可以画个概念图: 若图片无法显示请联系QQ3249114

4.1

场景节点就像根、树干和树枝,它可以再分枝,或者挂上果实;实体就像果实,它总是被绑定 (Attach) 在一个场景节点上并且总是处于分枝的末端;

场景节点控制实体的位置、方向、缩放等空间属性;

实体具有自己所使用的模型、材质、阴影、骨骼、动画、渲染状态等各种个体属性;

整个场景节点拥有唯一的一个根场景节点(RootSceneNode),如果一个实体不是根场景节点的后代,也就是所谓的游离实体或被绑定在一个"游离"节点上的实体,它不会被显示。

场景节点类 Ogre::SceneNode 在头文件 OgreSceneNode.h 中定义, 实体类 Ogre::Entity 在头文件 OgreEntity.h 中定义,

mSceneMgr 是在公用示例基类 OGRE::ExampleApplication 中已经定义好的一个保护成员,作为场景管理器 (SceneManager) 的一个实例来使用。

场景管理器类 Ogre::SceneManager 在头文件 OgreSceneManager.h 中定义,场景管理器,顾名思义,它是整个 OGRE 场景的总管,管理整个场景中的所有场景节点 (SceneNode) 、实体 (Entity) 、光源 (Light) 、镜头 (Camera) 、材质 (Material) 、阴影 (Shadow) 、公告板 (Billboard) 、动画 (Animation) 、天空 (Sky) 、雾 (Fog) 、盖层 (Overlay) 等等大量元素。

我们明白了场景节点与实体的关系,接着要考虑如何将动画应用到当前摄像机上。因为一个动画可以应用到一个节点上,所以可以创建一个节点并将当前摄像机attach到这个节点上去,代码如下:

    SceneNode*camNode = mSceneMgr->getRootSceneNode()->createChild();

        camNode->attachObject(mCamera);

当然,如果你愿意,也可以把动画应用于动画物体,比如本例中的魔鬼头,可见渲染后的结果为魔鬼头在场景中飘忽移动,是不是有点像鬼片。如图

若图片无法显示请联系QQ3249114

 

 

 

 

 

4.2

  

4.3

3.下面定义动画、动画轨迹以及关键帧:

        // 定义动画,指定动画的名称及长度(这里为10秒)

        Animation* anim = mSceneMgr->createAnimation("CameraTrack", 10);

        // 指定动画关键帧之间的插值方式(包括线性插值和样条插值)

              anim->setInterpolationMode(Animation::IM_SPLINE);

        // 定义动画的一个动画轨迹,并指定这个轨迹是作用到camNode节点上的

        AnimationTrack* track = anim->createTrack(0, camNode);

        // 定义动画轨迹包含的关键帧,下面定义了四个关键帧,加上起始帧

函数KeyFrame* createKeyFrame(Real timePos) 参数timePos以秒为单位 ,表示应用关键帧的时间,此例是10秒的动画,每2.5秒设置一个关键帧,五个关健帧形成了一个翻转的动画。

        KeyFrame* key = track->createKeyFrame(0); // startposition

        key = track->createKeyFrame(2.5);

        key->setTranslate(Vector3(500,500,-1000));

        key = track->createKeyFrame(5);

        key->setTranslate(Vector3(-1500,1000,-600));

        key = track->createKeyFrame(7.5);

        key->setTranslate(Vector3(0,-100,0));

        key = track->createKeyFrame(10);

        key->setTranslate(Vector3(0,0,0));

我们看到在每个关键帧处,动画物体都发生了移动。OgreKeyFrame.h 定义了动画物体空间移动的三种方式:

平移setTranslate(const Vector3& trans)

缩放setScale(const Vector3& scale)

旋转setRotation(const Quaternion& rot)

我们也可以让物体的运动复杂一些,加入旋转和缩放变化。

KeyFrame* key = track->createKeyFrame(0); // startposition

        key = track->createKeyFrame(2.5);

        key->setTranslate(Vector3(500,500,-1000));

             key->setScale(Vector3(0.5,0.5,0.5));

        key = track->createKeyFrame(5);

        key->setTranslate(Vector3(-1500,1000,-600)); key->setScale(Vector3(0.5,1,0.5));

        key = track->createKeyFrame(7.5);

        key->setTranslate(Vector3(0,-100,0));

        key->setScale(Vector3(1,0.5,1));

        key = track->createKeyFrame(10);

        key->setTranslate(Vector3(0,0,0));

在关键帧处设置变化的代码中,我们可以在加了下画线的位置加上缩放变化,我们可以看到魔鬼头在移动的同时,还会产生逐渐拉长,然后被压扁,最后还原成初始状态的效果。

 

4 基本动画实例

4.1 OGRE CameraTrack 实例分析

1OGRE CameraTrack定义了一个10秒种的动画,这个动画包含一个动画轨迹(上下翻转)。让这个动画应用到当前摄像机上去,程序运行时,用户的视角应该在上下翻转。

本工程只有两个文件: CameraTrack.cpp, CameraTrack.h.并且 CameraTrack.h是空文件。在CameraTrack.cpp中只包含了一个头文件ExampleApplication.h  ,它定义了应用程序类 CameraTrackApplication, 该类的createScene函数负责初始化工作。我们看到CameraTrackApplication继承自ExampleApplication, CameraTrack工程中指定了附加包含路径ExampleApplication.hExampleFrameListener.h。所有的示例文件都引用这两个文件,因它们定义了简单通用的应用程序框架(FrameWork),例如定义了指向Root对象、摄像机、场景管理器、帧监听器、渲染窗口的指针。其中Root OGRE系统的入口点,通过Root对象可以调出配置对话框以配置渲染系统(RenderSystem);还可以获取到引擎其它部分的指针,如SceneManagerRenderSystemResource managers等;Root对象还提供一个startRendering方法来开始一个连续渲染过程。

2.接下来我们了解一下OGRE 的场景组织方式,就像一棵树,树有根、有枝干、有叶子和果实。最基本的两个概念,是场景节点 (SceneNode) 实体 (Entity) 。场景节点就像树枝,实体就像枝头的果实。我们可以画个概念图: 若图片无法显示请联系QQ3249114

4.1

场景节点就像根、树干和树枝,它可以再分枝,或者挂上果实;实体就像果实,它总是被绑定 (Attach) 在一个场景节点上并且总是处于分枝的末端;

场景节点控制实体的位置、方向、缩放等空间属性;

实体具有自己所使用的模型、材质、阴影、骨骼、动画、渲染状态等各种个体属性;

整个场景节点拥有唯一的一个根场景节点(RootSceneNode),如果一个实体不是根场景节点的后代,也就是所谓的游离实体或被绑定在一个"游离"节点上的实体,它不会被显示。

场景节点类 Ogre::SceneNode 在头文件 OgreSceneNode.h 中定义, 实体类 Ogre::Entity 在头文件 OgreEntity.h 中定义,

mSceneMgr 是在公用示例基类 OGRE::ExampleApplication 中已经定义好的一个保护成员,作为场景管理器 (SceneManager) 的一个实例来使用。

场景管理器类 Ogre::SceneManager 在头文件 OgreSceneManager.h 中定义,场景管理器,顾名思义,它是整个 OGRE 场景的总管,管理整个场景中的所有场景节点 (SceneNode) 、实体 (Entity) 、光源 (Light) 、镜头 (Camera) 、材质 (Material) 、阴影 (Shadow) 、公告板 (Billboard) 、动画 (Animation) 、天空 (Sky) 、雾 (Fog) 、盖层 (Overlay) 等等大量元素。

我们明白了场景节点与实体的关系,接着要考虑如何将动画应用到当前摄像机上。因为一个动画可以应用到一个节点上,所以可以创建一个节点并将当前摄像机attach到这个节点上去,代码如下:

    SceneNode*camNode = mSceneMgr->getRootSceneNode()->createChild();

        camNode->attachObject(mCamera);

当然,如果你愿意,也可以把动画应用于动画物体,比如本例中的魔鬼头,可见渲染后的结果为魔鬼头在场景中飘忽移动,是不是有点像鬼片。如图

 

 

 若图片无法显示请联系QQ3249114

 

 

4.2

  

4.3

3.下面定义动画、动画轨迹以及关键帧:

        // 定义动画,指定动画的名称及长度(这里为10秒)

        Animation* anim = mSceneMgr->createAnimation("CameraTrack", 10);

        // 指定动画关键帧之间的插值方式(包括线性插值和样条插值)

              anim->setInterpolationMode(Animation::IM_SPLINE);

        // 定义动画的一个动画轨迹,并指定这个轨迹是作用到camNode节点上的

        AnimationTrack* track = anim->createTrack(0, camNode);

        // 定义动画轨迹包含的关键帧,下面定义了四个关键帧,加上起始帧

函数KeyFrame* createKeyFrame(Real timePos) 参数timePos以秒为单位 ,表示应用关键帧的时间,此例是10秒的动画,每2.5秒设置一个关键帧,五个关健帧形成了一个翻转的动画。

        KeyFrame* key = track->createKeyFrame(0); // startposition

        key = track->createKeyFrame(2.5);

        key->setTranslate(Vector3(500,500,-1000));

        key = track->createKeyFrame(5);

        key->setTranslate(Vector3(-1500,1000,-600));

        key = track->createKeyFrame(7.5);

        key->setTranslate(Vector3(0,-100,0));

        key = track->createKeyFrame(10);

        key->setTranslate(Vector3(0,0,0));

我们看到在每个关键帧处,动画物体都发生了移动。OgreKeyFrame.h 定义了动画物体空间移动的三种方式:

平移setTranslate(const Vector3& trans)

缩放setScale(const Vector3& scale)

旋转setRotation(const Quaternion& rot)

我们也可以让物体的运动复杂一些,加入旋转和缩放变化。

KeyFrame* key = track->createKeyFrame(0); // startposition

        key = track->createKeyFrame(2.5);

        key->setTranslate(Vector3(500,500,-1000));

             key->setScale(Vector3(0.5,0.5,0.5));

        key = track->createKeyFrame(5);

        key->setTranslate(Vector3(-1500,1000,-600)); key->setScale(Vector3(0.5,1,0.5));

        key = track->createKeyFrame(7.5);

        key->setTranslate(Vector3(0,-100,0));

        key->setScale(Vector3(1,0.5,1));

        key = track->createKeyFrame(10);

        key->setTranslate(Vector3(0,0,0));

在关键帧处设置变化的代码中,我们可以在加了下画线的位置加上缩放变化,我们可以看到魔鬼头在移动的同时,还会产生逐渐拉长,然后被压扁,最后还原成初始状态的效果。

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有