C ++ / OpenGL - Drehen eines Rechtecks
Frage
Für mein Projekt ich brauchte ein Rechteck zu drehen. Ich dachte, das wäre einfach, aber ich bin immer ein unvorhersehbares Verhalten, wenn es ausgeführt wird ..
Hier ist der Code:
glPushMatrix();
glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(0, 0);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(width_sprite_, 0);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(width_sprite_, height_sprite_);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(0, height_sprite_);
glEnd();
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
Das Problem mit dieser ist, dass mein Rechteck eine Übersetzung irgendwo im Fenster macht beim Drehen. Mit anderen Worten, das Rechteck nicht die Position halten: vec_vehicle_position_.x
und vec_vehicle_position_.y
Was ist das Problem?
Danke
Lösung
Sie müssen die Reihenfolge der Transformationen leicht zu schlagen:
glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
wird
glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
Andere Tipps
Um auf den vorherigen Antworten auszuarbeiten.
Transformationen in OpenGL über Matrix-Multiplikation durchgeführt. In Ihrem Beispiel haben Sie:
M_r_ - die Rotation Transformation
M_t_ - die Übersetzung Transformation
v - eine Ecke
und Sie sie in der Reihenfolge angewendet hatte:
M_r_ * M_t_ * v
Klammern verwenden zu klären:
(M_r_ * (M_t_ * v))
Wir sehen, dass der Scheitelpunkt zuerst durch die engere Matrix transformiert wird, die die Übersetzung in diesem Fall ist. Es kann ein bisschen unlogisch sein, denn dies erfordert, dass Sie Gegenteil von dem, die Transformationen in der Reihenfolge zu spezifizieren, die Sie sie in angewendet werden soll. Aber wenn man bedenkt, wie die Transformationen auf der Matrix-Stack gelegt werden sollte hoffentlich ein wenig mehr Sinn machen, (der Stapel vormultipliziert zusammen).
So warum, um das gewünschte Ergebnis zu erhalten, um die Transformationen in der umgekehrten Reihenfolge spezifizieren erforderlich.
Inertiatic bot eine sehr gute Resonanz. Von einer Code Sicht passieren werden Ihre Transformationen in der umgekehrten Reihenfolge, wie sie erscheinen. Mit anderen Worten, verwandelt sich näher an der tatsächlichen Zeichencode wird zuerst angewendet werden.
Zum Beispiel:
glRotate();
glTranslate();
glScale();
drawMyThing();
Wird zuerst die Sache skalieren, dann ist es übersetzen, dann drehen Sie es. Sie müssen wirksam, um herauszufinden, „Code rückwärts gelesen“, die Transformationen in welcher Reihenfolge angewendet werden. Beachten Sie außerdem, was der Zustand dieser Transformationen ist, wenn Sie drücken und Pop der Model-View-Stack.
Stellen Sie sicher, dass die Drehung vor der Übersetzung angewandt wird.