C++优雅之旅

探索C++

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  15 随笔 :: 0 文章 :: 20 评论 :: 0 Trackbacks
mSn->translate(mPosition * evt.timeSinceLastFrame, Node::TS_WORLD);
        刚开始学习Ogre,做了个很简单的demo,用键盘的上下左右控制一个人物模型四处走动。逻辑很简单,但是实现到想要的效果却费了一番周折。
      一开始用一个Vector3 mPosition变量保存人物的位置,然后Real mWalkSpeed保存人物的移动速度,在上下左右的按键响应代码中分别
写上处理人物各方向移动的代码:

 
 1    bool DemoFrameListener::keyPressed(const OIS::KeyEvent &arg)
  
2{
 
3    switch (arg.key)
 
4    {
 
5    // 按下Escape键,退出程序。
 6    case OIS::KC_ESCAPE:
 
7        mContinue = false;
 
8    
 
9    // W、S、A、D控制人物行走。
10    case OIS::KC_UP:
11    case OIS::KC_W:
12        mPosition.z -= mWalkSpeed;
13        mSn->setDirection(Vector3::NEGATIVE_UNIT_Z);
14        // 取得模型的"Walk"动画集。
15        mAnimationState = mEntity->getAnimationState("Walk");
16        break;
17    case OIS::KC_S:
18    case OIS::KC_DOWN:
19        mPosition.z += mWalkSpeed;
20        mSn->setDirection(Vector3::UNIT_Z);
21        // 取得模型的"Walk"动画集。
22        mAnimationState = mEntity->getAnimationState("Walk");
23        break;
24    case OIS::KC_A:
25    case OIS::KC_LEFT:
26        // 取得模型的"Walk"动画集。
27        mAnimationState = mEntity->getAnimationState("Walk");
28        mSn->setDirection(Vector3::UNIT_X);
29        break;
30    case OIS::KC_D:
31    case OIS::KC_RIGHT:
32        // 取得模型的"Walk"动画集。
33        mAnimationState = mEntity->getAnimationState("Walk");
34        mSn->setDirection(Vector3::NEGATIVE_UNIT_X);
35        break;
36    }

37
38    return true;
39}

40
然后在每一帧中调用
mSn->translate(mPosition * evt.timeSinceLastFrame, Node::TS_LOCAL);
来更新人物位置。
      编译代码运行,出现了奇怪的效果。初始时人物面朝-Z轴方向,按下后应该面朝+Z轴方向并朝这个方向行走,实际却是面朝+Z方向往-Z轴方向移动。以为逻辑代码写错导致移动方向错误,检查了半天发现一点错误都没有。折腾了两天都没有结果,今天在群里和人聊天时谈到SceneNode::setDirection这个函数,人家说调用SceneNode::setDirection这个函数后会改变模型的局部坐标系,顿时脑子高速运转,隐约觉得离答案已经不远了,自己琢磨的一下,终于解决了问题。
      原来,用一个参数(方向向量)调用setDirection函数时,该函数有两个默认值,我遇到的问题就和第二个参数有关,这个参数描述的是setDirection函数操作的参照空间,有Node::TS_LOCAL,Node::TS_PARENT和Node::TS_WORLD三个可选值,分别表示,局部空间,父节点空间和世界空间。在我的例子中,人物的朝向是以整个地图为参照物的,所以,这个参数应该设置成TS_WORLD,如果取其默认值Node::TS_LOCAL,调用setDirection之后,人物的整个局部坐标系的方向都变了,这样一来,当按下方向键时,人物会面向正确的方向,但是移动的参照方向却和原来的相反,这就是为什么会有正确的朝向却背向移动的奇怪现象了。

      另外
mSn->translate(mPosition * evt.timeSinceLastFrame, Node::TS_LOCAL);
中的Node::TS_LOCAL也要改成Node::TS_WORLD,使人物相对于世界空间平移。
posted on 2008-12-30 01:27 林公子 阅读(2600) 评论(0)  编辑 收藏 引用 所属分类: OGRE

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理