行走的机器人

该实例创建基于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~ 机器人会走路了哦。

你可能感兴趣的:(animation,IM,网格)