2015-09-04 3 views
1

Я пытаюсь внедрить правильно работающую FPS-подобную камеру в моем недавнем проекте и решил использовать Quaternions, потому что это то, как мой основной движок обрабатывает вращение.OpenGL Quaternion на основе FPS камеры jinggling

Так что все работает нормально. Я обрабатываю свой вход, и камера движется соответственно, но особенно при повороте вокруг глобальной оси y (вверх-оси) при перемещении мыши по оси x-оси, когда я пытаюсь повернуть камеру в том же направлении (обстрел влево/справа), объект, на который я смотрю (простой куб), начинает прыгать немного назад и вперед.

Я действительно не знаю, является ли это проблемой в отношении конфигурации SDL или код моей камеры испорчен.

Так вот код для камеры-поведения:

glm::vec2 dm; 
if (firstTimeFPS) 
{ 
    dm = glm::vec2(); 
    firstTimeFPS = false; 
} 
else 
    dm = pEngine::input->getDeltaMouse(); 

glm::vec3 translation; 


float rotY = dm.x*pEngine::time->deltaTime*0.5; 
float rotX = dm.y*pEngine::time->deltaTime*0.5; 


m_camera.m_transform.rotate(rotY, glm::vec3(0, 1, 0), true); 
m_camera.m_transform.rotate(-rotX, glm::vec3(1, 0, 0), false); 

if (pEngine::input->isKeyDown(SDLK_w)) 
    translation += m_camera.m_transform.getForward(); 
if (pEngine::input->isKeyDown(SDLK_s)) 
    translation -= m_camera.m_transform.getForward(); 
if (pEngine::input->isKeyDown(SDLK_a)) 
    translation += m_camera.m_transform.getLeft(); 
if (pEngine::input->isKeyDown(SDLK_d)) 
    translation -= m_camera.m_transform.getLeft(); 

glm::normalize(translation); 

translation *= pEngine::time->deltaTime * 20; 

m_camera.m_transform.translate(translation); 

И это функция для вычисления мой viewMatrix:

void Camera::recalculateViewMatrix() 
{ 
m_viewMatrix = glm::lookAt(m_transform.position, m_transform.position + m_transform.getForward(), m_transform.getUp()); 
} 

Моя преобразования класс состоит из GLM :: Vec3 на должность и масштаб и один кватернион для представления вращения. Метод вращения в первом блоке кода имеет параметр bool, проверяющий, вращается ли он вокруг глобальной (= истинной) или локальной оси.

Благодарим вас за то, что вы потратили некоторое время, и если требуется более подробный код или что-то еще неясно, пожалуйста, дайте мне знать!

ответ

1

Звучит так, как будто ваш код преобразования перепутался.

Но взглянув на вашу матрицу просмотра, я думаю, что вы не применяете ее правильно.

Предполагая, что вы разделили свои векторы следующим образом, ваша матрица просмотра должна быть рассчитана как таковая.

pos = glm::vec3(1.0f, 1.0f, 1.0f); 
dir = glm::vec3(0.0f, 0.0f, -1.0f); 
up = glm::vec3(0.0f, 1.0f, 0.0f); 
rot = glm::angleAxis(0.0f, dir); 

viewMatrix = glm::mat4_cast(rot) * glm::lookAt(pos, pos + dir, up); 
+0

Спасибо за ваш ответ, но похоже, что ничего не исправить. Вместо этого движение сейчас действительно странно. Я предполагаю, что проблема связана с представлением, не перпендикулярным вектору getLeft(). Как я уже сказал, движение проходило без пробок, но это раздражающее смещение объектов не кажется правильным. – HugoCodes

+0

Как вы вычисляете getLeft? Должно быть 'glm :: cross (dir, up)'. В противном случае могут быть небольшие возмущения. –

+0

В настоящее время я извлекаю getLeft из Quarterion Rotation следующим образом: 'glm :: vec3 Transform :: getLeft (float f) {return (glm :: normalize (rotation) * glm :: vec3 (1,0,0)) * f;} 'Где float f является значением для масштабирования вектора направления. – HugoCodes

 Смежные вопросы

  • Нет связанных вопросов^_^