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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top