OpenGL: Texture rotieren



  • Hallo,

    ich versuche verzweifelt, eine Texture auf ein Rechteck zu mappen und um einen Winkel [°] zu rotieren. Trotz diverser Beispielposts in Foren will mir das nicht gelingen. Hier meine Funktion:

    void GLWidget::drawArrow(double w_x, double w_y, double rot_deg) {
    		double w = 0.0005;
    		double w_half = w / 2.0;
    
    		glEnable(GL_TEXTURE_2D);
    		m_pArrow->bind(); // Kapselt den ganzen Bind-Mist
    
    		glMatrixMode(GL_TEXTURE);
    		glLoadIdentity();
    		glTranslatef(w_x, w_y, 0.0);
    		glRotatef(rot_deg, 0.0, 0.0, 1.0);
    		glTranslatef(-w_x, -w_y, 0.0);
    		glMatrixMode(GL_MODELVIEW);
    
    		glBegin(GL_QUADS);
    		glTexCoord2d(0, 0); glVertex3d(w_x - w_half, w_y - w_half, 0); 
    		glTexCoord2d(1, 0); glVertex3d(w_x + w_half, w_y - w_half, 0); 
    		glTexCoord2d(1, 1); glVertex3d(w_x + w_half, w_y + w_half, 0); 
    		glTexCoord2d(0, 1); glVertex3d(w_x - w_half, w_y + w_half, 0); 
    		glEnd();
    
    		glDisable(GL_TEXTURE_2D);
    }
    

    Ergebnis, wenn ich diese Funktion mit "135.0" aufrufe:

    http://abload.de/img/arrowu1l1y.png

    • Es sind nicht 135° sondern 225°?
    • Die Rotation scheint nicht um den Ursprung geschehen zu sein, da Artefakte (Textur erscheint an den Rändern abgeschnitten) auftreten
    • Ich zeichne noch mit glTextFont (fontDrawString) Texte, die allerdings zerstört werden, sobald meine drawArrow() aufgerufen wird

    Was ist hier alles falsch 😕



  • Rechnest du auch im Bogenmaß?



  • XMAMan schrieb:

    Rechnest du auch im Bogenmaß?

    Soll laut Doku nicht in Grad gerechnet werden?



  • [quote="NoOP345"]

    XMAMan schrieb:

    Soll laut Doku nicht in Grad gerechnet werden?

    AFAIK doch, Grad ist schon richtig.

    NoOP345 schrieb:

    • Es sind nicht 135° sondern 225°?
    • Die Rotation scheint nicht um den Ursprung geschehen zu sein, da Artefakte (Textur erscheint an den Rändern abgeschnitten) auftreten
    • Ich zeichne noch mit glTextFont (fontDrawString) Texte, die allerdings zerstört werden, sobald meine drawArrow() aufgerufen wird
    1. Es dreht halt in die andere Richtung als die die du erwartest. Kannst den Winkel ja mit -1 multiplizieren, dann sollte es gehen.
    2. Ohne überprüft zu haben ob der Code für die Rotation richtig ist: Die Textur wird natürlich abgeschnitten. Zwei gerehte Vierecke passen nunmal nicht aufeinander, deshalb wird ein Teil der Textur abgeschnitten und ein anderer Teil wiederholt.
    3. Du musst für "fontDrawString" auch eine eigene Matrix laden, sonst wird die letzte (aka die von "drawArrow" verwendet. Tipp: Matrizen mit "glPushMatrix" und "glPopMatrix" sichern und wiederherstellen.

Anmelden zum Antworten