Я пытаюсь внедрить правильно работающую 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, проверяющий, вращается ли он вокруг глобальной (= истинной) или локальной оси.
Благодарим вас за то, что вы потратили некоторое время, и если требуется более подробный код или что-то еще неясно, пожалуйста, дайте мне знать!
Спасибо за ваш ответ, но похоже, что ничего не исправить. Вместо этого движение сейчас действительно странно. Я предполагаю, что проблема связана с представлением, не перпендикулярным вектору getLeft(). Как я уже сказал, движение проходило без пробок, но это раздражающее смещение объектов не кажется правильным. – HugoCodes
Как вы вычисляете getLeft? Должно быть 'glm :: cross (dir, up)'. В противном случае могут быть небольшие возмущения. –
В настоящее время я извлекаю getLeft из Quarterion Rotation следующим образом: 'glm :: vec3 Transform :: getLeft (float f) {return (glm :: normalize (rotation) * glm :: vec3 (1,0,0)) * f;} 'Где float f является значением для масштабирования вектора направления. – HugoCodes