• <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 林公子 閱讀(2671) 評論(0)  編輯 收藏 引用 所屬分類: OGRE
            亚洲成色WWW久久网站| 国产精品久久久久jk制服| 久久99精品久久久久久野外 | 精品久久久久久久久午夜福利| 久久久久久国产精品美女| 亚洲中文字幕久久精品无码喷水 | 看全色黄大色大片免费久久久| 国内精品伊人久久久影院| 蜜臀久久99精品久久久久久小说| 国产精品久久久久无码av| 久久综合久久鬼色| 久久久久四虎国产精品| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久亚洲精品无码观看不卡| 一本久久a久久精品综合香蕉| 99久久综合狠狠综合久久止| 亚洲国产天堂久久综合| 精品久久久久久中文字幕| 久久久久亚洲精品日久生情| 国产精品狼人久久久久影院| 久久精品99久久香蕉国产色戒| 午夜精品久久久久久| 欧美精品一本久久男人的天堂| 久久综合给久久狠狠97色| 伊人久久大香线蕉综合5g| 国产精品成人久久久久三级午夜电影| 久久国产精品无码HDAV| 亚洲AV无码一区东京热久久| 日韩中文久久| 久久笫一福利免费导航| 久久天天躁狠狠躁夜夜2020老熟妇| 97久久天天综合色天天综合色hd| 国产成人久久精品一区二区三区| 亚洲伊人久久综合中文成人网| 国产综合成人久久大片91| 亚洲国产精品久久久久婷婷老年| 国产精品一区二区久久国产| 久久久国产精品亚洲一区| 人妻少妇久久中文字幕一区二区| 亚洲狠狠婷婷综合久久蜜芽| 中文字幕久久久久人妻|