Кастинг (локальное пространство) камер, обращенных к глобальным пространствам xy-Plane

(Ogre3D) У меня есть объект-камера, наклоненный примерно на 30 градусов к поверхности внизу.

Теперь, когда пользователь нажимает определенную клавишу, например, W или S, камера должна двигаться в направлении, обращенном к лицу, но придерживаться плоскости xy глобального пространства, как вы пылесосите пол;) Я думаю, что Age of Empires, например, имеет Точно такой же взгляд на механику.

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

Моя проблема не в самом коде, а в его вычислениях. Как я могу извлечь глобальное направление плоскости XY из локальных объектов, обращенных к направлению?

Спасибо за вашу помощь!

1 ответ

Я понял. Если кому-то тоже нужна помощь, вот мой код Ogre, вы можете извлечь принцип:

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)));
    }
Другие вопросы по тегам