[C# und OpenGl] Polygonspiegelung an einer Ebene

perpetuum.mobile

Grand Admiral Special
Mitglied seit
06.02.2003
Beiträge
2.849
Renomée
21
Standort
Hinter dir!
Hallo Jungs!
Sind hier ein zwei OpenGL Könner am Start? Ich habe ein kleines Problem beim Spiegel eines Polygons mit Hilfe von glScalef().

Ich habe mein C# Projekt (ist was kleines für die Uni, falls das wer wissen will) auch hochgeladen. Im Verzeichnis Debug kann man das Ganze auch schon kompiliert ausführen.
Aufgabe ist es, ein Polygon (die Darstellungsliste 5) an der Ebene y=-x+2 zu spiegeln. Dazu sollen wir nicht einfach die Punkte ausrechnen, sondern das mit einer Reihe von affinen Transformationen machen.

Ich habe das so verstanden:
  1. Mittelpunkt des Koordinatensystems und eine Achse in die Ebene legen
  2. mit Gl.glScalef() den Körper mit einer negativen (-1) Skalierung über die Ebene spiegeln
  3. Koordinatensystem mit umgedrehten Vorzeichen wie bei 1. zurückverschieben

Hier auch mal der Quellcode, den ich dazu verfasst habe. Leider kommt nicht das gewünschte Ergebnis raus. Ich habe zum Vergleich mal das Ganze mit meinem Taschenrechner errechnet. Wer das Programm kompiliert, kann das Errechnete unter Aufgabe 6.1 nachschlagen. Im Vergleich mit Aufgabe 5, meinem Problem, ist das allerdings absolut anders.

Code:
        private void aufgabe5()
        {
            Gl.glEnable(Gl.GL_DEPTH_TEST);   //tiefenschaerfe, damit richtige Farbe dargestellt wird
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);

            //Polygon, welches zu spiegeln ist
            Gl.glNewList(5, Gl.GL_COMPILE);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(-1.5f, 0.0f, 1.0f);
            Gl.glVertex3f(-1.0f, -1.0f, 0.0f);
            Gl.glVertex3f(0.0f, 0.5f, 0.0f);
            Gl.glVertex3f(-1.0f, 1.0f, 0.0f);
            Gl.glVertex3f(-1.5f, 2.0f, 1.0f);
            Gl.glEnd();
            Gl.glEndList();

            //Spiegelebene (ACHTUNG ÜBERPRÜFEN!!!
            Gl.glNewList(8, Gl.GL_COMPILE);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(0.25f, 1.75f, 1.0f);
            Gl.glVertex3f(1.0f, 1.0f, 0.0f);
            Gl.glVertex3f(0.75f, 1.25f, 0.0f);
            Gl.glVertex3f(0.0f, 2.0f, 0.0f);
            Gl.glVertex3f(-0.75f, 2.75f, 1.0f);
            Gl.glEnd();
            Gl.glEndList();


            //ZEICHNEN
            Gl.glPushMatrix();

            //Körper der zu spiegeln ist
            Gl.glColor3fv(blue);
            Gl.glCallList(5);

            //Koordinatensystem verschieben um die Spiegelebene in Z-Achse zu legen
            Gl.glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
            Gl.glTranslatef(0.0f, -2.0f, 0.0f);

            //Körper der gespiegelt wurde
            Gl.glColor3fv(red);
            Gl.glScalef(-1.0f, -1.0f, -1.0f);
            Gl.glCallList(5);

            //Koordinatensystem verschieben um die Spiegelebene wieder in Ursprungstand zu bringen
            Gl.glRotatef(45.0f, 0.0f, 0.0f, -1.0f);
            Gl.glTranslatef(0.0f, 2.0f, 0.0f);

            //Spiegelebene
            Gl.glColor3fv(white);
            Gl.glCallList(8);

            Gl.glPopMatrix();

        }

Die Aufgabe sind im Projekt in der OpenGLPlane.cs zu finden.

Falls mit hier jemand weiterhelfen kann wäre ich sehr dankbar. Ich weiß einfach nicht mehr weiter. Ich vermute einen Fehler bei der eigentlichen Spiegelung mit glScalef(). Das es irgendwie nicht an der richtigen Ebene spiegelt (obwohl es das eigentlich sollte).

grüße und noch schönes WE!
pm
 
So müsste es gehen:

Code:
//Körper der zu spiegeln ist
Gl.glColor3fv(blue);
Gl.glCallList(5);

//Spiegelebene
Gl.glColor3fv(white);
Gl.glCallList(8);

Gl.glPushMatrix();

//Körper der gespiegelt wurde
Gl.glColor3fv(red);
Gl.glTranslatef(0.0f, 2.0f, 0.0f);
Gl.glRotatef(45.0f, 0.0f, 0.0f, -1.0f);
Gl.glScalef(1.0f, -1.0f, 1.0f);
Gl.glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
Gl.glTranslatef(0.0f, -2.0f, 0.0f);
Gl.glCallList(5);

Gl.glPopMatrix();

Die Transformationen werden von unten nach oben "durchlaufen": Erst wird die Spiegelebene in die Z-Achse geschoben, dann um die Z-Achse in die XZ-Ebene gedreht, dann wird gespiegelt (Achtung: 1,-1,1, nur die y-Koordinate wird invertiert. -1,-1,-1 wäre Punktspiegelung durch den Ursprung), danach wieder alles zurückgeschoben.

MfG
 
Hallo!
Ich danke dir! Ich sehe schon, ich hab das mit der Reihenfolge der Befehle im Code nicht wirklich durchdacht gehabt. Jetzt klappt das einwandfrei und danke nochmals! Hast mich vor der Verzweiflung gerettet :)
 
Zurück
Oben Unten