毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 论文 >> 正文

三文动画在OGRE中应用的研究 第9页

更新时间:2008-4-19:  来源:毕业论文

三文动画在OGRE中应用的研究 第9页

另外,还为忍者添加了运动轨迹,表现为忍者在食人魔头的左边和前面来来回回的移动。其运动轨迹参照摄像机轨迹,使用样条插值,使忍者节点在预先设定好的轨迹上产生平滑移动的效果。

我将忍者和女侠分别放在食人魔头的两侧,设置了他们的初始方位,使用移动和旋转使他们面向魔头。

以女侠为例,先定位,再绑定。SceneNode* girlNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();

    Entity* girl = mSceneMgr->createEntity("ZFGirl", "ZFGirl.mesh");

    girlNode->translate(200,-100,0);

girlNode->rotate(Vector3(0,1,0),Angle(-90));

    girlNode->attachObject( girl);

因为在本工程中,共有四个动画状态:

摄像机的轨迹动画

mAnimState[0] = mSceneMgr->createAnimationState("CameraTrack");

女侠的拍手动画

mAnimState[1] = girl->getAnimationState("happy");

忍者的跳跃动画

mAnimState[2] =ninja->getAnimationState("Jump");

忍者运动轨迹动画

mAnimState[3] = mSceneMgr->createAnimationState("NinjaTrack");

于是定义了全局变量动画状态数组

AnimationState* mAnimState[4];

frameStarted()内使用一个循环语句,来更新四种动画状态。

for (int i = 0; i <4 ; ++i)

      mAnimState[i]->addTime(evt.timeSinceLastFrame);

4.3.2 OGRE骨骼动画实例

下面将通过一个DEMO来看具体如何实现骨骼动画:

OGRE 本身附带了两套比较完整的骨骼动画模型,保存在OGRE\Samples\Media\models 目录下,一套是机器人 ( robot.mesh robot.skeleton ) ,一套是忍者 ( ninja.mesh ninja.skeleton ) 。其中忍者的模型多边形数比较高,动作也比较丰富和细腻。这里就使用这个现成的忍者模型来学习骨骼动画的读取和播放。运行截图:

4.9

 若图片无法显示请联系QQ752018766

4.10

我们知道,OGRE 的角色模型和骨骼动画是分开为两个不同格式的文件,一个是 *.mesh 文件,在这个文件中,定义了角色的皮肤 (Skin) 模型、角色的材质名称 、以及角色对应的 *.skeleton 骨骼动画文件名;在 *.skeleton 文件中,则定义了角色的骨骼 (Bones) 信息和骨骼动画序列,一个 *.skeleton 文件中至少包含一个骨骼定义部分和若干个骨骼动画序列,在 ninja.skeleton 文件中就包含了 Walk Jump Attack1 Idle2 等多个动画序列的定义。
   
至于如何知道 *.mesh 文件使用的材质名称和骨骼动画文件名,以及如何知道 *.skeleton 文件中定义了哪些动画序列,可以使用 OgreXMLConverter.exe 。这个工具在编译后的 ogrenew\Tools\XMLConverter\bin\release 目录下。本节不打算具体讲解这个工具的使用方法,后面章节将介绍如何使用。本节专讲如何读取和播放骨骼动画。
    1. 引入新概念: FrameListener (帧监听器)
   
这个示例包含两个公用的头文件:ExampleApplication.h ExampleFrameListener.h ,其中:
    1) ExampleApplication.h
定义了应用程序公用类 Ogre::ExampleApplication ,并在其中定义了公用方法 setup()
virtual bool setup(void) //
设置
   
这个是 ExampleApplication 类的核心方法,用于设置应用程序。看它的源
代码,在这个方法中,依次调用了另外这几个方法。
    virtual void setupResources(void) // 设置资源
  
 virtual bool configure(void) // 显示配置
  
 virtual void chooseSceneManager(void) // 选择场景管理器
  
 virtual void createCamera(void) // 创建镜头
   
virtual void createViewports(void) // 创建视野
  
 virtual void createScene(void) // 创建场景
   
virtual void createFrameListener(void) // 创建帧监听器
   
setup() 所做的这些事情我们可以看出,整个 ExampleApplication 类所作的事情,就是创建 (Create) 并设置 (Setup) 一个应用程序。但是对一个应用程序来说,做好 Create Setup 还不够,它还需要不停刷新 (Update) ,响应各种消息事件包括键盘和鼠标输入,并随时准备退出 (Quit) ,这些事情,就由Ogre::ExampleFrameListener 类来全权负责。
   
在上面我们已经可以看到, ExampleApplication::setup() 方法最后调用了一个createFrameListener() 方法,就在这里,创建了一个新的帧监听器 Ogre::ExampleFrameListener 对象。从这个意义上说, Ogre::ExampleApplication 就像一个伟大的创业者,它亲手创建了 OGRE 的世界并创建了自己的继承人 Ogre::ExampleFrameListener ,并在激流勇退之前把文持这个世界的权柄传递给它。

2) 示例公用帧监听器对象 Ogre::ExampleFrameListener 在头文件 ExampleFrameListener.h 中定义。我们从它的方法定义中,可以大致了解它在每一帧每一个时刻,分别在做哪些事情。
     virtual bool processUnbufferedKeyInput(const FrameEvent& evt)

// 处理无缓冲键盘输入
bool processUnbufferedMouseInput(const FrameEvent& evt)

// 处理无缓冲鼠标输入

void moveCamera( ) // 移动镜头

void showDebugOverlay(bool show) // 显示界面

bool frameStarted(const FrameEvent& evt) // 处理帧开始事件

bool frameEnded(const FrameEvent& evt) // 处理帧结束事件

void switchMouseMode( ) // 切换鼠标模式

void switchKeyMode( ) // 切换键盘模式

void keyClicked(KeyEvent* e) // 响应 按下按键 事件

void keyPressed(KeyEvent* e) // 响应 按住按键 事件

void keyReleased(KeyEvent* e) // 响应 放开按键 事件
   
以后如果我们希望能够更改键盘或鼠标的操作,只需要覆盖对应的方法。这里先不细述。在这里需要了解的是 frameStarted() 方法,这个方法会在每一帧的开始,由 OGRE 自动调用。我们需要覆盖这个方法,在每一帧的开始,使我们的角色动画产生更新。角色动画创建以后,需要每帧更新才能动起来。
    2.
动画状态对象 AnimationState
Ogre::AnimationState (
动画状态) 对象在头文件 OgreAnimationState.h 中定义,它的方法不多,作用很明确,前面介绍过此类,这里之提一下比较重要的函数:

 AnimationState(const String& animName, Real timePos, Real length, Real weight = 1.0, bool enabled = false);// 获取当前动画序列名称

const String& getAnimationName() const;// 设置当前动画序列名称

void setAnimationName(const String& name);

// 获取当前动画序列的时间位置

Real getTimePosition(void) const;// 设置当前动画序列的时间位置

void setTimePosition(Real timePos);

void addTime(Real offset);// 如果当前动画序列处于启用状态则返回真

bool getEnabled(void) const;// 启用/禁用当前动画序列

void setEnabled(bool enabled);// 设置控制值

void setValue(Real value);

// 获取当前动画序列的循环/非循环状态

void setLoop(bool loop) { mLoop = loop; }

// 设置当前动画序列的循环/非循环状态

bool getLoop(void) const { return mLoop; }

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

三文动画在OGRE中应用的研究 第9页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©751com.cn 辣文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。