2016-10-30 10 views
1

Я использую этот очень простой код, чтобы вращать объекты вокруг своего собственного происхожденияGLM OpenGL вращение правильно только вокруг оси X

void Entity::rotate(unsigned short axis, float speed, float delta) 
{ 
    m_Orientation[axis] += delta * speed; 
    glm::quat quaternion = glm::quat(glm::vec3(m_Orientation[0], m_Orientation[1], m_Orientation[2])); 

    m_RotationMatrix = glm::mat4_cast(quaternion); 
} 

Проблема я столкнулся в том, что вращение только родственница объект направления на X ось. Имея в виду, что независимо от того, с каким объектом объект сталкивается (какова его ориентация), если я поверну его вокруг X, он всегда будет вращаться вокруг своего собственного X ось. Это то, что я хотел бы сделать, но и на другой оси 2.

Но Y и Z всегда вращаются вокруг осей X и Y вокруг мира, не обращая внимания на то, как обращается мой объект.

Мой код такой маленький и простой Я действительно не вижу проблемы? Является ли поворот X всегда правильным в случае аварии, или это значит, что другие два ошибочны?

+0

Вот видео о проблеме: youtube.com/watch? V = DCZJsm8tZA8 – oglglslnoob

ответ

0

Я предлагаю вам попробовать это:

#include <glm/gtx/euler_angles.hpp> 
/** 
If you change speed to a vec3, 
it do all the calculations at once 
(you won't have to do it for each angle) 
**/ 

void Entity::rotate(glm::vec3 speed, float delta) 
{ 
    rotation = speed * data 
    m_modelMatrix *= glm::eulerAngleXYZ(rotation.x, rotation.y, rotation.z); 
} 

GLM :: функция eulerAngleXYZ будет принимать углы и создать матрицу вращения от него.

Но помните, что gimbal lock.

Если вы выполняете умножение матрицы справа налево, она будет вращаться вокруг глобальной оси. Если вы сделаете это другим способом, он будет вращаться вокруг локальной оси.

+0

Привет, спасибо за ответ, однако я получаю точный результат с помощью eulerAngleYXZ ... X по-прежнему правилен, Y и Z по-прежнему вращаются вокруг глобальной оси X и Y, а не локально :( – oglglslnoob

+0

Я вижу. Я обновлю свой ответ. – Talesseed

+0

Я не делаю никакого матричного умножения? Помимо перевода * Вращение * Масштаб, чтобы получить модельную матрицу – oglglslnoob

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

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