• <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精品久久久久久动态图 | 久久久人妻精品无码一区| 久久国产成人精品国产成人亚洲| 亚洲中文字幕无码一久久区| 久久久久亚洲AV无码麻豆| 久久九九免费高清视频| 亚洲欧美日韩中文久久| 久久久精品国产Sm最大网站| 久久这里只有精品18| 合区精品久久久中文字幕一区 | 伊人热人久久中文字幕| 久久久久av无码免费网| 久久精品亚洲精品国产欧美| 97久久精品人妻人人搡人人玩| 人人狠狠综合88综合久久| 国产一级做a爰片久久毛片| 久久久久人妻一区精品性色av| yy6080久久| 深夜久久AAAAA级毛片免费看| 国产精品成人精品久久久| 亚洲国产欧美国产综合久久| 国产亚州精品女人久久久久久| 国产成人精品久久一区二区三区av| 精品永久久福利一区二区| 亚洲国产美女精品久久久久∴| 色欲综合久久中文字幕网| 亚洲精品无码久久久久久| 天天躁日日躁狠狠久久 | 久久亚洲AV无码精品色午夜| 久久久久国产精品麻豆AR影院| 国产午夜精品久久久久九九电影| 国产成人精品久久一区二区三区av| 青青草国产精品久久久久| .精品久久久麻豆国产精品| 国产精品久久久亚洲|