openGL Rotation



  • Hi!

    Ich moechte (in ANSI C) ein konvexes Polygon in 2D um die Z-Achse rotieren lassen. Mein Code (siehe unten) macht das auch, allerdings in einem viel zu grossen Radius.

    static void drawIt()
    {
        int center[2]; //specify center point of the object
        center[0]=200; //x location of object
        center[1]=200; //y location of object
        int size = 5;
    
        glClear(GL_COLOR_BUFFER_BIT);
        glPushMatrix();
        glTranslatef(center[0], center[1], 0.0);
        glRotatef(steer, 0.0, 0.0, 1.0); //Die Winkel-Variable steer ist global!!! Sie wird in einer anderen Funktion staendig veraendert.
    
        glPolygonMode(GL_FRONT_AND_BACK, GL_POLYGON);
        glBegin(GL_POLYGON);
    	glEdgeFlag(GL_FALSE);
    	glVertex2f(center[0]-2*size, center[1]);
    	glEdgeFlag(GL_TRUE);
    	glVertex2f(center[0]+5*size, center[1]);
    	glEdgeFlag(GL_TRUE);
    	glVertex2f(center[0]-4*size, center[1]-3*size);
        glEnd();
        glBegin(GL_POLYGON);
    	glEdgeFlag(GL_TRUE);
    	glVertex2f(center[0]-2*size, center[1]);
    	glEdgeFlag(GL_TRUE);
    	glVertex2f(center[0]-4*size, center[1]+3*size);
    	glEdgeFlag(GL_FALSE);
    	glVertex2f(center[0]+5*size, center[1]);
        glEnd();
    
        glPopMatrix();
        glutSwapBuffers();
    }
    

    Kann mir jemand erklaeren, wieso mein Polygon in einem grossen Radios gedreht wird?
    Warum dreht es sich nicht einfach um seinen Mittelpunkt (ohne Radius)?



  • Hi,

    dein Rotationsfixpunkt ist (0,0). Da das Zentrum deines Polygons bei (200, 200) liegt, ergibt sich eine solche Rotation mit großem Radius. Wenn du um das Zentrum des Polgons drehen willst, musst du zunächst deine Szene so translieren das dein gewünschtes Rotationszentrum (center) im Ursprung ist und nach der Rotation wieder zurück translieren.

    Einfacher wäre es du zeichnest deine Polygon "nahe des Ursprungs" (sodass keine center[i] in glVertex auftauchen) und führst dann die Transformationen aus.

    Grüße!

    Edit: typos



  • Danke!!! Jetzt läufts perfectly!


Anmelden zum Antworten