Viele Kommandos
OpenGL und die Begleitbibliotheken umfassen über 300 Kommandos für alle Aufgaben beim Darstellen dreidimensionaler Modelle, die immer aus einzelnen Punkten, Linien, Dreiecken und Vierecken bestehen. Es gibt zwar Routinen für Kugeln oder Quader, aber auch die erstellen nur die Oberfläche. Wer wie in einem CAD-System konstruieren möchte, ist mit fertigen CAD-Systemen oder mit der CAD-Bibliothek Open Cascade [10] wesentlich besser bedient.
Das so genannte Bluebook [8] beschreibt das API von OpenGL, für die meisten Fragen genügt die Onlineversion einer älteren Auflage. Mit Tcl3D stehen die Befehle bis auf wenige Ausnahmen mit gleichen Namen unter Tcl bereit. Die verwendete Abbildung von C auf Tcl ist weitgehend selbsterklärend, eine genaue Beschreibung enthält die Dokumentation. Der Vorteil: Beispiele aus C-Programmen lassen sich ohne großes Nachdenken in Tcl verwenden.
Vorlagen sind am Anfang auch bitter nötig, damit nicht nur ein schwarzes Fenster erscheint. Mit den drei Dimensionen potenzieren sich die Fehlermöglichkeiten: Wer etwa die Beleuchtung vergisst oder die virtuelle Kamera in die falsche Richtung dreht, sieht nichts.
Bühne frei
Der Code in Listing 1 erzeugt das Hello-World-Beispiel von OpenGL, wie in Abbildung 1 zu sehen, ein Drei- und ein Viereck. Zeile 8 fordert die Tcl-Erweiterung an. Falls Tcl3D nicht im üblichen Suchpfad installiert ist, zeigt Zeile 6, wie man den Pfad ergänzt. Das 3D-Widget entsteht dann in Zeile 71 mit dem »togl«-Befehl. Die Optionen »-width« und »-height« sind von anderen Tk-Widgets bekannt, danach kommen die OpenGL-spezifischen.
01 #!/usr/bin/wish
02 # Einfaches Beispiel für Tcl3d. Basis:
03 # OpenGL-Tutorial von http://nehe.gamedev.net
04
05 # Suchpfad erweitern wenn notwendig:
06 #lappend auto_path /home/cz/tcl3d0.3
07
08 package require tcl3d 0.2
09
10 # Setzt ein paar Startwerte, wird beim Erzeugen des Fensters aufgerufen
11 proc tclCreateFunc {toglwin} {
12 glShadeModel GL_SMOOTH ;# weiche Farbübergänge aktivieren
13 glClearColor 0.1 0.7 1 0.5 ;# die Hintergrundfarbe festlegen
14 }
15
16 # 3D-Modell aufbauen und anzeigen
17 proc tclDisplayFunc {toglwin} {
18 # Farben- und Tiefenspeicher löschen
19 glClear [expr {$::GL_COLOR_BUFFER_BIT | $::GL_DEPTH_BUFFER_BIT}]
20
21 # Anfangsposition setzen
22 glLoadIdentity
23 glTranslatef -1.5 0.0 -10.0
24
25 # Ein rotes Dreieck zeichnen
26 glColor3f 1 1 0
27 glBegin GL_TRIANGLES
28 glVertex3f 0.0 1.0 0.0
29 glVertex3f -1.0 -1.0 0.0
30 glVertex3f 1.0 -1.0 0.0
31 glEnd
32
33 # Viereck mit verschieden farbigen Ecken
34 glTranslatef 3.0 0.0 0.0 ;# Neuer Start
35 glBegin GL_QUADS
36 glColor3f 1.0 0.0 0.0 ;# Erste Ecke rot
37 glVertex3f -1.0 1.0 0.0
38 glColor3f 0.0 1.0 0.0 ;# Zweite grün
39 glVertex3f 1.0 1.0 0.0
40 glColor3f 0.0 0.0 1.0 ;# Dritte blau
41 glVertex3f 1.0 -1.0 0.0
42 glColor3f 1.0 1.0 1.0 ;# Vierte weiß
43 glVertex3f -1.0 -1.0 0.0
44 glEnd
45
46 # Neues Modell anzeigen
47 $toglwin swapbuffers
48 }
49
50 # Passende Ansicht auf das Modell berechnen,
51 # immer wenn sich die Fenstergröße ändert
52 proc tclReshapeFunc {toglwin b h} {
53 # verhindert Teilen durch Null
54 set h [expr {$h<1 ? 1 : $h}]
55
56 # Viewport setzen
57 glViewport 0 0 $b $h
58 glMatrixMode GL_PROJECTION
59 glLoadIdentity
60
61 # Perspektive berechnen und aktivieren
62 set winkel 46
63 set verhaeltnis [expr {double($b)/double($h)}]
64 set von 0.1
65 set bis 100.0
66 gluPerspective $winkel $verhaeltnis $von $bis
67 glMatrixMode GL_MODELVIEW
68 }
69
70 # Fenster aufbauen
71 togl .toglwin -width 640 -height 480
72 -double true -createproc tclCreateFunc
73 -reshapeproc tclReshapeFunc
74 -displayproc tclDisplayFunc
75 pack .toglwin -expand 1 -fill both
|

|
Abbildung 1: Der Skriptcode in Listing 1 erzeugt ein einfaches 3D-Modell, es besteht aus einem einfarbigen Dreieck und einem mehrfarbigen Viereck. Bei diesem simplen Modell ist die dritte Dimension noch nicht erkennbar, außerdem fehlt Bewegung - dafür ist der Programmaufbau recht gut nachvollziehbar.
|
Die »-double«-Option sorgt für Double Buffering. Damit zeichnet OpenGL ein neues Bild erst im Hintergrund und tauscht die fertige Grafik dann gegen die bisher dargestellte aus. Das vermeidet Flackern beim Bildaufbau. Zuletzt übergeben die Parameter »-createprop«, »-reshapeproc« und »-displayproc« drei Tcl-Prozeduren an das Widget. Dies wiederum ruft die Createproc einmal beim Initialisieren auf, die Reshapeproc bei jeder Größenänderung und die Displayproc bei jedem Bildaufbau.
Die erste Prozedur heißt »tclCreateFunc« (Zeilen 11 bis 14). Sie initialisiert OpenGL; das ist pro Programmlauf nur einmal nötig. Eine der Entwurfsideen ist, dass Einstellungen immer so lange wie möglich gelten. Ist die Farbe für Geometrie einmal auf Rot gesetzt, färbt OpenGL jedes nachfolgende Objekt rot, egal ob das Programm zehn oder 10 000 Objekte einfügt. Die in Zeile 13 mit »glClearColor« gesetzte Hintergrundfarbe gilt auch für jeden Bildaufbau.
Als Nächstes definiert das Skript von Zeile 17 bis Zeile 48 die Prozedur »tclDisplayFunc«. Tcl3D ruft dieses Callback bei jedem Bildaufbau auf. Nachdem »glClear« in Zeile 19 den bisherige Bildinhalt gelöscht hat, entstehen hier das Drei- und das Viereck. Zudem löscht »glLoadIdentity« den bisherigen Startpunkt sowie die Rotation, »glTranslatef« setzt einen neuen Startpunkt. Das Koordinatensystem entspricht dem in Abbildung 2, die x- und y-Achse bilden die Bildschirmebene, die z-Achse zeigt aus dem Bildschirm heraus.

|
Abbildung 2: Alles Ansichtssache: Ohne den korrekten Viewport sieht der Betrachter in OpenGL nichts. Der Viewport bildet eine Kamera im virtuellen Raum nach, zeigt aber nur Objekte zwischen den beiden Ebenen.
|
Zeile 26 setzt mit »glColor3f« die Objektfarbe auf Rot, die Farbwerte stammen aus dem RGB-Modell mit Werten zwischen 0 und 1 (additive Farbmischung aus Rot, Grün und Blau). Danach definiert der Block in den Zeilen 27 bis 31 mit »glBegin GL_TRIANGLES« das erste Dreieck mit den drei Eckpunkten (Vertex) bis hin zum »glEnd«. Zwischen »glBegin« und »glEnd« darf das Skript auch mehrere Dreiecke angegeben.
Die meisten Oberflächen lassen sich mit Dreiecken wunderbar darstellen, aber OpenGL kennt noch weitere Grafik-Primitive wie Punkte, Linien oder Vierecke. Als Beispiel dient das Viereck in den Zeilen 34 bis 44. Nach dem per »glTranslatef« definierten Startpunkt gibt es wieder eine mit »glBegin« und »glEnd« eingefasste Punkteliste. Bei Vierecken ist darauf zu achten, dass alle vier Punkte in einer Ebene liegen. Andernfalls stellt OpenGL sie nicht korrekt dar und es gibt Löcher in der Geometrie.
| Whitepaper |
|
Open Source Datenintegration in der Praxis: Fallstudien und Anwendungsbeispiele (Folge 2)
Der zweite Teil des Open Source Datenintegration in der Praxis: Fallstudien und Anwendungsbeispiele White Papers beleuchtet anhand weiterer ausgewählter Case Studies die Implementierung von Open Source Datenintegration in der Praxis und benennt die daraus resultierenden Vorteile.
Download PDF (Registrierung erforderlich)
|
|
Usage Landscape Enterprise Open Source Data Integration
Die Nachfrage nach Datenintegrationslösungen für Unternehmen ist zunehmend gestiegen und vor allem das Interesse an Open Source Technologien wird immer größer. Doch wie und von wem werden Open Source Datenintegrationslösungen genutzt und welches Nutzungsverhalten lässt sich daraus ableiten? Das vorliegende White Paper präsentiert die Erfahrungswerte von über 1000 Open Source Nutzern und liefert fundierte Antworten auf diese Fragen.
Download PDF (Registrierung erforderlich)
|
Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links"
nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedrucken Fassung entsprechen.
|