该实例创建基于robot.mesh文件的实体(Entity)对象,指定其“走”动作(动作信息都在.skeleton文件里,当然目前为止,我们的.skeleton文件夹里只有Walk这个动作),并将其显示到屏幕上。robot.mesh文件中保存机器人的网格信息,Entity会自动加载保存有机器人骨骼信息的robot.skeleton文件。我们重载ExampleApplication类的createScene函数,其部分代码如下:
void createScene(void)
{
// 设置关键帧之间的插值方法为样条插值
Animation::setDefaultInterpolationMode(Animation::IM_SPLINE);
// 创建基于网格文件robot.mesh的Entity
Entity *ent = mSceneMgr->createEntity("robot", "robot.mesh");
// 将实体附属到场景根结点上
mSceneMgr->getRootSceneNode()->createChild()->attachObject(ent);
// 得到实体“走”动作的AnimationState类对象
mAnimState = ent->getAnimationState("Walk");
// “Enable”(起始)该动作
mAnimState->setEnabled(true);
}
在createScene函数里成功的指定了机器人的当前动作为“走”,下一步要让动画“动”起来,还需要根据时间跨度计算当前帧的骨骼位置。重载ExampleFrameListener类的frameStarted函数:
bool frameStarted(const FrameEvent& evt)
{
// 将两帧之间的时间差传入AnimationState::addTime函数,该函数内部会计算出动// 画的当前时间点。
mAnimState->addTime(evt.timeSinceLastFrame);
// 调用父类的frameStarted函数
return ExampleFrameListener::frameStarted(evt);
}
此时童谣需要重载ExampleApplication类中的createFrameListener函数:
void createFrameListener(void)
{
mFrameListener= new ProjectiveDecalListener(mWindow, ExampleApplication::mCamera);
mRoot->addFrameListener(mFrameListener);
}
hoho~ 机器人会走路了哦。