C++ 向全局空间x-y平面的方向投射(局部空间)摄影机

C++ 向全局空间x-y平面的方向投射(局部空间)摄影机,c++,math,3d,transformation,ogre,C++,Math,3d,Transformation,Ogre,食人魔3D 我有一个相机物体,与下面的表面成30度角 现在,当用户按下某个键(例如W或S)时,相机应该沿着朝向的方向移动,但要粘在全局空间的x-y平面上,就像用真空吸尘器吸地板一样;例如,我认为《帝国时代》有着相同的观点 \ Camera-View Ray / User Presses W \ \ --->> desired moving direction \ \ __________________________

食人魔3D 我有一个相机物体,与下面的表面成30度角

现在,当用户按下某个键(例如W或S)时,相机应该沿着朝向的方向移动,但要粘在全局空间的x-y平面上,就像用真空吸尘器吸地板一样;例如,我认为《帝国时代》有着相同的观点

    \ Camera-View Ray / User Presses W 
     \
      \  --->> desired moving direction 
       \
        \
____________________________________________________ Global Space X,Y-Plane Ground
我的问题不是代码本身,而是代码背后的计算。如何从面向方向的局部对象中提取全局x-y平面方向


谢谢你的帮助

我明白了。如果有人也需要帮助,这是我的食人魔代码,你可以提取原则:

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)));
    }

取3个地面点,把它们看作三角形,从它的任意两个顶点做2个向量,做叉积,得到平面的法向量。。。因此,在通过movementvector平移摄影机之前,请删除轴向部分,如:movement-=dotnormal,movement/| normal |。。。如果我没弄错的话。如果你的叉积得到了相反的方向向量,那么就求法向量的反