Open Source im professionellen Einsatz

Newsletter abonnieren
Seite durchsuchen

HEFTARCHIV | NEWS | E-BIBLIOTHEK | VIDEO | BLOGS | WHITEPAPER | EVENTS | ACADEMY | ABO | SHOP

user friendly

  Home  »  Heft & Abo  »  Heftarchiv  »  2006  »  10  »  Im Rampenlicht  

RSS-Feed der aktuellen News von Linux-Magazin Online Folgen Sie Linux-Magazin Online auf Twitter
Diesen Artikel druckenDiesen Artikel weiterempfehlen Diesen Artikel kommentieren Newsletter abonnieren
Share/Bookmark

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.

Listing 2: Licht und
Farbe

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.

Listing 3: Wavefront-Modell
lesen

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.

Sie können diesen Artikel als PDF für 99 Cent kaufen. Klicken Sie dazu einfach auf eine der beiden Bezahloptionen Paypal oder ClickandBuy.


Diesen Artikel druckenDiesen Artikel weiterempfehlen Diesen Artikel kommentieren Newsletter abonnieren
Share/Bookmark
Ähnliche Artikel
Virtueller Bühnenbildner Dreidimensionale Modelle in eigenen Skripten mit Tcl3D
Künstlicher Horizont 3D-Engine Ogre
Virtuelle Welt Interaktive 3D-Welten mit Coin und Qt
Zauberlehrling Automatische Bildbearbeitung mit Imagemagick
Spezialeffekt Rich Internet Applications mit Java FX
Glänzende Effekte 3D-Grafiken verbessern durch Shader
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)
Kommentare (0)