Licht aus, Spot an
Bisher kam die Standardbeleuchtung zum Einsatz, mit der kalten Stimmung von Neonlicht. Wie alles in OpenGL lässt sich die Beleuchtung aber bis in die letzte Kleinigkeit definieren. Umgebungs- oder Spotlichter mit ihren Farben und Positionen sowie das Material einer Oberfläche bestimmen letztlich die Farbe eines Objekts. Beim Material ist sowohl die normale Körperfarbe definierbar als auch die Farbe der Reflexe.
Ein Beispiel ist in Abbildung 3 zu sehen, Ausschnitte aus dem Quelltext finden sich in Listing 2. Der Anwender wählt hier die Farbe der Kugel, der Beleuchtung und der Reflexe. Das Skript hat den gewohnten Aufbau mit den Prozeduren »tclCreateFunc« (Zeile 13), »tclReshapeFunc« (gekürzt) und »tclDisplayFunc« (Zeile 37). Die »tclCreateFunc« schaltet in Zeile 22 mit »glEnable« zuerst die benutzerdefinierte Beleuchtung ein und positioniert danach das erste Licht »GL_LIGHT0« (Zeilen 23 bis 25). Dann schaltet »glEnable« auch noch das Material ein (Zeilen 28 bis 29).

|
Abbildung 3: OpenGL-Programme können die Farbe der Beleuchtung und des Materials bis ins feinste Detail definieren. Ein kleines Skript gibt dem Benutzer Zugriff auf die wichtigsten Parameter.
|
01 #!/usr/bin/wish
02 package require tcl3d
03
04 # Startfarben
05 set ambient #00d0d0
06 set specular #ffff00
07 set material #eeeeee
08 set emission #000000
09 set shinines 25.0
10
11 # Position des Lichts setzen
12 # Ein Mal bei der Initialisierung aufgerufen
13 proc tclCreateFunc {toglwin} {
14 # Hintergrundfarbe
15 glClearColor 0.0 0.0 0.0 0.0
16
17 #glPolygonMode GL_FRONT_AND_BACK GL_LINE
18 glShadeModel GL_SMOOTH
19 glEnable GL_DEPTH_TEST
20
21 # Eigenes Licht definieren
22 glEnable GL_LIGHTING
23 glEnable GL_LIGHT0
24 set light_position {1.0 1.0 1.0 0.0}
25 glLightfv GL_LIGHT0 GL_POSITION $light_position
26
27 # Materialspezifisches Licht anschalten
28 glColorMaterial GL_FRONT GL_DIFFUSE
29 glEnable GL_COLOR_MATERIAL
30
31 # Farben initialisieren
32 farbe
33 }
34
35 # Neue Kugel zeichnen.
36 # Wird für jedes Anzeigen aufgerufen.
37 proc tclDisplayFunc {toglwin} {
38 # Bisherige Geometrie löschen
39 glClear [expr {$::GL_COLOR_BUFFER_BIT | $::GL_DEPTH_BUFFER_BIT}]
40 # Kugel erzeugen
41 glutSolidSphere 1.0 32 32
42 glFlush
43 }
44
45 # Materialfarbe setzen
46 # Bei jeder Änderung der Farben aufgerufen,
47 proc farbe {args} {
48 # Lichtfarbe
49 glLightfv GL_LIGHT0 GL_AMBIENT [farbe2liste $::ambient]
50
51 # Materialfarbe für Reflexe
52 glMaterialf GL_FRONT GL_SHININESS $::shinines
53 glMaterialfv GL_FRONT GL_SPECULAR [farbe2liste $::specular]
54
55 # Farbe als Lichtquelle
56 glMaterialfv GL_FRONT GL_EMISSION [farbe2liste $::emission]
57
58 # Oberflächenfarbe
59 glColor4fv [farbe2liste $::material]
60
61 .fr.toglwin postredisplay
62 }
63
64 # Wandel HEX-Farbe in RGB-Liste
65 proc farbe2liste {farbe} {
66 set retval {}
67 set liste [winfo rgb . $farbe]
68 foreach c $liste {
69 lappend retval [expr {$c / 65535.0}]
70 }
71 return $retval
72 }
|
Die Definition von Licht und Farbe geschieht in der Prozedur »farbe« (Zeile 47). Initial ruft über »tclCreateFunc« die Farbfunktion auf, künftig benutzt das GUI diese Funktion bei jeder Änderung der Farben. Die Prozedur »farbe« setzt die Farbe der Lichtquelle »GL_LIGHT0« durch das Kommando »glLightfv« (Zeile 49). Die Hilfsfunktion »farbe2liste« (ab Zeile 65) verwandelt die Farbe aus der Hex-Darstellung »#fe0000« in die RGB-Liste »1.0, 0.0, 0.0«.
Neben der Beleuchtung spielt auch die Farbe des Körpers eine Rolle, dafür sind Funktionen aus der »glMaterial«-Familie zuständig. Für die Beispielkugel stellen »GL_SHININESS« und »GL_SPECULAR« die Farbe und Intensität der Spitzenlichter ein (Zeilen 52 bis 53). Die Spitzenlichter sind jener Teil des Lichts, den der Körper direkt von einer Lichtquelle zum Betrachter reflektiert. Größe und Helligkeit hängen vor allem von der Oberfläche ab, eine polierte Billardkugel hat kleinere und hellere Spitzenlichter als eine raue Holzkugel.
Die meisten Körper strahlen nicht selbst, aber auch Glühbirnen und Neonröhren lassen sich mit OpenGL darstellen. Hierfür dient die Farbe »GL_EMISSION« (Zeile 65), sie gibt das vom Körper abgestrahlte Licht an. Zuletzt definiert »glColor4fv« (Zeile 59) eine Farbe, die wie die »glMaterial«-Kommandos für die nächste definierte Geometrie gilt.
Damit dieses Beispiel nicht zu kompliziert gerät, erzeugt »tclDisplayFunc« bei jedem Aufruf eine neue Kugel. Hierzu nutzt sie eine Funktion aus der Glut-Bibliothek (GL Utilities): »glutSolidSphere« (Zeile 41) erzeugt eine Kugel aus Dreiecken mit dem gewünschten Radius und der gewünschten Auflösung. Da dies immer auf die »farbe«-Prozedur folgt, gelten das dort definierte Material und die dort festgelegte Oberflächenfarbe. Der restliche Fensteraufbau ist normales Tk mit Buttons zum Ändern der Farbe.
Fremde Federn
Mit den bisher vorgestellten Methoden erzeugt ein Skript eigene Geometrien, bewegt und beleuchtet sie und umwickelt sie mit Texturen. Allerdings kann es ganz schön aufwändig sein, ein ganzes Auto, Haus oder Flugzeug mit puren OpenGL-Befehlen zu programmieren. Mit Werkzeugen wie Ayam [6] oder Blender [7] klappt das erheblich einfacher. Sie bieten ein CAD-System speziell für Oberflächenmodelle und unterstützen selbst das Anpassen und Zuschneiden der Texturen.

|
Abbildung 4: Dieses Doppeldecker-Modell stammt aus einer CAD-Software. Ein Tcl3D-Skript importiert die Objektdatei und verwendet sie in OpenGL.
|
01 # Startwerte setzen und Displayliste erzeugen.
02 # Wird beim Erzeugen des Fensters aufgerufen.
03 proc tclCreateFunc {toglwin} {
04 # Schwarzer Hintergrund
05 glClearColor 0.1 0.7 1 0.5
06
07 # Etwas Tuning
08 glClearDepth 1.0
09 glEnable GL_DEPTH_TEST
10 glShadeModel GL_SMOOTH
11 glDepthFunc GL_LEQUAL
12 glHint GL_PERSPECTIVE_CORRECTION_HINT GL_NICEST
13
14 glEnable GL_DEPTH_TEST
15 glEnable GL_LIGHTING
16 glEnable GL_LIGHT0
17
18 # Datei lesen
19 set filename "untitled.obj"
20 set ::objId [glmReadOBJ $fileName]
21 glmFacetNormals $::objId
22 glmVertexNormals $::objId 90.0
23 }
24
25 # 3D-Modell anzeigen
26 proc tclDisplayFunc { toglwin } {
27 # Screen and Depth Buffer Löschen
28 glClear [expr $::GL_COLOR_BUFFER_BIT | $::GL_DEPTH_BUFFER_BIT]
29
30 # Anfangsposition setzen
31 glLoadIdentity
32 glTranslatef $::Posx $::Posy $::Posz
33 glRotatef $::Rotx 1.0 0.0 0.0
34 glRotatef $::Roty 0.0 1.0 0.0
35 glRotatef $::Rotz 0.0 0.0 1.0
36
37 glmDraw $::objId [expr $::GLM_SMOOTH | $::GLM_MATERIAL]
38 $toglwin swapbuffers
39 }
|
Dank Nate Robins GLM-Bibliothek können OpenGL-Skripte fertige Modelle importieren, wenn sie in einer Datei im Object-Wavefront-Format vorliegen (».obj«). Diese Bibliothek ist Teil des Tcl3D-Pakets, steht aber auch für andere Programmiersprachen zur Verfügung. Die legendäre Kitty Hawk der Gebrüder Wright dient als Beispiel in Abbildung 4. Das VRML-Modell aus [8] lässt sich mit Blender [7] in eine ».obj«-Datei verwandeln (steht in [3] zum Download). Listing 3 liest diese Datei und bringt das Modell auf den Schirm.
Beim Initialisieren lädt »tclCreateFunc« (ab Zeile 3) das Modell mit Hilfe der Funktion »glmReadObj« (Zeile 20). Die für OpenGL notwendigen Normalenvektoren berechnen »glmFacetNormals« und »glmVertexNormals« (Zeilen 21 bis 22). Das Modell ist damit zur Anzeige bereit, die »tclDisplayFunc« (ab Zeile 26) ruft es mit »glmDraw« auf (Zeile 37). Dabei verwendet sie die Flags »SMOOTH« und »MATERIAL« - fertig. Statt viele tausend Dreiecke einzeln zu definieren, hat das Skript in wenigen Schritten ein komplettes Modell geladen.
| 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.
|