实验四 角色动画

实验四 角色动画

一、实验内容:

1. 建立一个简单的游戏场景和玩家角色;

2. 根据Ogre启动顺序自行定义Application类和Listener类;

3. 利用AnimationState类实现基本的角色动画;

4. 通过键盘或鼠标实现角色的交互控制;

二、实验目的:

1. 熟悉Ogre启动顺序,了解Ogre引擎的工作过程及Ogre样例框架的实现原理。

2. 掌握帧监听器接口、鼠标监听器接口和键盘监听器接口的作用及使用方法。

3. 了解Ogre动画实现的基本原理及AnimationState类的使用方法。

4. 掌握Ogre动画的实现与交互控制方法。

三、实验步骤

1, 框架建立,改进

I,首先是改进了两个小问题:

在新版里的Ogre带有deque,

所以在使用上要加以区别:

clip_image002II,第二是产生的exe文件,vs08下是默认生成在debug目录下,而运行时则是放在当前项目下,如不注意,多拷几遍资源文件那是在所难免的,这点可以通过设置工作目录解决:

clip_image004

加入场景控制,结果如下:
clip_image006

2, 动画建立

你需要从实体对象里获取AnimationState,设置,并激活它。产生动画活动起来,但你还必须在每一帧后给它添加时间,才能让动画动起来。改造好帧监听器:

开始原地巡逻:

clip_image008

3, 移动角色:

移动角色改变监听器构造函数:

clip_image010

加入对路点的控制:

bool nextLocation( )

{

if (mWalkList.empty())

return false;

mDestination = mWalkList.front(); // this gets the front of the deque

mWalkList.pop_front(); // this removes the front of the deque

mDirection = mDestination - mNode->getPosition();

mDistance = mDirection.normalise();

return true;

} // nextLocation( )

bool frameStarted(const FrameEvent &evt)

{

if (mDirection == Ogre::Vector3::ZERO)

{

if (nextLocation())

{

// Set walking animation

mAnimationState = mEntity->getAnimationState("Walk");

mAnimationState->setLoop(true);

mAnimationState->setEnabled(true);

}//if

}

else

{

Ogre::Real move = mWalkSpeed * evt.timeSinceLastFrame;

mDistance -= move;

if (mDistance <= 0.0f)

{

mNode->setPosition(mDestination);

mDirection = Ogre::Vector3::ZERO;

// Set animation based on if the robot has another point to walk to.

if (!nextLocation())

{

// Set Idle animation

mAnimationState = mEntity->getAnimationState("Idle");

mAnimationState->setLoop(true);

mAnimationState->setEnabled(true);

}

else

{

// Rotation Code will go here later

Ogre::Vector3 src = mNode->getOrientation() * Ogre::Vector3::UNIT_X;

if ((1.0f + src.dotProduct(mDirection)) < 0.0001f)

{

mNode->yaw(Ogre::Degree(180));

}

else

{

Ogre::Quaternion quat = src.getRotationTo(mDirection);

mNode->rotate(quat);

} // else

}//else

}else{

mNode->translate(mDirection * move);

} // else

} // if

mAnimationState->addTime(evt.timeSinceLastFrame);

return ExampleFrameListener::frameStarted(evt);

}

机器人按传入的walk向量行走:

clip_image012

4, 动画加强,平滑转身:

官方教材的转动是用四元数直接转向的,在角度比较大的情况下显得比较不真实,经过一番改进,实现了平滑转动:

首先求出转向角:

clip_image014

再在每帧的更新中首先检查转向是否完成:

clip_image016

但不知是否是浮点精度的问题,转向角度有比较大的差异,还有待解决:

另外改进了nextLocation,使行走回环:

clip_image018

clip_image020

四、实验数据及处理结果

结果均以截图给出,代码,工程附带。。。

五、思考讨论题或体会或对改进实验的建议

Ogre里动画,粒子结合,还可以继续深入很多,别停下脚步!

posted @ 2011-01-29 16:21  Zephyroal  阅读(967)  评论(0编辑  收藏  举报