2014-12-13 34 views
0

(Ogre3D) 我有一個相機對象,與下面的表面相距約30度。鑄造面向全球空間方向的(本地空間)相機x-y-plane

現在,當用戶按下某個按鍵時,例如W或S,攝像機應該沿着面向的方向移動,但是會粘在全局空間的xy平面上,就像您真空地板一樣;)我認爲Age of帝國例如具有相同的觀點機制。

\ Camera-View Ray/User Presses W 
    \ 
     \ --->> desired moving direction 
     \ 
     \ 
____________________________________________________ Global Space X,Y-Plane Ground 

我的問題是不是代碼本身,而是它背後的計算。如何從面向Direction的本地對象中提取全局x-y平面方向?

感謝您的幫助!

+0

採取三地分,並把它們想象成三角形,以便從任何兩個頂點的使2個向量做叉積,你具有飛機的「正常」矢量......所以在用'運動'向量翻譯攝像機之前,請移除軸向部分,如'movement- = dot(normal,movement)/ | normal |'...如果我沒有弄錯。如果你的交叉產品獲得了相反的方向向量,那麼只是否定「正常」 – Spektre 2014-12-13 15:01:43

回答

0

我明白了。如果有人需要幫助過,這是我的食人魔的代碼,你可以提取普林西:

float coeff = 150.0f * deltaTime_s; 
Ogre::Quaternion dirY(Ogre::Degree(-90), Ogre::Vector3::UNIT_Y); 
    if(keyboard->isKeyDown(OIS::KC_W)) 
    { 
     GameManager::getSingeltonPtr()->getCameraNode()->translate 
      (dirY* (GameManager::getSingeltonPtr()->getCameraNode()->getOrientation() * Ogre::Vector3 (-coeff, 0, 0))); 
    } 
    if(keyboard->isKeyDown(OIS::KC_S)){ 
     GameManager::getSingeltonPtr()->getCameraNode()->translate 
      (dirY* (GameManager::getSingeltonPtr()->getCameraNode()->getOrientation() * Ogre::Vector3 (coeff, 0, 0))); 
    } 
    if(keyboard->isKeyDown(OIS::KC_A)) 
    { 
     GameManager::getSingeltonPtr()->getCameraNode()->translate 
      ((GameManager::getSingeltonPtr()->getCameraNode()->getOrientation() * Ogre::Vector3 (-coeff, 0, 0))); 

    } 
    if(keyboard->isKeyDown(OIS::KC_D)) 
    { 
     GameManager::getSingeltonPtr()->getCameraNode()->translate 
      ((GameManager::getSingeltonPtr()->getCameraNode()->getOrientation() * Ogre::Vector3 (coeff, 0, 0))); 
    }