2016-05-27 4 views
1

Ich möchte einen Garten von Blumen mit OpenGL Transformation Objekte zeichnen. Zuerst habe ich angefangen, Blütenblatt der Blume zu zeichnen, und ich will, dass es gedreht wird, damit die Blume erzeugt wird, aber wenn ich glRotatef() benutze, kann ich das Objekt nicht mehr sehen. Hier ist ein Teil meines Code:Objekt nicht gezeigt nach Anwendung von Transformationsfunktionen in Opengl

const float DEG2RAD = 3.14159/180; 

void init(void) 
{ 
    glClearColor(0.0, 0.0, 0.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, 400.0, 0.0, 400.0); 
    glMatrixMode(GL_MODELVIEW); 
} 

void petal(void) 
{ 
    float x, y, z; 
    float A = 20; 
    float t; 

    glColor3f(1.0, 0.0, 0.0); 
    glPointSize(2); 
    glLoadIdentity(); 
    glRotatef(90.0, 0.0, 0.0, 0.5); 
    glTranslatef(10,10, 0); 

    glBegin(GL_POINTS); 
    t = 0; 
    while (t < 90) 
    { 
     x = A*sin(2 * t*DEG2RAD)*cos(t*DEG2RAD); 
     y = A*sin(2 * t*DEG2RAD)*sin(t*DEG2RAD); 
     z = 0; 
     glVertex3f(x, y, z); 
     t++; 
    } 
    glEnd(); 
    glFlush(); 
} 
int main(void) 
{ 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowPosition(200, 100); 
    glutInitWindowSize(600, 600); 
    glutCreateWindow("Garden"); 
    init(); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glutDisplayFunc(petal); 
    glutMainLoop(); 
    return 0; 
} 
+0

IIRC Sie müssen die Matrixfunktionen in der * umgekehrten * Reihenfolge der Transformationen aufrufen (damit die Transformationen von unten nach oben angewendet werden). Was Sie jetzt haben, wenn Sie 'glRotatef' auskommentieren, ist eine Übersetzung zu (100, 100) gefolgt von einer Rotation um das Zentrum der Welt. Wenn Sie innerhalb der 2D-Ebene drehen möchten, muss die 'glRotatef'-Achse entlang der z-Koordinate sein, nicht x. – Quentin

+0

@Quentin Richtig, die letzte Funktion wird zuerst angewendet, aber wenn ich "glRotatef" auskommentiere, kann ich nichts mehr sehen, ich denke, dass es aus dem Ansichtsfenster herauskommt und ich weiß nicht, was die Werte der Transformation sein sollten? – Zeinab

+0

Haben Sie versucht, die Achse zu fixieren? Wenn Sie eine orthographische Projektion mit dem Ursprung in einer Ecke verwendet haben, vermute ich, dass das Objekt aus der Ansicht herausgedreht wird. – Quentin

Antwort

3

konnte ich Ihren vollständigen Code kompilieren und zu testen. Der Fehler liegt in der Reihenfolge der Transformationen in petal:

glRotatef(90.0, 0.0, 0.0, 0.5); 
glTranslatef(100,100, 0); 

Dies wird zuerst das Blütenblatt in Richtung der Mitte des Fensters übersetzen, dann dreht es um 90 ° um die untere linke Ecke (der Ursprung eingestellt durch gluOrtho2D) . Infolgedessen geht das Blütenblatt außerhalb des Fensters. Sie müssen nur beiden Anrufe tauschen:

glTranslatef(100,100, 0); 
glRotatef(90.0, 0.0, 0.0, 1.0); 

Dann das Blatt zuerst um den Ursprung gedreht wird (das ist seine Spitze), dann zum Zentrum übersetzt.

Als eine Randnotiz, es sieht aus wie Sie vergessen haben, glutInit(&argc, argv) vor der Verwendung von GLUT aufrufen, ich hatte einen harten Fehler zur Laufzeit darüber.

+1

Beachten Sie auch, dass 0.5 in glRotatef 1.0 wurde. Wahrscheinlich möchten Sie, dass Ihre Achse ein Einheitsvektor ist. – 246tNt

+0

@Quentin Yeah :) Eine Sache mehr, ich möchte eine Blume mit 4 Blütenblättern erstellen, also möchte ich sowohl das erste Objekt vor der Transformation und danach haben. Weißt du, wie kann ich es tun? – Zeinab

+1

@ 3ngineer Der einfachste Weg ist es, jedem seine eigene Transformationsmatrix zu geben, indem man die gesamte "Blütenblatt" -Funktion mehrere Male mit einem Parameter für den Blütenblattwinkel aufruft. Sie sollten jedoch 'glFlush' vermeiden, wenn Sie das tun. – Quentin