2016-10-30 3 views
1

ich diesen sehr einfachen Code bin mit Objekten um die eigene HerkunftGLM OpenGL Rotation nur dann richtig um die X-Achse

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); 
} 

Das Problem, das ich bin vor zu drehen ist, dass die Drehung nur relativ Richtung zum Objekt der auf die X Achse. Das heißt, egal, auf welche Weise das Objekt zeigt (was seine Ausrichtung ist), wenn ich es um X rotiere, wird es immer um seine eigene X Achse rotieren. Das würde ich gerne machen, aber auch auf der anderen 2-Achse.

Aber Y und Z rotieren immer um die X- und Y-Achse der Welt, ungeachtet dessen, auf welche Weise mein Objekt zu sehen ist.

Mein Code ist so klein und einfach Ich sehe das Problem nicht wirklich? Ist die X-Drehung immer der richtige Unfall, oder sind die anderen beiden falsch?

+0

Hier ist ein Video des Problems: youtube.com/watch? V = DCZJsm8tZA8 – oglglslnoob

Antwort

0

Ich schlage vor, dass Sie dies versuchen:

#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); 
} 

Die GLM :: eulerAngleXYZ Funktion wird den Winkel nehmen und eine Rotationsmatrix daraus erstellen.

Aber beachten Sie gimbal lock.

Wenn Sie die Matrix von rechts nach links multiplizieren, wird sie um die globale Achse rotieren. Wenn Sie es anders herum tun, wird es sich um die lokale Achse drehen.

+0

Hallo, danke für die Antwort, aber ich bekomme das exakt gleiche Ergebnis mit eulerAngleYXZ ... X ist immer noch richtig, Y und Z rotieren immer noch um die globale X- und Y-Achse, nicht lokal :( – oglglslnoob

+0

Ich sehe. Ich werde meine Antwort aktualisieren. – Talesseed

+0

Ich mache keine Matrix-Multiplikation? Abgesehen von Translation * Rotation * Scale, um die Modellmatrix zu bekommen – oglglslnoob