• <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
            久久久久久久精品妇女99| 中文字幕久久精品无码| 国产一区二区精品久久岳| 精品一区二区久久久久久久网站| 久久午夜羞羞影院免费观看| 精品国产乱码久久久久久郑州公司 | 中文字幕久久亚洲一区| 亚洲av成人无码久久精品| 久久婷婷久久一区二区三区| 亚洲精品97久久中文字幕无码| 无码超乳爆乳中文字幕久久| 国产精品青草久久久久福利99| 日韩久久无码免费毛片软件| 久久久久久人妻无码| 久久午夜福利电影| 老色鬼久久亚洲AV综合| 久久久久人妻一区精品| 国内精品久久久久影院优| 中文成人久久久久影院免费观看| 日韩久久久久久中文人妻| 国产精品一区二区久久精品无码 | 91久久香蕉国产熟女线看| 久久久噜噜噜久久中文字幕色伊伊| 久久精品国产亚洲AV高清热| 欧洲国产伦久久久久久久| 99久久人人爽亚洲精品美女| 久久精品aⅴ无码中文字字幕不卡| 色欲综合久久躁天天躁| 国产精品欧美久久久久无广告| av国内精品久久久久影院| 人妻无码中文久久久久专区| 中文字幕亚洲综合久久菠萝蜜| 国产成人精品久久亚洲高清不卡 | 国产∨亚洲V天堂无码久久久| 无码久久精品国产亚洲Av影片| 日批日出水久久亚洲精品tv| 久久久久久国产精品免费免费| 国产国产成人久久精品| 精品欧美一区二区三区久久久| 一本大道久久a久久精品综合| 亚洲综合婷婷久久|