OpenGL Problem: bei GL_FILL Form anders als bei GL_LINE

Dörti.Hermi

Erfahrenes Mitglied
Hallo Leute,

folgendes Problem: Ich zeichne mit c++ und OpenGL (GLUT) einen Seestern. Erstellt wird die Figur auf der Basis eines Kreises, bei dem dann der Radius abhängig vom derzeitigen Winkel ist.

Code:
glBegin (GL_POLYGON);
for (i = 0; i < ECKENZAHL; i ++)
{
   phi = 2 * PI * i / (float) ECKENZAHL;
   rphi = r * sin (phi * 5); // 5 --> 5 Arme vom Seestern
   x = rphi * cos (phi) + m->get_x();
   y = rphi * sin (phi) + m->get_y();
   glVertex2f (x, y);
}
glEnd ();

ECKENZAHL ist eine Konstante mit Wert 200, also besteht ein Kreis aus 200 Punkten. rphi ist der winkelabhängige Radius.

Nun passiert folgendes: wird vorher glPolygonMode auf "GL_LINE" gesetzt, zeichnet er einen tadellosen Seestern mit 5 Armen. siehe 1. Bild.
wird glPolygonMode aber auf "GL_FILL" gesetzt, so zeichnet er den Seestern zwar flächig, dafür aber unförmig und nicht regelmäßig. siehe 2. Bild

Was ist hier los? Ist das ein Bug von OpenGL?

Schon mal Danke für die Antworten.
Lg Andi
 

Anhänge

  • bild1.jpg
    bild1.jpg
    11,1 KB · Aufrufe: 90
  • bild2.jpg
    bild2.jpg
    9,9 KB · Aufrufe: 90
Hallo,

irgendwie kann ich mir nicht vorstellen, dass das Bild links aus diesem Code entsteht. rphi ist doch im ersten Durchlauf gleich mal 0. Trotzdem liegt keiner der Punkte im Zentrum. Irgendwas ist da also faul...
Abgesehen davon: mit GL_POLYGON können nur konvexe Polygone gezeichnet werden. Wenn du versuchst ein konkaves Polygon zu zeichnen, ist das Verhalten undefiniert.

Grüße, Matthias
 
Zuletzt bearbeitet:
Ah, hab beim Kopiern was übersehen.

Code:
phi = 2 * PI * i / (float) ECKENZAHL;
phi2 = phi + phi_anf; // <<<<
rphi = r * (1 + lg_arme * sin (phi * anz_arme));
x = rphi * cos (phi2) + m->get_x();
y = rphi * sin (phi2) + m->get_y();
glVertex2f (x, y);

Funktioneren tut's, das ist jetzt nicht das Problem. Wie ist das aber mit dem konkaven und konvexen Polygon zu verstehen? Hier handelt es sich doch um ein konvexes Polygon, oder nicht?

lg Andi
 
Achso, alles klar.

Aber warum funktioniert es dann mit GL_LINE und bei GL_FILL nicht? Konkav is das Polygon doch so oder so. Könnte das einfach ein Bug von OpenGL sein?

lg Andi
 
Aber warum funktioniert es dann mit GL_LINE und bei GL_FILL nicht? Konkav is das Polygon doch so oder so.
Zufall. Vermutlich wird aus einem Polgon mit GL_LINE einfach ein geschlossener Linestrip gemacht, was mit jedem Polygon funktioniert. Ein gefülltes Polygon muss allerdings erst mal trianguliert werden, was nicht ganz so trivial ist. Deswegen auch die Forderung, dass es nur mit konvexen Polygonen funktionieren muss (die Implementierung für allgemeine Polygone wäre etwas aufwändiger).

Könnte das einfach ein Bug von OpenGL sein?
Nein.

Grüße, Matthias
 
Hm, naja, werd mich damit abfinden. Ist wahrscheinlich wirklich nur Zufall dass das funktioniert.

Danke für deine Hilfe!

lg Andi
 
Zurück