实验四 角色动画
实验四 角色动画
一、实验内容:
1. 建立一个简单的游戏场景和玩家角色;
2. 根据Ogre启动顺序自行定义Application类和Listener类;
3. 利用AnimationState类实现基本的角色动画;
4. 通过键盘或鼠标实现角色的交互控制;
二、实验目的:
1. 熟悉Ogre启动顺序,了解Ogre引擎的工作过程及Ogre样例框架的实现原理。
2. 掌握帧监听器接口、鼠标监听器接口和键盘监听器接口的作用及使用方法。
3. 了解Ogre动画实现的基本原理及AnimationState类的使用方法。
4. 掌握Ogre动画的实现与交互控制方法。
三、实验步骤
1, 框架建立,改进
I,首先是改进了两个小问题:
在新版里的Ogre带有deque,
所以在使用上要加以区别:
II,第二是产生的exe文件,vs08下是默认生成在debug目录下,而运行时则是放在当前项目下,如不注意,多拷几遍资源文件那是在所难免的,这点可以通过设置工作目录解决:
加入场景控制,结果如下:
2, 动画建立
你需要从实体对象里获取AnimationState,设置,并激活它。产生动画活动起来,但你还必须在每一帧后给它添加时间,才能让动画动起来。改造好帧监听器:
开始原地巡逻:
3, 移动角色:
移动角色改变监听器构造函数:
加入对路点的控制:
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向量行走:
4, 动画加强,平滑转身:
官方教材的转动是用四元数直接转向的,在角度比较大的情况下显得比较不真实,经过一番改进,实现了平滑转动:
首先求出转向角:
再在每帧的更新中首先检查转向是否完成:
但不知是否是浮点精度的问题,转向角度有比较大的差异,还有待解决:
另外改进了nextLocation,使行走回环:
四、实验数据及处理结果
结果均以截图给出,代码,工程附带。。。
五、思考讨论题或体会或对改进实验的建议
Ogre里动画,粒子结合,还可以继续深入很多,别停下脚步!