• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            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 林公子 閱讀(2655) 評論(0)  編輯 收藏 引用 所屬分類: OGRE
            成人久久综合网| 久久精品国产亚洲AV香蕉| 精品午夜久久福利大片| 国产精品久久久久一区二区三区| 久久99精品国产麻豆婷婷| 亚洲国产成人乱码精品女人久久久不卡 | 久久99精品久久久久久| 久久久WWW成人免费毛片| 亚洲AV无码久久| 久久成人精品| 国产精品久久久久久影院 | 国产69精品久久久久9999APGF| 国产成人久久精品区一区二区| 久久成人18免费网站| 国产精品久久久久aaaa| 伊人色综合久久天天人守人婷| 精品久久久久久久| 97精品依人久久久大香线蕉97| 亚洲国产精品人久久| 久久国产乱子伦免费精品| 狠狠色丁香久久婷婷综合图片| 久久96国产精品久久久| 日韩av无码久久精品免费| 久久99精品国产麻豆宅宅| 久久综合视频网站| 久久久久亚洲精品无码网址| 丁香久久婷婷国产午夜视频| 18岁日韩内射颜射午夜久久成人| 日韩精品无码久久久久久| 久久热这里只有精品在线观看| 无码乱码观看精品久久| 久久精品夜色噜噜亚洲A∨| 久久强奷乱码老熟女网站| 国产精品成人精品久久久| 大美女久久久久久j久久| 亚洲国产成人久久综合碰碰动漫3d | 亚洲av日韩精品久久久久久a | 久久这里只有精品久久| 伊人丁香狠狠色综合久久| 中文字幕一区二区三区久久网站| 一本色道久久88加勒比—综合|