OpenGL.org 3Dsource.de: Infos rund um 3D-Computergrafik, OpenGL und VRML
space Telefon-Tarife space VDI - Arbeitskreis Fahrzeugtechnik space Beschallungsanlagen und Elektroakustik space Heise-News space

24 Verschiedenes

24.010 Wie kann ich ein Drahtgittermodell zeichnen, allerdings ohne die verdeckten Linien ?

Die bevorzugte Methode ist, die gewünschte Geometrie in zwei Durchgängen zu zeichnen: Zuerst im Fill Mode mit der Farbe des Hintergrunds und dann danach mit einer geeigneten Farbe im Drahtgitter Modus. Damit keine Durchdringungen der noch sichtbaren Linien auftreten, sollte man Polygon Offset nutzen.

Oftmals ist der Hintergrund aber nicht einfarbig. Dann kann man den ersten Schritt mit glColorMask() auf GL_FALSE gesetzt durchführen. Die Linien werden wieder im normalen Modus und mit Polygon Offset gezeichnet.

24.020 Wie kann ich rubber-band Linien zeichnen ?

Bitte mal beim Rasterisieren reinschauen.

24.030 Zum Programmstart rufe ich glGetString() auf. Warum wird kein String zurückgegeben ?

Meistens wurde noch kein OpenGL Context erzeugt bzw. aktiviert. Jeder Aufruf einer OpenGL Funktion setzt einen für ein Fenster aktivierten OpenGL Rendering Context voraus, ansonsten werden unsinnige Werte zurückgegeben bzw. das Programm stürzt ab.

24.039 Wo kann ich fertige 3D-Modelle als Dateien bekommen ?

Da diese Frage nur wenig mit OpenGL zu tun hat, ist die folgende Liste mit Sicherheit unvollständig:

Prinzipiell kann man ein 3D-Modell mit jedem Modeller erzeugen und dann in sein OpenGL Programm einlesen. ModelMagic3D z.B. ist Shareware und bietet auch den Quelltext. Auch GLScene könnte helfen.

24.040 Wie kann ich 3D-Modellbeschreibungen (3ds, obj, dem) direkt in meinem OpenGL Programm nutzen ?

Da OpenGL hierfür keine Funktionen bietet, muss man den entsprechenden Code dem Programm selbst hinzufügen.

Da sich schon einige Programmierer mit diesem Thema beschäftigt haben, findet man im Netz auch schon entsprechende Hilfen:

  • Datei-Formatsbeschreibungen
  • Okino's PolyTrans kann die meisten 3D-Formate in OpenGL Code umwandeln.
  • Crossroads wandelt verschiedene Formate in C/C++ Code um, der sich in Vertex Arrays nutzen lässt.
  • 3DWinOGL ist Shareware, die 3D-Formate in OpenGL Primitive umwandeln kann.
  • 3D Studio MAX kann Dateien auch als ASE, also im ASCII Format speichern. Diese lässt sich relativ leicht in eigene Programme einlesen.
  • Das XGL Dateiformat wurde mit dem Ziel entworfen, alle notwendigen Informationen für eine 3D Darstellung mit OpenGL zu speichern. Open Source Parser und 3DS Konverter sind verfügbar.
  • Der GLUT Source Code enthält im Verzeichnis progs/demos/smooth die Datei glm.c, mit der sich Wavefront OBJ Dateien einlesen lassen.
  • glElite liest DXF, ASCII und LightWave Dateien. Informationen hierzu findet man auf http://www.helsinki.fi/~tksuoran/lw.html und http://www.cs.helsinki.fi/~tksuoran/glelite/.
  • 3D Exploration kann verschiedene Dateiformate ein- und auslesen sowie C/C++ Quelltext erzeugen.
  • Eine 3DS Import Bibliothek findet man hier.

24.050 Wie kann ich meine Szenenansicht als Bilddatei (gif, tif, jpg, bmp) speichern ? Wie kann ich diese Bildformate lesen und als Texturen verwenden ?

Um ein bestimmtes Frame eines OpenGL Programms abzuspeichern, kann man ein einfaches Screen Capture Programm nutzen und dieses Image als Datei speichern.

Mittels glReadPixels() ist es aber auch möglich, dieses Vorhaben direkt durch sein Programm zu realisieren, indem man die so gelesenen Daten mit ensprechenden Routinen als Bild speichert.

Vergleichbar dazu muss für das Nutzen einer Bilddatei als Textur ebenfalls eine eigene Routine zum einlesen der Daten eingebunden werden. Mit glTexImage2D() lässt sich dann die Textur auf ein Objekt festbinden.

Da OpenGL keinen Zugriff auf Bilddateien bietet, muss hierfür eine eigene Funktion programmiert oder entsprechende Bibliotheken eingebunden werden. Weitere Informationen bieten folgene Links:

  • Wotsit.org beschreibt verschiedene Dateiformate.
  • Die Independent JPEG Group stellt eine freie Bibliothek zur Nutzung von JPG Dateien zur Verfügung.
  • Mit der C++ mkOpenGLJPEGImage Klasse lassen sich JPG und BMP Dateien verarbeiten.
  • Mit diesem Quelltext lassen sich TGA Dateien einlesen.
  • Die GD Bibliothek liest JPG und PNG Dateien ein.
  • Imlib (in dem Download-Bereich suchen) versteht Formate vom Typ JPG, GIF, PNG und TIF .
  • FürDelphi kann diese Bibliothek genutzt werden.

24.060 Kann ich einen BSP-Baum mit OpenGL nutzen ?

BSP Bäume sind in OpenGL Programmen oftmals sinnvoll einsetzbar.

Um die Darstellung verdeckter Flächen unter OpenGL zu vermeiden, wird meist der Tiefentest eingesetzt. Abhängig von der Struktur des Programms und der genutzten Daten kann es aber auch möglich sein, mittels eines BSP Baumes den Tiefentest zu vermeiden bzw. dessen Umfang/Aufwand zu reduzieren.

Ausserdem bieten BSP Bäume die Möglichkeit, vollständig verdeckte Objekte von vorneherein aus der Berechnung auszuklammern.

BSP Bäume sind in der Lage, die korrekte Darstellung halbdurchlässiger Objekte durch eine entsprechende Vorsortierung (rendern von hinten nach vorn) zu unterstützen.

Weitere Informationen zu BSP bietet die BSP FAQ.

24.070 Kann ich einen Octree mit OpenGL nutzen ?

Ja, OpenGL stellt dem kein Hindernis entgegen. Ein Octree ist insbesondere dann sinnvoll einsetzbar, wenn man diese Technik in Verbindung mit Occlusion Culling einsetzt (z.B. HP's GL_HP_occlusion_test).

24.080 Kann ich Radiosity mit OpenGL realisieren ?

OpenGL bietet zwar keine direkten Unterstützung für Radiosity, kann allerdings zur Darstellung von vorab berechneten Daten genutzt werden.

Das Programm muss also seine eigenen Radiosity Berechnungen für die darzustellenden Daten durchführen. Sobald die entsprechenden Farbwerte der Vertices berechnet sind, lassen sich die Primitive mit normalen OpenGL Befehlen darstellen. Damit jedes Vertex auch einen eigenen Farbwert erhält, muss glShadeModel() auf GL_SMOOTH gesetzt und die Beleuchtung deaktiviert werden.

24.090 Kann ich Raytracing mit OpenGL realisieren ?

OpenGL bietet keine direkte Unterstützung für das Raytracing.

Oft möchte man Raytracing nutzen, um möglichst reale Schatten und Refelktionen zu erhalten. Viele dieser Efefekte lassen sich allerdings auch mit OpenGL erzielen, ohne dass man auf das aufwendige Raytracing zurückgreifen muss. Die Bereiche zum ThemaSchatten und Texturen können hier weiterhelfen.

OpenGL lässt sich z.B. als Teil des Schnittpunkt-Test vom Raytracing nutzen. Eine Möglichkeit wäre, alle Primitive der Szene mit der gleichen Farbe zu zeichnen, dann einen berechneten (Licht-)Strahl und durch das Zurücklesen der Farben Schnittpunkte (durch veränderte Farbwerte) festzustellen. Allerdings wird das Aliasing teilweise das Ergebnis verfäschen. Hier bietet es sich an, Bounding Volumes (z.B. den umschliessenden Kreis eines Objekts) zu nutzen.

Durch verändern des Augpunkts und der Blickrichtung lassen sich auch verschiedene Strahlen-Schnittpunkte testen.

Ein Raytracing Programm kann OpenGL auch zur Darstellung der berechneten Szene nutzen. Hierfür müssen aber alle Farbwerte der einzelnen Pixel berechnet werden, die sich dann als einzelne GL_POINTS bzw. als Datenfeld mit glDrawPixels() zeichnen lassen.

24.100 Wie kann ich CSG (computational solid geometry) mit OpenGL realisieren ?

Das Red Book beschreibt einige Techniken, um das Ergebnis von CSG-Berechnungen darzustellen.

GLUT 3.7 enthält auch ein Programm (csg.c), das als Beispiel dienen kann.

24.110 Wie kann ich Kollisionen zwischen meinen Objekten berechnen ?

Auch hier bietet OpenGL keine direkte Unterstützung, das Programm muss die Berechnungen also selbst durchführen.

Potientielle Kollisionen lassen sich allerdings im Vorfeld ermitteln, z.B. mit einer vergleichbaren Technik zur Raytracing Frage. Im Prinzip läuft das dann so ab: Die Szene wird vom Augpunkt her gezeichnet und man sieht in Richtung der nächsten Bewegung. Es wird die orthografische Projektion und ein field-of-view entsprechend einem das Objekt umfassenden Rechteck (bounding rectangle) gewählt. Jetzt sind alle sichtbaren Objekte potentielle Kollisionspartner. Mit dem Abfragen der zugehörigen Z-Werte (Entfernung) erfolgt dann die Enstcheidung.

Es gibt auch eine freie Bibliothek zur Kollisionsermittlung namens I_COLLIDE.

24.120 Ich weiss, dass OpenGL die Funktionsaufrufe intern zwischenspeichern kann. Kann ich eine Abbruchfunktion aufrufen, so dass dieser Zwischenspeicher geleert, aber nicht ausgeführt wird ?

Nein. Sobald OpenGL-Funktionen aufgerufen wurden, gelten sie als ausgeführt und sind nicht mehr abzubrechen.

24.130 Was ist der Unterschied zwischen glFlush() und glFinish() und wann sollte ich welche Funktion nutzen ?

Die OpenGL Spec erlaubt einer Implementation, Befehle und Daten bis zur Ausführung zwischenzuspeichern. glFlush() veranlasst, dass der Zwischenspeicher geleert und alle enthaltenen Informationen abgearbeitet werden. Diese Funktion arbeitet unabhängig von der Zeitdauer der Ausführung der einzelnen Befehle und kann damit auch schon zurückkehren, wenn die ausgelösten Befehle noch nicht abgearbeitet sind. glFinish() kehrt erst dann zur aufrufenden Stelle zurück, wenn alle Befehle vollständig abgearbeitet sind.

Normalerweise wird glFlush() verwendet, wenn man in einer reinen OpenGL-Anwendung arbeitet und sicherstellen will, dass alle Kommandos beim Tausch vom Back- zum Frontbuffer abgearbeitet sind.

glFinish() ist hilfreich, wenn in der Anwendung zusätzlich zu OpenGL-Aufrufen auch normale Funktionen der grafischen Oberfläche des Betriebssystems benötigt werden. In solchen Programmen sollten zuerst alle OpenGL-Funktionen aufgerufen, dann mit glFinish() abgearbeitet und zum Schluss die Zeichen-Funktionen der Oberfläche ausgeführt werden.

24.140 Wie kann ich mit OpenGL drucken ?

OpenGL bietet derzeit keine Druckfunktionen. Das OpenGL ARB hat zwar über ein GLS-Protokoll diskutiert, das eine einheitliche Schnittstelle zum Drucker bietet, zurzeit muss man aber noch auf systemspezifische Funktionen zurückgreifen.

Auf Microsoft-Systemen kann man z.B. mit ALT+Druck den Inhalt des aktuellen Fensters in die Zwischenablage kopieren, dann in einem Bildbearbeitungsprogramm als Bild einfügen und entsprechend weiterverarbeiten bzw. drucken. Den gesamten Desktop kopiert man über die Druck-Taste.

Das Anfertigen eines Bildschirmfotos bzw. einer Kopie des Programmfensters kann man aber auch über bestimmte Zusatzprogramme anfertigen. Unter Linux/Unix gibt es dafür z.B. xv.

Drucken geht grundsätzlich über jede geeignete Methode des Betriebssystems. Wieder am Beispiel von Microsoft: mittels glReadPixels() den Inhalt des OpenGL-Frames auslesen, als DIB (device independent bitmap) speichern und in einem anderen Programm zum Drucken öffnen. Zum Aufbau des DIB-Formats am besten in die Hilfe der genutzten IDE schauen.

Dieses Tutorial enthält ein Beispiel zum Drucken von OpenGL-Frames unter Microsoft-Systemen.

Dieser Artikel enthält eine Beschreibung zum Speichern von vektorbasierten Bildformaten wie PDF oder WMF.

24.150 Kann ich die OpenGL Funktionsaufrufe eines Programms feststellen und protokollieren ?

IBM hat ein Programm namens ZAPdb entwickelt, das genau diese Funktionen erfüllt. Es ist auf verschiedenen Unix-Implementationen verfügbar. Früher gab es auch eine Version für MS Windows NT, über die es aktuell aber keine Informationen mehr gibt. Eine Kopie kann man eventuell hier herunterladen.

3dpipeline.com bietet ein Produkt namens GLAlanyze Pro, dass neben anderen Funktionen auch OpenGL-Aufrufe protokollieren kann.

Es gibt das freie Programm GLTrace2 mit einem vergleichbaren Funktionsumfang zu ZAPdb und GLAnalyze Pro.

Theoretisch kann man auch eine eigene Bibliothek entwickeln, die alle OpenGL-Funktionen kapselt. Nennt man die eigentliche OpenGL-Bibliothek um und speichert dagegen seine Bibliothek als (z.B. unter MS) opengl32.dll, kann man in den gekapselten Aufruf auch entsprechende Protokoll-Funktionen einbauen. Die eigentliche Programmier-Aufgabe ist dabei gar nicht so schwierig, allerdings wird sich die Geschwindigkeit des OpenGL-Programms wahrscheinlich deutlich verringern.

24.160 Kann ich Rot-Blau Szenen für eine Stereoansicht rendern ?

DerViewing-Bereich enthält Informationen zu diesem Thema. Die Grundidee unter OpenGL ist die folgende:

  1. glColorMask (GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE)
  2. Annahme: Die rote Ansicht ist für das linke Auge, setze die Projektions- und Modelview-Ansicht entsprechend.
  3. Color- und Tiefenbuffer löschen und die linke Ansicht zeichnen.
  4. glColorMask (GL_FALSE, GL_FALSE, GL_TRUE, GL_FALSE)
  5. Setze die Projektions- und Modelview-Ansicht für die rechte Ansicht.
  6. Color- und Tiefenbuffer löschen und die rechte Ansicht zeichnen.
  7. Swap buffers.

GLUT 3.7 enthält ein Beispiel für diese Technik.

Seite durchsuchen nach:

Fragen oder Ideen an:
Thomas.Kern@3Dsource.de
Linux-Counter
(C) Thomas Kern