Я создаю игрушечный 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](https://i.stack.imgur.com/aYN8g.png)
Кажется, что представление кватерниона или, по крайней мере, его преобразование кватерниона в матрицу, сводит на нет "компонент" рысканиявращение, действующее как Y вниз, а не вверх.Однако, когда вектор поворачивается на этот кватернион, он, кажется, действует правильно, как будто Y вверх.Интересно, что другая часть кода (касающаяся поворотов транспортного средства), кажется, работает правильно только тогда, когда кватернион поворачивается на -yaw вместо yaw.(Проблема рендеринга сохраняется).
Любые объяснения или средства для решения этой проблемы?