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

Aktuelle Zeit: Do Jul 10, 2025 03:17

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: OpenGL Quadric zeichnen
BeitragVerfasst: Mo Mär 03, 2008 10:18 
Offline
DGL Member

Registriert: So Mär 02, 2008 18:47
Beiträge: 30
Hallo,

ich würde gern mit einer quadric eine Tischplatte zeichnen. Geht soetwas überhaupt ?

Ich habe also einen offenes Rechteck gezeichnet. Dieses hat auch eine Tiefe, jedoch
ist in der Mitte ein Loch.

Mein Code:

Code:
  1.   //zeichne die Platte
  2.   glu.gluQuadricNormals(quadric, GLUEnum.GLU_SMOOTH);
  3.   glu.gluQuadricTexture(quadric, GLEnum.GL_TRUE);
  4.   gl.glEnable(GLEnum.GL_TEXTURE_2D);
  5.  
  6.  
  7.   // Rechteck mit Zylinder      4 Ecken  
  8.   glu.gluCylinder(quadric, 1, 1, 0.3, 4, 1);
  9.  
  10.   // das hat bisher keine Wirkung gezeigt-
  11.   glu.gluQuadricDrawStyle(quadric, GLUEnum.GLU_FILL);



Über eine Hilfestellung wäre ich dankbar.

Wie würdet Ihr denn eine Tischplatte zeichnen ?


Viele Grüße

// Edit Lossy: Code Tags hinzugefügt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 03, 2008 20:20 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Einen echten Würfel bieten Quadricen nicht an.
Allerdings ist das auch gar nicht nötig, da man einen Würfel sehr leicht selbst bauen kann. Idealerweise einfach den nötigen Code in eine Funktion auslagern, und schon kannst du ihn überall wiederverwenden.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 05, 2008 21:23 
Offline
DGL Member

Registriert: So Mär 02, 2008 18:47
Beiträge: 30
Hallo,

OK. Danke für den Hinweis. Versuche gerade eine solche Funktion zu erstellen. Doch irgendwie kann nachstehende Lösung nicht das
Non plus Ultra sein. Wäre es nicht schöner, anstatt permanent mit den Koordinaten, nur einmal ein Quadrat zu zeichnen und
dieses dann mit Hilfe von Translation und Rotation so zu duplizieren, dass ein Quader entsteht?

Wie macht Ihr das denn genau ? Mit nachstehendem Code?
Ich bitte nur den OPEN GL Teil zu beachten.


Code:
  1. void setQuad(){
  2.        
  3.         gl.glBegin(GL_QUADS);                                      // Start Drawing The Cube
  4.        
  5.         gl.glColor3f(0.0f,1.0f,0.0f);                      // Set The Color To Blue
  6.         gl.glVertex3f( 1.0f, 1.0f,-1.0f);                  // Top Right Of The Quad (Top)
  7.         gl.glVertex3f(-1.0f, 1.0f,-1.0f);                  // Top Left Of The Quad (Top)
  8.         gl.glVertex3f(-1.0f, 1.0f, 1.0f);                  // Bottom Left Of The Quad (Top)
  9.         gl.glVertex3f( 1.0f, 1.0f, 1.0f);                  // Bottom Right Of The Quad (Top)
  10.        
  11.         gl.glColor3f(1.0f,0.5f,0.0f);                      // Set The Color To Orange
  12.         gl.glVertex3f( 1.0f,-1.0f, 1.0f);                  // Top Right Of The Quad (Bottom)
  13.         gl.glVertex3f(-1.0f,-1.0f, 1.0f);                  // Top Left Of The Quad (Bottom)
  14.         gl.glVertex3f(-1.0f,-1.0f,-1.0f);                  // Bottom Left Of The Quad (Bottom)
  15.         gl.glVertex3f( 1.0f,-1.0f,-1.0f);                  // Bottom Right Of The Quad (Bottom)
  16.        
  17.         gl.glColor3f(1.0f,0.0f,0.0f);                      // Set The Color To Red
  18.         gl.glVertex3f( 1.0f, 1.0f, 1.0f);                  // Top Right Of The Quad (Front)
  19.         gl.glVertex3f(-1.0f, 1.0f, 1.0f);                  // Top Left Of The Quad (Front)
  20.         gl.glVertex3f(-1.0f,-1.0f, 1.0f);                  // Bottom Left Of The Quad (Front)
  21.         gl.glVertex3f( 1.0f,-1.0f, 1.0f);                  // Bottom Right Of The Quad (Front)
  22.  
  23.        
  24.         gl.glColor3f(1.0f,1.0f,0.0f);                      // Set The Color To Yellow
  25.         gl.glVertex3f( 1.0f,-1.0f,-1.0f);                  // Top Right Of The Quad (Back)
  26.         gl.glVertex3f(-1.0f,-1.0f,-1.0f);                  // Top Left Of The Quad (Back)
  27.         gl.glVertex3f(-1.0f, 1.0f,-1.0f);                  // Bottom Left Of The Quad (Back)
  28.         gl.glVertex3f( 1.0f, 1.0f,-1.0f);                  // Bottom Right Of The Quad (Back)
  29.  
  30.  
  31.         gl.glColor3f(0.0f,0.0f,1.0f);                      // Set The Color To Blue
  32.         gl.glVertex3f(-1.0f, 1.0f, 1.0f);                  // Top Right Of The Quad (Left)
  33.         gl.glVertex3f(-1.0f, 1.0f,-1.0f);                  // Top Left Of The Quad (Left)
  34.         gl.glVertex3f(-1.0f,-1.0f,-1.0f);                  // Bottom Left Of The Quad (Left)
  35.         gl.glVertex3f(-1.0f,-1.0f, 1.0f);                  // Bottom Right Of The Quad (Left)
  36.        
  37.        
  38.        
  39.         gl.glColor3f(1.0f,0.0f,1.0f);                      // Set The Color To Violet
  40.         gl.glVertex3f( 1.0f, 1.0f,-1.0f);                  // Top Right Of The Quad (Right)
  41.         gl.glVertex3f( 1.0f, 1.0f, 1.0f);                  // Top Left Of The Quad (Right)
  42.         gl.glVertex3f( 1.0f,-1.0f, 1.0f);                  // Bottom Left Of The Quad (Right)
  43.         gl.glVertex3f( 1.0f,-1.0f,-1.0f);                  // Bottom Right Of The Quad (Right)
  44.  
  45.         gl.glEnd();    
  46.        
  47.     }// end


VG
SOA

// Edit Lossy: Code Tags hinzugefügt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 06, 2008 09:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Die Koordinaten gehören fundamental zu OpenGL. Allerdings wie du damit umgehst liegt in deiner Entscheidung. Du kannst es natürlich so machen, dass du die Quads einzeln zeichnest und entsprechend über glRotate und glTranslate positionierst. Allerdings hat das einen Nachteil. Denn du müsstest glBegin für jedes Quad wieder unterbrechen und vorher noch Veränderungen an der Modelview Matrix durchführen. Und das würde schlicht und ergreifend länger dauern als eben die 6 Flächen in einem Rutsch zu zeichnen. Mit anderen Worten. So wie du es gemacht hast ist es schon ziemlich genau passend.

Allerdings ist es aber eher so, dass komplexere Strukturen benutzt werden. Also Modelle, Landschaften, komplexe Objekte etc. Und dann wird es grundsätzlich immer auf eine (oder mehr) Liste(n) mit Koordinaten hinaus laufen. Dann kommen aber eher solche Techniken wie Vertex Buffer Objects ins Spiel, denn komplexe Strukturen Fläche für Fläche zu zeichnen ist nicht praktikabel. Das aber nur so am Rande.


Das lässt sich zwar nicht ganz pauschalisieren. Aber die Grafikkarte besitzt einen eigenständigen Prozessor. In deinem Programm setzt du Befehle ab die von dem Grafikprozessor abgearbeitet werden. Und da ist es besser, wenn die Schnittpunkte zwischen beiden Prozessoren so klein wie möglich sind. Sprich um so weniger Befehle du absetzt um so glücklicher werden die Prozessoren sein. Denn um so mehr können sie ungestört rechnen. Müssen nicht aufeinander warten und haben einfach immer was zu tun. etc.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 06, 2008 11:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hi,
du kannst ja mal im Wiki schauen. Dort gibt es auch eine Würfel-Funktion, allerdings geht das manchmal, ja nach dem, was man machen will, etwas zu weit. Aber dort sind zumindest auch schon Texturkoordinaten gesetzt.
Man kann auch die Größe und die Textur-Skalierung / Textur-Offset bestimmen.
Ich denke, dass es nicht so schwer sein sollte, das nach Java zu portieren...
Kannst dich ja ein bisschen inspirieren lassen. :)

Lossy hat geschrieben:
Und da ist es besser, wenn die Schnittpunkte zwischen beiden Prozessoren so klein wie möglich sind. Sprich um so weniger Befehle du absetzt um so glücklicher werden die Prozessoren sein.

Schön ausgedrückt! :wink:

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 07, 2008 09:04 
Offline
DGL Member

Registriert: So Mär 02, 2008 18:47
Beiträge: 30
Hallo,

erst einmal vielen Dank für Eure Antworten. Genau was ich gebraucht habe. Bleibe also bei den Zahlen und werfe meine
Ansätze über den Haufen. Ich fange also erst einmal mit dem Tutorial an.

Dazu habe ich noch einmal 2 Fragen:


Ich habe das jetzt schon mehrfach gesehen. Warum wird am Anfang des Codes die Werte für x, y und z durch 2 geteilt ?

dx := 0.5 * dx;
dy := 0.5 * dy;
dz := 0.5 * dz;
---------------------------------

Das kann ich nicht so wirklich nachvollziehen.

Zum Zweiten steht der Vertex Befehl doch für das Festlegen eines Punktes im Raum. Jetzt wird die Verschiebung
immer in die Vertex Befehle mit eingerechnet. Das sah für mich auf den ersten Blick echt gewaltig aus.

Könnte man nicht ein glPopMatrix() und glPushMatrix() nehmen und vor dem zeichnen einfach eine Translation
um den entsprechenden Vektor duchführen ? oder wäre hier wieder die Regel mit den geringstnötigen Befehlen
verletzt ?

glVertex3f(-dx*i + voffset[0], -dy + voffset[1], -dz + voffset[2]);

Ich danke hier schon einmal vorab für den tollen Support.

VG
SOA


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 07, 2008 10:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Um eines noch mal etwas stärker zu betonen. Jeder Entwickler hat seinen eigenen Stil und sei das Problem auch noch so klein wird es sicher 3-4 Lösungen geben. Und vermutlich wird davon keine so richtig falsch sein. Bei OpenGL/3D Programmierung besteht außerdem immer das Problem, dass eine Lösung die Heute perfekt funktioniert in 1-2 Jahren schon veraltet sein kann, weil dann andere Techniken viel gefragter/praxisrelevanter sind. Und wie gesagt jeder hat seinen Stil. Was der Eine irgendwo mag sorgt bei einem Anderen für Schweißausbrüche.

Die "Regel". Bitte nicht missverstehen. Das ist nichts wofür dir die Hände abgehackt werden, falls du dich nicht dran halten solltest. Die OpenGL Aufrufe sind im Vergleich zu D3D sehr harmlos. Man sollte sich aber schon überlegen welche Befehle notwendig sind und welche nicht. Und die nicht Notwendigen sollte man möglichst weglassen. Das trifft aber auf die ganze Programmierung zu und nicht nur OpenGL von daher auch nichts so neues. Eigentlich. Nur bei der 3D Programierung sollte man halt aufpassen, dass beide Prozessoren (CPU und GPU) etwas zu tun haben und nicht der eine dauerhaft auf den anderen warten muss. Bei recht einfachen Projekten ist das aber alles nicht tragisch. Bei komplexen Projekten muss man schon mehr aufpassen. Da kann sich jede Kleinigkeit auch schnell mal zu einem stattlichen Sümmchen anhäufen.

Das Teilen der Werte sorgt dafür, dass der Würfel um den Ursprung herum aufgebaut wird. Also der Mittelpunkt des Objektes befindet sich auf dem Ursprung von OpenGL. Was aber durch die Verschiebung irgendwo etwas ausgehebelt werden kann.

Warum dort eine Verschiebung direkt auf Vertexebene gemacht wird verstehe ich auch nicht ganz (nicht mein Stil). Denn damit würden Rotationen nicht immer funktionieren. Außerdem, wenn man zu 99% sowieso immer nur Nullen an der Stelle übergibt (wegen Rotation etc.) dann hätte man es auch genau so gut weglassen können. Denn auch eine Null muss übergeben und verrechnet werden.

Der Weg über glPushMatrix und glPopMatrix funktioniert genau so. Nur, dass man OpenGL die Rechnerrei überlässt. Denn intern muss sowieso jeder Vertex mit der Matrix verrechnet werden. Übermäßiges benutzen von glPushMatrix und glPopMatrix solltest du nach Möglichkeit vermeiden. Wenn es aber nicht geht dann geht es halt nicht. Bei kleineren Projekten ist das sowieso auch nicht so tragisch.

PS: Ich hoffe das war von mir jetzt nicht alles zu verwirrend. Ich bin mir da gerade nicht ganz so sicher. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 07, 2008 10:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
soa hat geschrieben:
Ich habe das jetzt schon mehrfach gesehen. Warum wird am Anfang des Codes die Werte für x, y und z durch 2 geteilt ?

dx := 0.5 * dx;
dy := 0.5 * dy;
dz := 0.5 * dz;

Das liegt daran, das dx, dy, dz die Außmaße des Würfels festlegen, also die Länge der Seitenkanten.
Da der Würfel aber zentriert gezeichnet werden soll, muss man die Koordinaten des Würfels mit -dx/2 und +dx/2 setzen.
Mit den anderen koordinaten verhält es sich genauso. Vllt sollte man da noch ein Bild einfügen, was die Parameter ein bisschen erklärt... das müsste auch Flash gefallen :lol:

soa hat geschrieben:
Zum Zweiten steht der Vertex Befehl doch für das Festlegen eines Punktes im Raum. Jetzt wird die Verschiebung
immer in die Vertex Befehle mit eingerechnet. Das sah für mich auf den ersten Blick echt gewaltig aus.

Könnte man nicht ein glPopMatrix() und glPushMatrix() nehmen und vor dem zeichnen einfach eine Translation
um den entsprechenden Vektor duchführen ? oder wäre hier wieder die Regel mit den geringstnötigen Befehlen
verletzt ?

Klar kann man die Translation auch mit gltranslatef machen. Ist manchmal sogar notwendig.
Es ist aber auch praktisch, wenn man z.B ein Offset von (10, 0, 0) angibt, und dann mittels glrotate den Würfel rotiert, dann dreht er sich mit Abstand |10| um den 0-Punkt (oder besser: um sein lokales Koordinatensystem).
Das ganze hat was damit zu tun, dass es einen Unterschied macht, ob man erst rotiert und dann translatet, oder erst translatet und dann rotiert.
Das Offset bewirkt quasi, dass man automatisch schon ums Offset translatet hat.
Du kannst aber auch das Offset auf null setzen, wenn du es nicht benötigst...
Wenn du aber mit dem Würfel z.B. folgendes anstellen willst:
Code:
  1. glrotatef(x, 1, 0, 0);
  2. gltranslatef(a, b, c);
  3. Würfel mit Offset 0;

Dann ist es dasselbe, wie wenn du (a, b, c) in das Offset packst und das gltranslatef weglässt.
Somit sparst du dir in dieser Situation das translaten.
In anderer Reihenfolge wird es aber einen Unterschied machen!
Einfach mal damit spielen.
Übrigens hat es mir am Anfang geholfen, dass ich mal ein Sonnensystem gebastelt hab.
Da lernt man viel über Translation und Rotation und deren Reihenfolge.

Ich hoffe ich konnte etwas Klarheit rein bringen ;)

EDIT:
@Lossy: Ich bin einfach zu langsam mit dem Tippen...
Naja, doppelt erklärt hält besser. :)

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 09, 2008 21:28 
Offline
DGL Member

Registriert: So Mär 02, 2008 18:47
Beiträge: 30
Hallo,

vielen Dank erst einmal. Super Antworten muss ich sagen.
Habe jetzt auch estgestellt, dass man mit GLUT Würfel zeichnen kann .

http://wiki.delphigl.com/index.php/GLUT


Mit den Vertex Objects werde ich mich auch noch beschäftigen. Mal sehen wie
das läuft.


Schönen Sonntag Abend und einen guten Wochenstart.

VG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 10, 2008 09:10 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
GLUT wird bei uns eigentlich schon seit immer gemieden. So richtig Sinn hatte dieses Framework nie gemacht, oder erzähl ich jetzt Mist?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 10, 2008 09:34 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Nein. Die GLUT-Funktionen sind alle a-langsam. Ausserdem kann man mit denen nur einfarbiges Zeug zeichnen und mit Texturierung ist so ziemlich Essig mit eigene Koordinaten angeben und so.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 10, 2008 12:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
GLUT sollte man meiden, wenn man kann. Klar ist es als Einsteiger leichter mit GLUT seine Primitiven zu zeichnen, als mit einer selbst erstellten Methode... aber wesentlich umständlicher und wie Sidorion schon gesagt hat, sind Textur-Koordinaten nicht gerade das Gelbe vom Ei.
Also würde ich empfehlen, eine eigene Methode zu verwenden... so schwer sind die ja auch nicht zu realisieren, und dann weiß man wenigstens, was man hat ;)

_________________
http://texelviews.delphigl.com


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: Google [Bot] und 12 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 17 Queries | GZIP : On ]