Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Mär 29, 2024 01:54

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Circle Leer und befüllt erstellen
BeitragVerfasst: Di Aug 02, 2016 07:18 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Hallo Wissende,

ich habe den Code von dieser Seite nach Delphi portiert und habe 2 Probleme damit.

http://slabode.exofire.net/circle_draw.shtml

Code:
  1.  
  2. procedure TForm1.DrawCircle(cx, cy: extended; r, iNumSegments :integer);
  3. var
  4.   theta, c, s, t : extended;
  5.   i :integer;
  6.   x, y : extended;
  7. begin
  8.     theta := 2 * 3.1415926 / iNumSegments;
  9.     c := cos(theta);//precalculate the sine and cosine
  10.     s := sin(theta);
  11.     //t;
  12.  
  13.     x := r;//we start at angle = 0
  14.     y := 0;
  15.  
  16.     glBegin(GL_LINE_STRIP);
  17.     for i := 0 to iNumSegments do
  18.       begin
  19.       glVertex2f(x + cx, y + cy);//output vertex
  20.  
  21.       //apply the rotation matrix
  22.       t := x;
  23.       x := c * x - s * y;
  24.       y := s * t + c * y;
  25.       end;
  26.     glEnd();
  27. end;
  28.  


1. Den Kreis ist nicht befüllt sondern nur ein Umkreis. Wie bekomme ich das Teil befüllt?
2. Wenn ich die Szenerie vom Framebuffer in ein TGA speichere, ist der Kreis bisher nie dabei gewesen.

Kann mir eine(r) von Euch ein paar Tipps geben?

Vielen Dank
LG Tom


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 02, 2016 08:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Zu erstens:
Dass du nur den Umkreis siehst, liegt daran, dass du mit GL_LINE_STRIP zeichnest. Nimm GL_POLYGON oder GL_TRIANGLE_FAN, dann müsstest du einen gefüllten "Kreis" sehen.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 02, 2016 10:07 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Hi,
glAwesome hat geschrieben:
Zu erstens:
Dass du nur den Umkreis siehst, liegt daran, dass du mit GL_LINE_STRIP zeichnest. Nimm GL_POLYGON oder GL_TRIANGLE_FAN, dann müsstest du einen gefüllten "Kreis" sehen.


Habs jetzt so abgeändert:
Code:
  1.  
  2.     glBegin(GL_POLYGON);
  3.     for i := 0 to iNumSegments do
  4.       begin
  5.       glColor4f(1, 1, 0, 0.1);
  6.       glVertex2f(x + cx, y + cy);//output vertex
  7.  


Jetzt ist der Kreis befüllt uns Gelb. Prima!
Allerdings wird der 4. Wert aus glColor4f für den Alpha aktuell ignoriert. Woran kann das liegen?
Wie könnte ich den Kreis mit einem transparenten Verlauf von Innen nach aussen zeichnen?
Könnte man dem Kreis auch ein Loch spendieren - ala Disc?

Neue Fragen - Neuer Thread? :?:

Vielen Dank so far
Lg Tom


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 02, 2016 10:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Damit der Alphakanal als Transparenz interpretiert wird, musst du Blending aktivieren. Siehe auch Tutorial Lektion 7.

Natürlich kannst du auch einen Kreis mit Loch und Farbverlauf machen. Dazu brauchst du dann zwei Ringe von Vertices - einen innen und einen außen. Diese Vertices nutzt du dann als Eckpunkte für die Dreiecke dazwischen. Hast du verstanden, wie der von dir gepostete Code funktioniert, also insbesondere die Berechnung der Koordinaten?

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 02, 2016 11:27 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Jo, also das mit dem Erstellen des Kreises habe ich Sourcetechnisch im Großen und Ganzen verstanden.
Ganz grob werden 2 Vertex gesetzt und dazwischen eine Linie gezeichnet. Die Vertex werden in der Anzahl der Segmente in einer Schleife mit Abstand r vom Mittlpunkt erstellt.

Ich hatte auch versucht den Code so umzuschreiben, dass ich vom Mittelpunkt aus Dreiecke zum Aussenradius erstelle. Das Ergebnis sah aber sehr komisch aus. Wie ein dreieckiges Ei. ;-) Ich versuchs nochmal und poste dann hier, wenn es wieder schief geht.

Das mit dem Blending muss ich mir mal anschauen. Ich dachte, dass es reichte, wenn man das Blending rundsätzlich für alles aktiviert und das war´s dann. Naja - sicher ein Anfängerfehler.

Lg Tom


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 02, 2016 11:39 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Also ich habe den Code versuchstechnisch mal so abgeändert, weil ich hoffte, dass es so gehen könnte.

Code:
  1.  
  2. procedure TForm1.DrawCircle(cx, cy: extended; iRadius, iNumSegments :integer);
  3. var
  4.   theta, c, s, t : extended;
  5.   i :integer;
  6.   x, y : extended;
  7. begin
  8.     theta := 2 * 3.1415926 / iNumSegments;
  9.     c := cos(theta);//precalculate the sine and cosine
  10.     s := sin(theta);
  11.     //t;
  12.  
  13.     x := iRadius;//we start at angle = 0
  14.     y := 0;
  15.  
  16.     glBegin(GL_POLYGON);
  17.     for i := 0 to iNumSegments do
  18.       begin
  19.       glVertex2f(x, y);                  //vertex in der Mitte?
  20.       glVertex2f(x + cx, y);          //1. Aussenpunkt?
  21.       glVertex2f(x + cx, y + cy);  //2. Aussenpunkt?
  22.  
  23.       //apply the rotation matrix
  24.       t := x;
  25.       x := c * x - s * y;
  26.       y := s * t + c * y;
  27.       end;
  28.     glEnd();
  29. end;
  30.  


Habe vor dem Code noch das hier ausgeführt:
Code:
  1.   glColor4f(0, 1, 0, 0.5);
  2.  


Und da ich testhalber alle anderen Quads und sonstigen Testelemente remarkt habe, ist der "Kreis" jetzt sogar mit 50% Transparenz im Ganzen...

Die Form ist halt schon komisch. ;-)


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 02, 2016 11:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Wenn du Dreiecke zwischen Mittelpunkt und Rand zeichnen willst, ist der erste Schritt GL_TRIANGLES zu benutzen. Der Mittelpunkt wird in deiner Funktion durch die Koordinaten cx und cy beschrieben (wohl für center x/y). Der Einfachheit halber würde ich vorschlagen, dass du erst ein Array mit allen iNumSegments Außenpunkten des Kreises anlegst. Dann iterierst du über dieses Array und zeichnest für jedes Element ein Dreieck. Die Eckpunkte sind dabei
  • der Mittelpunkt (cx, cy)
  • Array-Element i
  • Array-Element i+1 modulo iNumSegments. Die Modulo-Operation ist nötig, weil das nächste Element vom letzten wieder das erste ist.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 02, 2016 12:14 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Klingt logisch - aber das muss ich erstmal verdauen. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 02, 2016 12:23 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Also bevor ich das mit dem Array mache, wollte ich mal die Korrektur der Schleife testen, um zu sehen, ob der Kreis eventuell wirklich ein Kreis wird. ;-)

Schon besser.
Code:
  1.  
  2.     glBegin(GL_TRIANGLES);
  3.     for i := 0 to iNumSegments do
  4.       begin
  5.       glVertex2f(cx, cy);
  6.       glVertex2f(cx + x, cy);
  7.       glVertex2f(cx + x, cy + y);
  8.         ...  //usw.
  9.  


Bringt mich dann zu dieser Art Kreis:


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 02, 2016 17:21 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Diese procedure zeichnet dir einen schön runden Kreis.
Code:
  1. const
  2.   FSektoren = 36;
  3.  
  4. procedure TForm1.Kreis(r, x, y: single);
  5. var
  6.   w, seg: single;
  7.   i: integer;
  8. begin
  9.   glPushMatrix;
  10.   glTranslatef(x, y, 0);
  11.   seg := 2 / FSektoren * Pi;
  12.   glbegin(GL_TRIANGLE_STRIP); // Achtung, hier Strip !
  13.   for i := 0 to FSektoren do begin
  14.     w := i * seg;
  15.     glColor3f(1, 0, 0);
  16.     glVertex3f(0, 0, 0);
  17.     glColor3f(0, 1, 0);
  18.     glVertex3f(cos(w) * r, sin(w) * r, 0);
  19.   end;
  20.   glEnd();
  21.   glPopMatrix;
  22. end;  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 02, 2016 19:58 
Offline
DGL Member

Registriert: Fr Jan 28, 2005 16:58
Beiträge: 36
Hey, vielen Dank!

Das funktioniert sehr gut. Ich konnte die Farbgebung auch auf
Code:
  1. glColor4f(1, 0, 0, 0);

ändern und dadurch den Kreis farblich flexibel gestalten.

Vielen Dank
Lg Tom


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 03, 2016 17:20 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
ich habe den Code von dieser Seite nach Delphi portiert und habe 2 Probleme damit.

http://slabode.exofire.net/circle_draw.shtml

Ich habe diese Seite mal genauer angeguckt. Das erste Beispiel entspricht etwa meinem Code.
Aber was die unteren Listings machen, kann ich auch nicht verstehen.

Noch ein Tip, wen du einen Ring brauchst, kannst sehr einfach meinen Code abändern:

Code:
  1.   for i := 0 to FSektoren do begin
  2.     w := i * seg;
  3.     glColor3f(1, 0, 0);
  4.     glVertex3f(cos(w) * ri, sin(w) * ri, 0);
  5.     glColor3f(0, 1, 0);
  6.     glVertex3f(cos(w) * ra, sin(w) * ra, 0);
  7.   end;

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 33 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.304s | 17 Queries | GZIP : On ]