zoukankan      html  css  js  c++  java
  • 实验四 角色动画

    实验四 角色动画

    一、实验内容:

    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里动画,粒子结合,还可以继续深入很多,别停下脚步!

  • 相关阅读:
    javascript事件流讲解和实例应用
    Javascripts事件基础和事件绑定
    javascript-节点属性详解
    js数据类型检测的四种方式
    原生JS的window.onload与Jquery的$(document).ready(function() {}),$(function () {})有什么不同?
    Js字符串方法大全
    什么是原型链?
    new操作符具体干了什么呢
    document.write和innerHTML的区别
    一个页面从输入URL到页面加载显示完成,这个过程中都发生了什么?
  • 原文地址:https://www.cnblogs.com/Zephyroal/p/1947514.html
Copyright © 2011-2022 走看看