GLM кватернион перевернутая рыскание - PullRequest
0 голосов
/ 03 марта 2019

Я создаю игрушечный 3D-движок с использованием OpenGL и GLM.Моя система координат направлена ​​вправо, где X направо, Y вверх и Z назад.

Преобразование объекта состоит из трехмерного вектора и одного из кватернионов GLM.Физическая симуляция в 2D, поэтому скорость объекта является 2D вектором (на Y нет скорости, только на XZ, плоскости земли).Точно так же угловая скорость только вокруг оси Y (рыскание).

// Properly integrate the change in velocities
auto deltaPos = (physics->velocity + physics->lastVelocity) * 0.5f * deltaTime;
auto deltaYaw = (physics->yawVelocity + physics->lastYawVelocity) * 0.5f * deltaTime;
// Apply the velocities
transform->position += glm::vec3 {deltaPos.x, 0, deltaPos.y} * transform->orientation
transform->orientation = glm::quat(glm::vec3 {0, deltaYaw, 0}) * transform->orientation;

Я рисую мир с помощью нисходящей камеры, преобразуя ориентацию в матрицу 4x4, умножая ее (вв правильном порядке) с масштабом и матрицей перевода:

glm::mat4x4 transformMat =
        glm::translate(transform->position) *
        glm::mat4x4(transform->orientation) *
        glm::scale(glm::vec3 {size.x, 1.0f, size.y});

.. и отправкой его в шейдер, где он умножается на координаты точки и матрицы проекции и вида:

// projView is projection * view
gl_Position = projView * transform * vec4(vertPosition.xyz, 1.0);

Однако, хотя этот код кажется простым, рывок объектов иногда кажется перевернутым.Когда объект поворачивается влево, он начинает двигаться влево (линия position += deltaPosition * orientation работает правильно), но он отображается как вращающийся вправо, но движущийся влево.Это пример изображения:

yaw problem example

Кажется, что представление кватерниона или, по крайней мере, его преобразование кватерниона в матрицу, сводит на нет "компонент" рысканиявращение, действующее как Y вниз, а не вверх.Однако, когда вектор поворачивается на этот кватернион, он, кажется, действует правильно, как будто Y вверх.Интересно, что другая часть кода (касающаяся поворотов транспортного средства), кажется, работает правильно только тогда, когда кватернион поворачивается на -yaw вместо yaw.(Проблема рендеринга сохраняется).

Любые объяснения или средства для решения этой проблемы?

1 Ответ

0 голосов
/ 04 марта 2019

Оказывается, я неправильно применял кватернионы: В этой строке:

transform->position += glm::vec3 {deltaPos.x, 0, deltaPos.y} * transform->orientation

определение умножения в GLM фактически вращало вектор с помощью инверсии кватерниона.Правильная строка была:

transform->position += transform->orientation * glm::vec3 {deltaPos.x, 0, deltaPos.y};

Спасибо Нико Шертлеру за то, что он направил мое внимание в правильном направлении.

...