三维动画在OGRE中应用的研究 第7页
三维动画在OGRE中应用的研究 第7页
第4章 基本动画实例
4.1 OGRE CameraTrack 实例分析
1.OGRE CameraTrack定义了一个10秒种的动画,这个动画包含一个动画轨迹(上下翻转)。让这个动画应用到当前摄像机上去,程序运行时,用户的视角应该在上下翻转。
本工程只有两个文件: CameraTrack.cpp, CameraTrack.h.并且 CameraTrack.h是空文件。在CameraTrack.cpp中只包含了一个头文件ExampleApplication.h ,它定义了应用程序类 CameraTrackApplication, 该类的createScene函数负责初始化工作。我们看到CameraTrackApplication类继承自ExampleApplication类, 在CameraTrack工程中指定了附加包含路径ExampleApplication.h和ExampleFrameListener.h。所有的示例文件都引用这两个文件,因它们定义了简单通用的应用程序框架(FrameWork),例如定义了指向Root对象、摄像机、场景管理器、帧监听器、渲染窗口的指针。其中Root是 OGRE系统的入口点,通过Root对象可以调出配置对话框以配置渲染系统(RenderSystem);还可以获取到引擎其它部分的指针,如SceneManager、RenderSystem、Resource 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);
当然,如果你愿意,也可以把动画应用于动画物体,比如本例中的魔鬼头,可见渲染后的结果为魔鬼头在场景中飘忽移动,是不是有点像鬼片。如图
图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 实例分析
1.OGRE CameraTrack定义了一个10秒种的动画,这个动画包含一个动画轨迹(上下翻转)。让这个动画应用到当前摄像机上去,程序运行时,用户的视角应该在上下翻转。
本工程只有两个文件: CameraTrack.cpp, CameraTrack.h.并且 CameraTrack.h是空文件。在CameraTrack.cpp中只包含了一个头文件ExampleApplication.h ,它定义了应用程序类 CameraTrackApplication, 该类的createScene函数负责初始化工作。我们看到CameraTrackApplication类继承自ExampleApplication类, 在CameraTrack工程中指定了附加包含路径ExampleApplication.h和ExampleFrameListener.h。所有的示例文件都引用这两个文件,因它们定义了简单通用的应用程序框架(FrameWork),例如定义了指向Root对象、摄像机、场景管理器、帧监听器、渲染窗口的指针。其中Root是 OGRE系统的入口点,通过Root对象可以调出配置对话框以配置渲染系统(RenderSystem);还可以获取到引擎其它部分的指针,如SceneManager、RenderSystem、Resource 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);
当然,如果你愿意,也可以把动画应用于动画物体,比如本例中的魔鬼头,可见渲染后的结果为魔鬼头在场景中飘忽移动,是不是有点像鬼片。如图
图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] ... 下一页 >>