2012-03-29 14 views
13

Ich habe ein Objekt, das ich zuerst drehen möchte (über seine eigene Mitte) dann übersetzen Sie es zu einem bestimmten Punkt. Ich habe ein Glm :: Quat, das die Rotation hält und ein Glm :: Vec3, das den Punkt enthält, zu dem es übersetzt werden muss.Glm Mähdrescher Rotation und Übersetzung

glm::vec3 position; 
glm::quat orientation; 
glm::mat4 modelmatrix; <-- want to combine them both in here 

modelmatrix = glm::translate(glm::toMat4(orientation),position); 

Dann meine Render-Funktion ich tun ..

pvm = projectionMatrix*viewMatrix*modelmatrix; 
glUniformMatrix4fv(pvmMatrixUniformLocation, 1, GL_FALSE, glm::value_ptr(pvm)); 

..und machen ...

Leider ist das Objekt umkreist nur um den Ursprung, wenn ich eine Rotation (je weiter gelten die "Position" vom Ursprung, desto größer die Umlaufbahn).

Wenn ich nur die Position anwende, wird es gut übersetzt. Wenn ich nur die Rotation anwende, bleibt sie am Ursprung und rotiert um ihren Mittelpunkt (wie erwartet). Warum wird es komisch, wenn ich beides anwende? Fehle ich etwas Grundlegendes?

Antwort

23

Weil Sie sie in der falschen Reihenfolge anwenden. Dadurch glm::translate(glm::toMat4(orientation),position), tun Sie das Äquivalent von dieser:

glm::mat4 rot = glm::toMat4(orientation); 
glm::mat4 trans = glm::translate(glm::mat4(1.0f), position); 
glm::mat4 final = rot * trans; 

Beachten Sie, dass die Übersetzung auf der rechten Seite der Matrix ist, nicht die linke. Dies bedeutet, dass die Übersetzung passiert zuerst, dann erfolgt die Drehung relativ zur Übersetzung. Die Drehung findet also im Raum nach der Übersetzung statt.

Sie möchten, dass die Drehung stattfindet zuerst. Vertauscht also die Reihenfolge der Matrixmultiplikation.

+0

Ich hatte den Eindruck, dass glm :: translate die Übersetzung auf das 1. Argument der Funktion anwendet. Vielen Dank. – Jubei

+3

@Jubei: Es * wendet * die Übersetzung auf die Matrix an. Es richtig multipliziert es. Das heißt, die Übersetzung erfolgt * zuerst *, wenn die Rotation zuerst stattfinden soll. –

+0

Danke für diese Antwort, ich bin schon eine Weile hier festgefahren, aber obwohl ich herausgefunden habe, was ich falsch mache, konnte ich einfach keine Bestätigung finden, dass die Funktionen funktionieren sollten. –