Autor Comedy Kreativer Physiker Lehrer Bastler Interessierter
Kreativer Physiker
Licht | Nebel | Beispiel

Ambiente schaffen

Es gibt bei Pov-Ray(TM) viele Möglichkeiten die Stimmung einer Szene zu beeinflussen. Dazu zählen nicht nur verschiedene Optionen für Lichtquellen, sondern auch Schatten, Wolken am Himmel und verwirbelte Tornados. Der Umgang damit, wird hier in diesem Kapitel behandelt.
Licht | Nebel | Beispiel

Die verschiedenen Lichtquellen

In unseren Bildern wurde das Licht durch eine light_source erzeugt. Dabei handelt es sich ohne weitere Angaben um eine Punktlichtquelle. Diese ist unsichtbar und beleuchtet alle Gegenstände gleich stark. Allerdings lassen sich beim Raytracing auch Lichtquellen modifizieren. Dazu gibt es die Angaben spotlight, area_light sowie ambient_light. Außerdem lassen durch looks_like Objekte zu Lichtquellen machen. Dadurch kann man seinem Bild zu mehr Realismus verhelfen. Dabei solltet ihr allerdings immer daran denken:

Zitat "You know you have been raytracing too long when...
...You take a photo course just to learn how to get the lighting right.
"
- Christoph Rieder (Forum auf www.povray.org) -

Spotlight: Willkommen im Theater

Im Theater kommen Scheinwerfer zum Einsatz, die nur einen bestimmten Bereich der Bühne beleuchten. Auch "POV-Ray(TM)" bietet eine solche Lichtquelle. Diese wird als light_source erstellt und mit dem Vermerk spotlight versehen. Das sieht dann wie folgt aus:

        #version 3.6;
        #include "colors.inc"

        camera{ location <0, 5, -12> look_at <0,3,0> }
        light_source{ <8, 10, -2> color White
          spotlight radius 25 falloff 40 tightness 8 point_at <6,3,3>}
        light_source{ <-8, 10, -2> color White
          spotlight radius 10 falloff 20 tightness 15 point_at <-6,3,3>}
        background{Navy}
        plane{ y,0 pigment{checker Black White} }

        sphere{ <6,3,3>,2 pigment{Red} }
        sphere{ <0,2,2>,2 pigment{Yellow} }
        sphere{ <-6,3,3>,2 pigment{Green} }
        

Wichtig ist dabei die dritte Zeite in der die Lichtquelle spezifiziert wird. Dabei gibt Spotlight eben an, dass es sich um einen Scheinwerfer handelt. Bevor wir uns jetzt die Bedeutung der weiteren Einstellungen anschauen, wollen wir einen Blick auf das erzeugte Bild werfen:

Beispiel für Spotlight

Mit der Angabe radius gibt man dabei einfach den Radius des Kegels an, was auf dem Bild gut zu sehen ist, denn die rote Kugel ist mit einem wesentlich größeren Kegel beleuchtet. Es folgt der falloff, der angibt welcher Bereich um den eigentlichen Kegel noch ausgeleuchtet wird. Ein kleiner Wert bedeutet dabei einen scharfen Kegel, der wirklich nur den durch radius angegebenen Bereich ausleuchtet. Große Werte stehen dagegen für einen Lichtkegel, der langsam schwächer wird und noch einen großen Bereich um den eigentlichen Kegel beleuchtet. Die Angabe der tightness beeinflusst vorwiegend die Schatten der Objekte. Große Werte sorgen für einen konzentrierten Lichtkegel und weichere Schatten. Bei kleinen Werten wird der Kegel aufgeweitet, die Schatten werden schärfer. Zuletzt wird noch point_at angegeben, was einfach nur einem Punkt im Koordinatensystem entspricht auf den der Scheinwerfer ausgerichtet ist.
In unserem Fall beleuchtet der linke Scheinwerfer die grüne Kugel, während der rechte Scheinwerfer auf die rote Kugel gerichtet ist. Somit eröffnen sich völlig neue Möglichkeiten die Beleuchtung eines Bildes zu kontrollieren.
Bevor wir jetzt die nächste Variante der Lichtquelle kennen lernen noch zwei Hinweise:

  1. Die Werte von radius, falloff und tightness werden als Winkel in Grad angegeben. Daher sind lediglich Eingaben von 0° bis 90° möglich.
  2. Das spotlight erzeugt ein Lichtkegel. Als Sonderform lässt sich jedoch auch ein zylinderförmiges Licht erzeugen. Dazu muss einfach die Angabe spotlight durch cylinder ersetzt werden.

Probiert ruhig ein wenig mit den neu gelernten Lichtquellen herum. Übung macht bekanntlich den Meister und ein wenig Übung ist durchaus nötig, um den Scheinwerfer zu kontrollieren. Das gilt nicht nur im Theater...

Area_light: Leuchtstreifen

Beim Theater werden wie beim Fernsehen im Studio Scheinwerfer verwendet, um die Szenen zu beleuchten. Wie sich diese mit "POV-Ray(TM)" realisieren lassen, haben wir im letzten Abschnitt kennen gelernt. Doch haben alle unsere Lichtquellen inklusive der Scheinwerfer bisher scharfe Schatten erzeugt. Um das zu ändern und weiche, realistische Schatten zu erzeugen gibt es die Möglichkeit flächige Beleuchtungen einzusetzen. Dies geht über die Anweisung area_light innerhalb einer Lichtquelle. Doch schauen wir uns einfach den Befehl an.

        light_source { <1,10,1> color White
          spotlight radius 12 falloff 20 tightness 15 point_at <0,1.5,4>
          area_light <1,0,0>, <0,0,1>, 2, 2 }
        

Während die ersten beiden Zeilen bereits bekannt sein sollten, ist die letzte Zeile eben für das flächige Licht verantwortlich. Dabei sind für das area_light vier Angaben notwendig. Die ersten beiden stehen für die Ausdehnung der Lichtquelle. In unserm Fall ist das einfach eine Längeneinheit (LE) in x- und eine LE in z-Richtung. Die beiden Werte hinter den Vektoren geben die Zahl der verwendeten Lichter an. Demnach werden auf einer Fläche von 1x1 LE eine Zahl von 2x2 Lichtquellen platziert. Zentriert ist das Leuchtfeld dabei um den Punkt <1,10,1>.
Doch schauen wir uns am Besten das area_light an einem konkreten Beispiel an:

        #version 3.6;
        #include "colors.inc"
        #include "finish.inc"
        #include "textures.inc"

        camera{location <0,10,-10> look_at <0,4,0> }
        background{Navy}
        plane{ y,0 pigment{checker Black White} }
        box{ <-20,-1,10>,<20,6.8,12> pigment{brick Gray Red scale .4} }

        light_source{ <-7,10,8> color White
          spotlight radius 12 falloff 20 tightness 15 point_at <-7,1.5,4> }    
        light_source{ <0,10,8> color White
          spotlight radius 12 falloff 20 tightness 15 point_at <0,1.5,4>
          area_light <1,0,0>, <0,0,1>, 2, 2 } 
        light_source{ <7,10,8> color White
          spotlight radius 12 falloff 20 tightness 15 point_at <7,1.5,4>
          area_light <1,0,0>, <0,0,1>, 2, 2 adaptive 1 jitter }
  
        sphere{ 0,1.5 translate<-7,1.5,4> texture{New_Brass} }
        sphere{ 0,1.5 translate<0,1.5,4> texture{New_Brass} }
        sphere{ 0,1.5 translate<7,1.5,4> texture{New_Brass} }
        

Zum besseren Vergleich des Schattenwurfs erstellen wir dabei gleich drei Scheinwerfer, von denen der linke eine ganz normale Lichtquelle darstellt, während die Mittlere sowie die rechte jeweils als area_light ausgeführt sind. Schauen wir uns das Bild also einmal an uns achten dabei insbesondere auf die Schatten der drei Kugeln.

Verschiedene Lichtquellen

Wie von unseren bisherigen Bildern bekannt, ist der Schatten der linken Kugel scharf. Bei der mittleren Kugel sehen wir dagegen vier Schatten, die sich überlagern, während der Schatten der rechten Kugel verschwommen erscheint. Dies liegt an dem Zusatz jitter den wir der letzten Lichtquelle hinzugefügt haben. Dies bewirkt, dass die Lichtquellen leicht gegeneinander verschoben werden, um einen weichen Schatten zu erzeugen.
Die Angabe adaptive ermöglicht es dagegen, eine bestimmte Zahl an Lichtstrahlen bei der Berechnung auszulassen, was die Erstellung des Bildes beschleunigt. Eine große Zahl bedeutet dabei, dass viele Lichtstrahlen weggelassen werden, was allerdings der Qualität der Schatten abträglich sein kann. Kleine Zahlen haben dagegen nur wenig Einfluss auf den Schattenwurf, beschleunigen die Erstellung des Bildes allerding auch nur geringfügig. Der Wert "1" stellt dabei einen ganz guten Kompromiss zwischen realistischer Darstellung und schneller Berechnung dar.

Das gerade erworbene Wissen können wir auch gleich noch in einem anderen Bild anwenden. So haben wir uns bisher nur um Scheinwerfer, also das Filmstudio gekümmert. Mit dem area_light lässt sich aber auch der Bereich auf der anderen Seite darstellen. Wir wollen also einen Blick ins Wohnzimmer und vor allem einen Blick auf die Fernsehgeräte werfen.

        #version 3.6;
        #include "colors.inc"
        #include "finish.inc"
        #include "textures.inc"

        camera{location <0,10,-10> look_at <0,4,0> }
        background{Black}
        plane{ y,0 pigment{checker Black White} }
        box{ <-20,-1,10>,<20,6.8,12> pigment{brick Gray Red scale .4} }

        #declare Flat_Screen = difference {
          superellipsoid{ <.15, .15> pigment{Black} finish{Shiny} }
          box{ <0,0,0>, <1.7,1.6,1> pigment{White} translate<-.85,-.75,-1.6> } };
 
        #declare TV_Bein = merge {
          cone{ <0,0,0>, 1, <0,2,0>,1.0e-4 rotate <0,0,180> }
          cylinder{ <0,-0.01,0>, <0,4,0>, .6 } texture{Chrome_Metal} };    
 
        #declare Modern_TV = merge {
          object{Flat_Screen scale <3,2,.25>}
          object{TV_Bein scale .4 translate <-2,-3.2,0>}
          object{TV_Bein scale .4 translate <2,-3.2,0>}    
          light_source{ <0,0,-1.2> color Gray75 fade_distance 6 fade_power .8
            area_light <2,0,0>, <0,1.8,0>, 3, 2
            adaptive 1 jitter} };
  
        object{ Modern_TV scale.8 rotate -15*y translate<-8,3,7> }
        object{ Modern_TV scale.8 rotate 15*y translate<8,3,7> }
        sphere{ <-5,1.2,1.5>,1.2 texture{New_Brass} }
        sphere{ <0,1.5,5>,1.5 texture{Gold_Nugget} }
        sphere{ <6.5,2,4>,1.2 texture{Chrome_Metal} }
        

Auch wenn das "Wohnzimmer" aus einer Backsteinwand und einem gefliesten Boden besteht, hat der Besitzer immerhin zwei Flachbildvernseher bei sich zuhause. Doch will uns das jetzt nicht weiter stören, viel interessanter ist ein Blick auf die TV-Geräte und vor allem auf die von ihnen erzeugten Schatten zu werfen:

Wohnzimmer mit area_light

Wie bereits erwähnt stehen zwei Flachbildvernseher im Hintergrund und beleuchten die Objekte im vorderen Teil des Bildes. Dabei ist jeder Bildschirm mit einem area_light versehen. Neu ist hier allerding die Angabe fade_distance, mit der eingestellt werden kann, in welchem Abstand das Licht beginnt schwächer zu werden. Außerdem gibt die fade_power an, wie stark die Helligkeit abnimmt. Niedere Werte bedeuten dabei, dass es noch länger zu sehen ist, als bei großen Werten. Wichtig zu wissen ist dabei, dass diese Werte bei jeder Lichtquelle angegeben werden können. Sie setzen also nicht zwingend ein area_light voraus.
Wir sind auf der Jagd nach weichen, realistischen Schatten in diesem Abschnitt einen guten Schritt weiter gekommen. Doch sollte man bei der Suche nach weichen Schatten seine Grenzen kennen:

Zitat "You know you have been raytracing too long when...
...You wear fuzzy clothing to soften your shadow.
"
- Mark Kadela (Forum auf www.povray.org) -

Ambient_light: Indirekte Beleuchtung

Wer in einer klaren Nacht abseits der Straßenbeleuchung spazieren geht, der wird feststellen, dass es auch ohne direkte Lichtquelle immer ein wenig Licht gibt. Auch auf einer Theaterbühne ist stets ein wenig Resthelligkeit zu sehen. Diesen Effekt kann man bei "POV-Ray(TM)" über das ambient_light realisieren. Um den Effekt zu veranschaulichen machen wir uns gleich an ein kleines Beispiel:

        #version 3.6;
        #include "colors.inc"
        #include "textures.inc"

        global_settings{ ambient_light Red }
        camera{location <0,10,-10> look_at <0,4,0> }
        plane{ y,0 pigment{checker Black White} }

        light_source { <-7,10,8> color Yellow
          spotlight radius 18 falloff 30 tightness 15 point_at <0,1.5,4> }    

        sphere{ 0,1.5 translate<-7,1.5,4> texture{Chrome_Metal}
          finish{ambient .3 diffuse .5} }
        sphere{ 0,1.5 translate<0,1.5,4> texture{Chrome_Metal}
          finish{ambient .3 diffuse .5} }
        sphere{ 0,1.5 translate<7,1.5,4> texture{Chrome_Metal}
          finish{ambient .3 diffuse .5} }
        

Wir erzeugen bei diesem Bild drei Kugeln, wobei die Mittlere von einem Scheinwerfer angeleuchtet wird. Es ist also keine komplette Dunkelheit in der wir unterwegs sind. Dennoch lässt sich die Resthelligkeit sehr gut erkennen:

Restlicht auf der Bühne

Wichtig dabei sind zwei Teile aus denen sich der Effekt zusammen setzt. So haben wir zunächst unter global_settings die Farbe des Streulichts definiert. Bei den Objekten muss dann noch unter finish mit der Angabe ambient festgelegt werden, wie stark das Streulicht reflektiert werden soll. Der Wert hinter diffuse gibt dagegen an, wie stark direkt einfallendes Licht aus einer Lichtquelle reflektiert wird. Üblicherweise ist daher der Wert für ambient ein Stück kleiner als die Angabe für diffuse. Spielt ruhig ein wenig mit den Werten, dann seht ihr recht schnell was sie bewirken. Vor allem die Kugel abseits des Lichtkegels ist dabei wichtig zu beobachten.
Es gibt noch eine weitere Möglichkeit die Grundbeleuchtung eines Bildes zu erzeugen. So können Lichtquellen ohne Schatten erstellt werden. Diese eigenen sich hervorragend um Stimmungen zu erzeugen. Das soll ein Beispiel veranschaulichen.

        #version 3.6;
        #include "colors.inc"
        #include "textures.inc"

        camera{location <0,10,-10> look_at <0,4,0> }
        plane{ y,0 pigment{checker Black White} }

        light_source{ <0,5,0> Red shadowless fade_distance 5 }
        light_source { <-7,10,8> color Yellow
          spotlight radius 18 falloff 30 tightness 15 point_at <0,1.5,4> }    

        sphere{ 0,1.5 translate<-7,1.5,4> texture{Chrome_Metal}
          finish{ambient .3 diffuse .5} }
        sphere{ 0,1.5 translate<0,1.5,4> texture{Chrome_Metal}
          finish{ambient .3 diffuse .5} }
        sphere{ 0,1.5 translate<7,1.5,4> texture{Chrome_Metal}
          finish{ambient .3 diffuse .5} }
        

Dabei verwenden wir nicht nur die Angabe shadowless, sondern lassen die Lichtquelle durch den Zusatz fade_distance mit der Zeit schwächer werden. Das Ergebnis kann sich dabei durchaus sehen lassen:

Licht ohne Schatten

Looks_like: Objekt als Lichtquelle

Alle Lichtquellen, die wir bisher eingesetzt haben, waren unsichtbar. Genau genommen ware es lauten Punktlichter, die so klein sind, dass man sie nicht sehen kann, aber hell genug um die Szene zu beleuchten. Mit solchen Lichtquellen lä;sst sich das Sonnenlicht ganz gut simulieren, doch in geschlossenen Räumen ist die Beleuchtung meist sichtbar. Darauf müssen wir beim Erstellen unserer Bilder allerding nicht verzichten. So gibt es die Möglichkeit einer Lichtquelle das Aussehen eines Gegenstandes zu geben. Im folgenden Beispiel erstellen wir uns zur Demonstration funktionierende Stromsparlampen:

        #version 3.6;
        #include "colors.inc"
        #include "textures.inc"

        camera{location <0,14,-12> look_at <0,8,0> }
        plane{ y,0 pigment{checker Black White} }

        #declare Leuchtstab = merge{
          cylinder{ <-3,0,0>,<-3,8,0>,1}
          cylinder{ <3,0,0>,<3,8,0>,1}
          difference{
            torus{ 3,1 rotate<90,0,0> translate 8*y }
            box{ <-5,2,-2>,<5,8,2> } }
            pigment{White} finish{ambient .8 diffuse .6} };

        #declare Lampe = union{
          object{Leuchtstab translate -1.5*z}
          object{Leuchtstab translate 1.5*z}
          cylinder{ 0,<0,-2,0>,4.5 pigment{White} }
          cone{ <0,-2,0>,4.5, <0,-5,0>,2.5 pigment{White} }
          cylinder{ <0,-5,0>,<0,-6.5,0>,2 texture{Chrome_Metal} }
            scale .3 rotate 180*x };

        light_source{ <-6,12,10> color White looks_like{Lampe rotate 72*y} }
        light_source{ <6,12,10> color White looks_like{Lampe rotate -72*y} }
        sphere{ 0,2.5 translate<-8,2.5,12> texture{Chrome_Metal} }
        sphere{ 0,2.5 translate<0,2.5,12> texture{Candy_Cane} }
        sphere{ 0,2.5 translate<8,2.5,12> texture{DMFWood6} }
        

In diesem Bild werden drei Kugeln von zwei Lichtquellen in Form der Energiesparlampen beleuchtet. Letztere wird dabei in zwei Stufen weiter oben erstellt. Doch schauen wir uns das Ergebnis am Besten einmal an.

Stromsparlampen

Da die Kugeln alte Bekannte sind, konzentrieren wir uns lieber auf die beiden Lampen am oberen Rande des Bildes. Wie gewünscht strahlt der Leuchtstab schön hell, wie wir es erwarten. Dies wird erreicht durch den hohen Wert von ambient, wie wir es im letzten Abschnitt gelernt haben. Das die Lampen tatsächlich leuchten und einen Schattenwurf erzeugen liegt an der Ergänzung looks_like, die hinter der Farbe innerhalb der Lichtquelle steht. Somit kann man Räume stilecht durch künstliches Licht erhellen. Dabei ist die Lichtfarbe natürlich frei wählbar, was ein waschechter Vorteil gegenüber den "echten" Energiesparlampen ist.

Nebel, Himmel und Tornados

Um die Stimmung einer Szene zu verändern, bietet "POV-Ray(TM)" nicht nur verschiedene Arten an Lichtquellen, sondern auch Nebel ist möglich. Dieser kann geheimnisvoll oder mysteriös wirken und damit ein Bildes maßgeblich beinflussen. Daher wollen wir uns in diesem Abschnitt anschauen, wie sich Nebel durch die Angabe Fog erzeugen lässt. Dabei gibt es den fog_type 1 der gleichmäßigen Nebel entspricht und den fog_type 2, der für Bodennebel steht.
Den letzen Feinschliff bekommt das Bild durch den Einsatz einer sky_sphere, die einen realistischen Hintergrund ermöglicht. Dazu gesellt sich die Möglichkeit über media einzustellen, wie Objekte auf das einfallende Licht reagieren. Dadurch werden Sonne, Wolken und Wirbelstürme möglich.

Nebel: Ungeahnt geheimnisvoll

Ebenso wie bei Objekten lässt sich Nebel in verschiedenen Varianten erzeugen. So lässt sich neben der Farbe auch die Stärke einstellen. Folgendes Bild zeigt dabei den Effekt von Nebel auf eine Szene:

        #version 3.6;
        #include "colors.inc"
        #include "textures.inc"

        light_source{ <10,20,0> White }
        light_source{ <-10,20,0> White }
        camera{location <0,8,-15> look_at <0,4,0> }
        background{Navy}
        fog{ fog_type 1 distance 15 color rgb<.3,.5,.2> }
        plane{ y,0 pigment{checker Blue White} }

        sphere{ <-6,2,4>,2 texture{New_Brass} }
        sphere{ <0,2,10>,2 texture{Gold_Nugget} }
        sphere{ <7,2,20>,2 texture{Chrome_Metal} }
        sphere{ <-7,7,6>,2 texture{New_Brass} }
        sphere{ <0,7,14>,2 texture{Gold_Nugget} }
        sphere{ <7,7,24>,2 texture{Chrome_Metal} }
        

Das Bild besteht aus sechs Kugeln, die über unserem gewohnten Boden schweben. Neu ist dabei die Zeile nach dem Hintergrund. Diese erzeugt den Nebel, wie man gut auf dem Bild sehen kann.

Kugeln im Nebel

Im Bild zeigt sich das gewünschte Ergebnis: Sechs Kugeln werden von einem grünen Nebel eingehüllt. Den Flächennebel haben wir dabei durch die Angabe fog_type 1 erzeugt. Es folgt distance 15, was es ermöglicht die Intensität des Nebel einzustellen. So ist auf dem Bild gut zu sehen, wie der Nebel in Richtung Horizont dichter wird. Genau dies beeinflusst die angegebe Entfernung. Ein niedirger Wert bedeutet schon im vorderen Teil des Bildes einen dichten Nebel, während bei großen Werten der Nebel nur im Hintergrund des Bildes sichtbar wird. Am Ende wird dann noch die Farbe des Nebels definiert, wobei wir hier ein dunkles Grün gewählt haben, was eine mysteriöse Stimmung erzeugt. Es ist jedoch auch jede andere Farbe denkbar, auch Transparenzeffekte können angewandt werden. So kann mit der Angabe rgbt oder rgbf der Nebel den eigenen Wünschen angepasst werden.
Auch wenn Bodennebel ein paar Angaben mehr benötigt, das der Flächennebel, so ist er nicht viel schwieriger zu erzeugen. Die verdeutlich am Besten ein kleines Beispiel:

        #version 3.6;
        #include "colors.inc"
        #include "textures.inc"

        light_source{ <10,20,0> White }
        light_source{ <-10,20,0> White }
        camera{ location <0,8,-15> look_at <0,4,0> }
        background{Navy}
        fog {fog_type 2 distance 2 color rgb<.3,.5,.2>
          fog_offset 1.6 fog_alt 0.7 turbulence <.5,1,.2> turb_depth .6 }
        plane{ y,0 pigment{checker Blue White} }

        sphere{ <-6,2,4>,2 texture{New_Brass} }
        sphere{ <0,2,10>,2 texture{Gold_Nugget} }
        sphere{ <7,2,20>,2 texture{Chrome_Metal} }
        sphere{ <-7,7,6>,2 texture{New_Brass} }
        sphere{ <0,7,14>,2 texture{Gold_Nugget} }
        sphere{ <7,7,24>,2 texture{Chrome_Metal} }
        

Wir bleiben dabei der Szene mit den sechs Kugeln treu und ändern nur den Nebel entsprechend ab. Mit einem Bodennebel ergibt sich dabei folgendes Bild:

Kugeln im Bodennebel

Wie erwartet füllt der Nebel nun nicht mehr das ganze Bild aus. Viel mehr dünnt er nach oben hin aus, weshalb der Blick auf den Horizont frei ist. Erreicht wird dies durch die Angabe fog_type 2, die für Bodennebel steht. Während wir die Bedeutung von distance und color schon vom Flächennebel kennen, sind fog_offset sowie fog_alt nur beim Bodennebel notwendig. So gibt Ersteres an, ab welcher Höhe der Nebel abnimmt, wobei mit der zweiten Angabe festgelegt wird wie stark er abnimmt. Somit kann man den Effekt des Nebels sehr gut einstellen.
Weiterhin haben wir dem Nebel in diesem Bild etwas turbulence spendiert, was ihn unregelmäig macht. Hinter turbulence steht dabei ein Vektor, mit dem sich die Stärke der Unregelmäßigkeit in der jeweiligen Raumrichtung angeben lässt. Außerdem lässt sich die Turbulenz mit turb_depth weiter zum Horizont (bei Werten > 0.5) oder näher zum Betrachter (bei Werten < 0.5) verschieben. Auch können alle Modifikatoren der Turbulenz, wie wir sie bei den Mustern kennen gelernt haben, verwendet werden. Es lässt sich also auch je ein Wert für omega, lambda und octaves angeben, weshalb wir den Nebel ganz unseren Bedürfnissen anpassen können.
Übrigens kann auch beim Flächennebel turbulence eingesetzt werden. Darüber hinaus lassen sich in einem Bild beliebig viele Nebel erzeugen, der Kreativität sind hier nur die Rechenleistung des Computers Grenzen gesetzt.

Die Sonne und der Himmel

In allen bisherigen Bildern bestand der Hintergrund einfach nur aus einer einzigen Farbe. Mehr ist über die Angabe background auch nicht möglich. Jedoch wäre damit die schöpferische Freiheit zu sehr eingegrenzt, als das es hier nicht noch mehr Möglichkeiten geben würde. So kann statt dem background auch die sky_sphere eingesetzt, werden. Diese bietet wesentlich mehr Möglichkeiten. So sind hier alle Muster möglich, die wir bereits kennengelernt haben. Richtig verwendet lässt sich so ein schöner sommerlicher Himmel mit ein paar Wolken am Horizont erstellen:

        #version 3.6;
        #include "colors.inc"

        camera{ location <0, 5, -15> look_at <0,6,0> }
        light_source{ <0, 30, -15> color White }
        plane{ y,0 pigment{checker Blue White} }

        sky_sphere{
          pigment{gradient y
          color_map{
        /*--------------------- Sonne -------------------------------*/
            [0 .002 color Yellow color rgb<.8,.4,.2>]
        /*--------------------- Himmel ------------------------------*/
            [.002 .1 color MediumForestGreen color SkyBlue]}
            scale 2 translate -1}
        /*--------------------- Wolken -------------------------------*/
        pigment { bozo
            turbulence 0.5 octaves 8 omega 0.6 lambda 2.8
            color_map{
          [0.0 0.1 color rgb .85 color rgb .75]
          [0.1 0.5 color rgb .75 color rgbt 1]
          [0.5 1.0 color rgbt 1  color rgbt 1] }
          scale <.1,.3,.1>} rotate -110*x }

        /*------------------ Bauklötzchenburg ---------------------------*/
        box{ <0,0,0>,<2,4,2> pigment{Green} translate -3.2*x }
        box{ <0,0,0>,<2,4,2> pigment{Yellow} translate 2.9*x }
        box{ <0,0,0>,<2,4,2> pigment{Red} scale<1,1.8,0.4>
        rotate<90,90,0> translate<-3,4.8,1.8> }
        cylinder{ <0,0,0>,<0,3,0>,1 pigment{color Blue} translate<1,4.8,1> }
        cone{ <0,0,0>,1.5 <0,2,0>,1e-4 pigment{Red} translate<1,7.8,1> }
        

Da die sky_sphere recht umfangreich bestückt ist, wurden die einzelnen Bestandteile des Bildes mit Kommentaren versehen. Das Bild besteht dabei aus der Bauklötzchenburg, die wir im ersten Kapitel erstelle haben. Neu ist dabei die Gestaltung des Himmels, die wir uns nun genauer anschauen wollen.

Wichtig ist hier, dass sowohl die Sonne als auch der Himmel mit Hilfe eines gradient erstellt wurden.
Die Wolken werden dagegen durch das Muster bozo erstellt, wobei in der verwendeten color_map auch transparente Farben vorkommen. Dies ist wichtig, da Wolken nach außen hin dünner werden und an diesen Stellen dann der Himmel durchscheint. So ergibt obige Kombination realistische Wolken.
Zum Schluß sei noch zu erwähnen, dass die sky_sphere lediglich Muster wie bozo, gradient oder spotted akzeptiert. Die vordefinierten Texturen aus der Datei textures.inc sind nicht gestattet. Außerdem hat das Bild noch einige Schwächen. So wird die Bauklötzchenburg nicht von der Sonne beleuchtet, was gut an dem Schattenwurf zu erkennen ist. Ebenso werfen die Wolken keine Schatten, wie sie es eigentlich tun sollten.
Für diese Ungereimtheiten gibt es leider keine einfache Lösung, da die sky_sphere eben als hinterste Ebene eines Bildes angesehen wird. Es ist damit also nicht möglich eine Lichtquelle hinter die sky_sphere zu plazieren, um die Sonne zu simulieren und einen Schattenwurf der Wolken zu erreichen. Doch auch dafür gibt es Möglichkeiten, das zu umgehen.

Der letzte Feinschliff

Im letzten Abschnitt haben wir und damit beschäftigt den Hintergrund des Bildes realistischer zu gestalten. Genau dies wollen wir nun noch weiter vertiefen. Vielleicht gilt nach der Studie dieses Abschnitts dann auch für euch:

Zitat "You know you have been raytracing too long when...
...You write to your friends: The weather is fine, the sky_sphere is colored rgb<0,0,1> and there's no bozo on it.
"
- Peter Christian -

Wir wollen uns hier aber nicht nur um Wolken kümmern, die Schatten werfen, sondern auch noch um einen leuchtenden Vollmond. Letzterer wird durch media ermöglicht. Doch machen wir uns zunächst dran das versprochene Bild zu erstellen und schauen uns anschließend die einzelnen Elemente näher an.

        #version 3.6;
        #include "colors.inc"

        camera{ location <-15, 8, -20> look_at <-5,6,10> }
        plane{ y,0 pigment{checker Blue White} }
        sky_sphere{ pigment{gradient y
          color_map{[0 color Black] [.5 color Navy]} scale 2} }

        #declare Mond = union{
          sphere{ 0,4 pigment{rgbt 1} hollow
          interior{media{emission 1 density{spherical density_map{
          [0 rgb 0] [0.3 rgb <.6,1,1>] [0.6 rgb <.2,1,1>] [1 rgb <1,1,.6>]}}}} }
          light_source{ 0 color White} };

        #declare Burg = union{
          box{ <0,0,0>,<2,4,2> pigment{Green} translate -3.2*x }
          box{ <0,0,0>,<2,4,2> pigment{Yellow} translate 2.9*x }
          box{ <0,0,0>,<2,4,2> pigment{Red} scale<1,1.8,0.4>
          rotate<90,90,0> translate<-3,4.8,1.8> }
          cylinder{ <0,0,0>,<0,3,0>,1 pigment{Blue} translate<1,4.8,1> }
          cone{ <0,0,0>,1.5 <0,2,0>,1e-4 pigment{Red} translate<1,7.8,1>} };

        plane{ y,50 pigment{ bozo
          turbulence 0.65 octaves 6 omega 0.7 lambda 2
          color_map{
            [0.0 0.1 color rgb .85 color rgb .75]
            [0.1 0.5 color rgb .75 color rgbt 1]
            [0.5 1.0 color rgbt 1  color rgbt 1]}
            scale <6, 9, 4>} finish{ambient .5} hollow }

        object{Mond scale <17,15,8> translate<-50,80,250> }
        object{Burg}
        object{Burg translate<-15,0,25> }
        

Neben dem leuchtenden Vollmond, um den wir uns gleich ausführlich kümmern wollen, gibt es noch eine Ebene, die den Himmel darstellt und daher mit den bereits bekannten Wolken aufwartet. Außerdem stehen zwei unserer altbekannten Bauklötzchenburgen im Bild. Doch schauen wir uns das Ergebnis einfach einmal an:

Anwendungen von media

Um die Übersicht zu verbessern wird der Mond bereits zu Begin definiert. Er besteht dabei aus einer transparenten Kugel, was aus der Farbe rgbt 1 ersichtlich ist. Außerdem handelt es sich um einen Hohlkörper, wofür die Anweisung hollow steht. Diese lässt sich übrigens auf alle erstellbaren Gegenstände anwenden, nicht nur auf Kugeln. Dabei ist zu beachten, dass jeder Gegenstand, der Medien enthalten soll hohl sein muss. Sonst haben diese Spezialeffekte "keinen Platz" im Inneren.
Nachdem die Kugel nun alle Anforderungen erfüllt, kümmern wir uns um das Innenleben, was durch interior gestaltet werden kann. In unserem Fall wollen wir einen leuchtenden Mond erzeugen. Daher fügen wir der Kugel ein leuchtendes Inneres hinzu. Dies wird erreicht über den Zusatz media{emission 1}. Mit der Zahl wird dabei das Aussehen des Gegenstandes beeinflusst. So multipliziert "POV-Ray(TM)" die Farben der folgenden color_map mit diesem Wert. Da wir die Zahl "1" verwenden, spielt dies in unserem Fall keine Rolle.
Bei der folgenden density_map ist zu beachten, dass der Wert "0" dem äußeren Bereich der Kugel entspricht, während bei "1" das Zentrum erreicht ist. Wir haben daher einen schwarzen äußeren Bereich, der immer mehr in weiß übergeht. Die Lichtquelle ist schließlich noch nötig, um den Vollmond auch die Szene beleuchten zu lassen.
So beeinflusst media lediglich das Aussehen eines Objekts, es scheint hell leuchtend, allerdings geht kein Licht davon aus. Vergleichbar ist dieser Effekt mit einem hohen Wert für ambient, wobei sich der Einsatz von media jedoch besser anpassen lässt.
Wie hübsch Bilder durch den Einsatz von media werden können, wollen wir uns auch gleich in einem zweiten Beispiel anschauen.

In diesem Bild nutzen wir auch nicht nur den Effekt emission, sondern es kommen noch die beiden anderen Effekte zum Einsatz, bei denen es sich um absorption und scattering handelt. Bevor wir uns jetzt daran machen ein Beispiel zu erstellen noch einen Hinweis: Man kann Effekte auch mischen. So kann ein Gegenstand gleichzeitig die Angabe emission und absorption besitzten. Diesen Umstand setzen wir in folgendem Beispiel um.

        #version 3.6;
        #include "colors.inc"

        camera{ location <-15, 8, -20> look_at <-5,6,10> }
        light_source{ <-7,20,-10> color White shadowless}
        background{SkyBlue}
        plane{ y,0 pigment{checker Blue White} }

        #declare Sonne = union{
          sphere{ 0,1 pigment{rgbt 1} hollow
          interior{media{emission 1 density{spherical density_map{
            [0 Red] [.3 Orange] [.6 Yellow] [1 White]}}}
          media{absorption .4}} }
          light_source{ 0 color White} };

        #declare Tornado = union{
          cone{ 0,.5,<0,6,0>,3 pigment{rgbt 1} hollow
            interior{media{absorption 2 density{cylindrical density_map
            {[0 rgb 0] [.3 rgb .1] [.6 rgb .2] [.9 rgb .5]} scale .5
            warp{turbulence .4 octaves 5 omega .9 lambda 1.4} scale 2}}}
            scale <2,6,2> translate -2*y}
          cylinder{ .1,<0,6,0>,6 pigment{rgbt 1} hollow
            interior{media{scattering{1,.1 extinction .1}}} } };

        #declare Burg = union{
          box{ <0,0,0>,<2,4,2> pigment{rgb<0,1,0>} translate -3.2*x }
          box{ <0,0,0>,<2,4,2> pigment{rgb<1,1,0>} translate 2.9*x }
          box{ <0,0,0>,<2,4,2> pigment{rgb<1,0,0>} scale<1,1.8,0.4>
            rotate<90,90,0> translate<-3,4.8,1.8> }
          cylinder{ <0,0,0>,<0,3,0>,1 pigment{rgb<0,0,1>} translate<1,4.8,1> }
          cone{ <0,0,0>,1.5 <0,2,0>,1e-4 pigment{rgb<1,0,0>}
            translate<1,7.8,1>} };

        plane{ y,30 pigment{ bozo
        turbulence 0.65 octaves 6 omega 0.7 lambda 2
        color_map{
          [0.0 0.1 color rgb .75  color rgb .65]
          [0.1 0.5 color rgb .65  color rgbt .55]
          [0.5 1.0 color rgbt .55 color rgbt 1]}
          scale <8, 12, 6>} finish{ambient .5} hollow }

        object{Sonne scale <5,4.5,3> translate<-20,34,60>}
        object{Burg}
        object{Burg translate<-15,0,25>}
        object{Tornado translate <-10,0,22>}
        

In diesem Bild haben wir den Mond durch die Sonne ersetzt sowie einen Tornado eingefügt, der zwischen den Bauklötzchenburgen hindurch fegt. Insgesamt ergibt sich folgendes Bild:

media im Einsatz

Schön zu sehen ist die leuchtende Sonne, die hinter dem wolkenbehangenen Himmel strahlt. Dabei kommt der Effekt absorption zum Einsatz, um die Sonne als massiven Körper erscheinen zu lassen. Würden wir nur emission verwenden, so wäre die Sonne transparent, da sie eben kein Licht absorbieren würde. Somit verwenden wir in diesem Fall zwei Effekte in einem Körper, um das gewünschte Bild zu erhalten.
Der Tornado besteht aus zwei Teilen. Der erste ist ein Kegel, der die Windrose darstellt und daher Licht absorbieren soll. Außerdem ist er mit turbulence ausgeführt, um ihn realistisch erscheinen zu lassen. Wichtig ist außerdem, dass hinter der Anweisung absorbieren ein Wert steht, der größer als "1" ist. Die bedeutet einfach, dass die Farben dunkler wirken. Außerdem gilt zu beachten, dass der Gegenstand immer die angegebe Farbe absorbiert, während alle anderen Farben passieren können. Soll also ein Gegenstand in Gelb erstrahlen, so muss Blau abgezogen werden. Ein farbiger Tornado würde also wie folgt aussehen:

        #declare Tornado = union{
          cone{ 0,.5,<0,6,0>,3 pigment{rgbt 1} hollow
            interior{media{absorption 2 density{cylindrical density_map
            {[0 rgb 0] [.3 rgb <0,1,0>] [.6 rgb <0,0,1>] [.9 rgb <0,1,1>]}
            scale .5 warp{turbulence .4 octaves 5 omega .9 lambda 1.4} scale 2}}}
            scale <2,6,2> translate -2*y}
          cylinder{ .1,<0,6,0>,6 pigment{rgbt 1} hollow
            interior{media{scattering{1,.1 extinction .1}}} } };
        

Der erste Wert gibt dabei Schwarz an, was einfach bedeutet, das kein Licht absorbiert wird. Im nächsten Bereich wird Grün absorbiert, der Tornado hat daher einen violetten Farbanteil. Der nächste Abschnitt ist in Gelb gefärbt, da blaues Licht aufgenommen wird. Zum Schluss kommt noch Rot hinzu, was übrig bleibt wenn wir von weißem Licht Grün und Blau abziehen. Hier zeigt sich auch ein ganz wesentlicher Aspekt der verwendeten Effekte. So wird ihr Aussehen wesentlich vom Umgebungslicht geprägt. Die oben beschriebenen Farben ergeben sich nämlich nur, da wir weiße Lichtquellen in unserem Bild verwenden. Bei blauem oder orangem Licht würde das Ergebnis ganz anders aussehen.
Zum Schluss wollen wir uns noch dem zweiten Bestandteil des Tornados widmen. Hierbei handelt es sich um einen Zylinder der mit dem Effekt scattering ausgestattet ist und den aufgewirbelten Staub des Tornados simulieren soll. Dabei ist scattering jedoch etwas aufwendiger zu handbaben als die beiden bisher verwendeten medien. So wird durch das Licht, das durch den Zylinder geht entsprechend den Angaben gestreut. Daher gibt der erste Wert in der geschweiften Klammer die Art der Streuung an. Möglich sind hier die Werte "1", "2", "3" und "4", die jeweils für eine andere Art der Streuung stehen. Diese lauten wie folgt:

Wert Art der Streuung Beispiel
1 Isotrop Nebel
2 Mie, haze Schwebepartikel in der Luft
3 Mie, murky Wassertröpfchen in Wolken
4 Raylight Blauer Himmel - Winkelabhängiger Effekt

Jeder Physiker wird sich jetzt direkt zuhause fühlen, für alle anderen sei gesagt: Probiert die Effekte einfach aus und entscheidet euch für den, der euch am besten gefällt...

Als nächstes folgt die Angabe der Farbe. In unserem Beispiel ist das ein dunkles Grau, weshalb die Streuung sehr gut zu sehen ist. Natürlich ist hier auch jede beliebige Farbe denkbar. Diese kann einfach über rgb<x,y,z> angegeben werden. Zuletzt wird dann noch durch extinction eingestellt wie viel Licht absorbiert wird. Ein niedriger Wert besagt dabei, dass viel Licht durch den Gegenstand geht, während hohe Werte für viel Absorption steht. Wir haben in unserem Beispiel einen niedrigen Wert gewählt, damit der Effekt des aufgewirbelten Staubs möglichst gut zu sehen ist.
Auch wenn das nur ein kleiner Auszug aus den Mögichkeiten war, die uns die Verwendung von media bietet, so sind die Effekte durchaus hübsch anzusehen. Außerdem ist hiermit das Tutorial schon beinahe am Ende, denn mit den Spezialeffekten haben wir die letzte grundlegende Funktion von "POV-Ray(TM)" kennen gelernt. Im nächsten Abschnitt soll daher nur noch eine "kosmetische" Funktionalität betrachtet werden.

Beispiel

Zum Ambiente eines Bildes zählt nicht nur ein schönes Ergebnis, sondern auch ein verständlicher Quell-Code. Ansonsten verliert man bei größeren Bildern schnell die Übersicht. Soll dann zwei Wochen später noch einmal Hand angelegt werden, um dem Bild den letzten Feinschliff zu verpassen, braucht das sehr viel Zeit. Abhilfe schafft hier, vollständige Objekte einfach in eine extra Datei zu packen. Der Content-Pack hilft dabei, den Code sauber zu halten und die selbst erstellten Figuren zu organisieren. Grund genug, sich anzuschauen, wie so ein Pack erstellt wird.

Content-Packs erstellen

In vielen unserer Beispiele haben wir Objekte zunächst definiert, bevor wir sie später im Bild plaziert haben. Dazu kam der Befehl #declare zum Einsatz. Besonders ist dabei, dass die Definitionen nicht zwingend in der Datei selbst stehen müssen. So kann man zunächst eine Datei erstellen, die alle Gegenstände enthält. Solch eine Datei wird auch "Content Pack" genannt, da sie Inhalte bereit stellt.
Wichtig ist dabei, dass der Content Pack die Endung ".inc" erhält. Als Beispiel wollen wir nun unsere ganzen "Highlights" aus diesen Tutorial in einen Content Pack stecken. Diesen nennen wir Tutorial.inc

        //--------------------- Lichtquellen -------------------------
        #declare Leuchtstab = merge{
          cylinder{ <-3,0,0>,<-3,8,0>,1}
          cylinder{ <3,0,0>,<3,8,0>,1}
          difference{
            torus{ 3,1 rotate<90,0,0> translate 8*y }
            box{ <-5,2,-2>,<5,8,2> } }
        pigment{White} finish{ambient .8 diffuse .6} };

        #declare Lampe = union{
          object{Leuchtstab translate -1.5*z}
          object{Leuchtstab translate 1.5*z}
          cylinder{ 0,<0,-2,0>,4.5 pigment{White} }
          cone{ <0,-2,0>,4.5, <0,-5,0>,2.5 pigment{White} }
          cylinder{ <0,-5,0>,<0,-6.5,0>,2 texture{Chrome_Metal} }
        scale .3 rotate 180*x };

        #declare Sparlampe = light_source{ 0 color White looks_like{Lampe} };

        #declare Sonne = union{
          sphere{ 0,1 pigment{rgbt 1} hollow
          interior{media{emission 1 density{spherical density_map{
            [0 Red] [.3 Orange] [.6 Yellow] [1 White]}}}
            media{absorption .4}} }
          light_source{ 0 color Yellow} };

        //--------------------- Ambiente -----------------------------

        #declare Bodennebel1 = fog {fog_type 2 distance 2 color rgb<.3,.5,.2> 
          fog_offset 1.6 fog_alt 0.7 turbulence <.5,1,.2> turb_depth .6 };

        #declare Wolken1 = plane{ y,30 pigment{ bozo
          turbulence 0.65 octaves 6 omega 0.7 lambda 2
          color_map{
            [0.0 0.1 color rgb .75 color rgb .65]
            [0.1 0.5 color rgb .65 color rgbt .55]
            [0.5 1.0 color rgbt .55 color rgbt 1]}
          scale <8, 12, 6>} finish{ambient .5} hollow };

        //--------------------- Holzspielzeug ------------------------

        #declare Burg = union{
          box{ 0,<2,4,2> pigment{Green} translate -3.2*x }
          box{ 0,<2,4,2> pigment{Yellow} translate 2.9*x }
          box{ 0,<2,4,2> pigment{Red} scale<1,1.8,0.4> 
            rotate<90,90,0> translate<-3,5,1.8> }
          cylinder{ 0,<0,3,0>,1 pigment{Blue} translate<1,4.8,1> }
          cone{ 0,1.5 <0,2,0>,1e-4 pigment{Red} translate<1,7.8,1> } };

        #declare Wheel = sphere { <0,.4,0>, 1 scale <1.2,1.2,.2>
          pigment {Red} finish{Shiny} };

        #declare Puffer = union {
          cylinder{ 0,<-.4,0,0>,.2 }
          cylinder{ <-.4,0,0>,<-.5,0,0>,.5 pigment{Red} } };

        #declare Kupplung = union {
          intersection {
          isosurface { function {.02*pow(z,4)+.02*pow(x,4)+y}
          contained_by {box{-3,3}} threshold -1 max_gradient 18 max_trace 4
          texture{Chrome_Metal} translate 3.7*y }
          cylinder{ <0,0,0>,<0,5,0>,2.6 } }
          difference {
          cylinder{ <0,0,0>,<0,2.2,0>,2.8 }
          cylinder{ <0,-.1,0>,<0,2.3,0>,2.2 }
        pigment{Blue} } scale .25 rotate <0,0,-90> };

        #declare Chassis_Lok = union {
          box { <-5.5,.3,-2.25>, <5.5,.8,2.25> }
          object{Wheel translate <-3.8,0,2.4>}
          object{Wheel translate <3.8,0,2.4>}
          object{Wheel translate <0,0,2.4>}
          object{Wheel translate <0,0,-2.4>}
          object{Wheel translate <-3.8,0,-2.4>}
          object{Wheel translate <3.8,0,-2.4>}
          object{Puffer translate <-5.5,.5,1.6>}
          object{Puffer translate <-5.5,.5,-1.6>} };

        #declare Kessel = difference {
          intersection {
          cylinder{ <-5.6,2,0>,<1.5,2,0>,2.3 }
          sphere{ <1.4,2,0>,7 } }
          box{ <-5.6,-1,-2.4>,<1.1,.79,2.4> } };

        #declare Vorderbau = union {
          object{Kessel}
          difference {
          cone{ <-4.2,4,0>,.5, <-4.2,7,0>,.7 }
          cylinder{ <-4.2,4,0>,<-4.2,7.2,0>,.4 } }
          cylinder{ <-1.2,4,0>, <-1.2,4.8,0>,1 }
          sphere{ <-1.2,4.8,0>,1} };

        #declare Roof = difference {
          cylinder{ <0,0,0>, <9,0,0>, 2.4 }
          box{ <-0.1,-0.1,-2.5>, <9.1,-2.5,2.5> } };

        #declare Housing = union {
          difference {
          box{ <1.5,.79,-2.25>,<5,6,2.25> }
          box{ <1.8,1,-2>,<4.8,5.8,2> }
          box{ <2.6,3.8,-2.5>,<4,5.1,2.5> }
          cylinder{ <1.4,4.8,1.3>,<2,4.8,1.3>,.65 }
          cylinder{ <1.4,4.8,-1.3>,<2,4.8,-1.3>,.65 } }
          object{Roof scale <.48,.6,1> translate <1.1,5.8,0>
          pigment{Blue} finish{Shiny}} };

        #declare Tender = difference {
          prism { linear_sweep linear_spline 0.5, 4.8, 5
          <0,0>, <.5,0>, <1.6,3.2>, <0,3.2>, <0,0> }
          prism { linear_sweep linear_spline 0.7, 4.6, 5
          <0,0>, <.3,0>, <1.4,3.3>, <0,3.3>, <0,0> } rotate <-90,0,0> };

        #declare Dampflok = union {
          object{Chassis_Lok texture{DMFWood2}}
          object{Vorderbau pigment{Gray60} finish{Shiny}}
          object{Housing pigment{rgb<1,.7,.01>} finish{Shiny}}
          object{Tender pigment{rgb<1,.6,.1>} translate <5,.8,2.65> }
          object{Kupplung translate <5.6,.8,0>} };

        #declare Long_Side = difference {
          box{ <0,0,0>, <8,3.5,0.5> }
          box{ <3.2,1.5,-.2>, <4.7,3,.6> }
          box{ <1,1.5,-.2>, <2.5,3,.6> }
          box{ <5.4,1.5,-.2>, <6.9,3,.6> } };

        #declare Short_Side = box{ <0.0.0>, <0.5,3.5,3.5> }
        #declare Roof = difference {
          cylinder{ <0,0,0>, <9,0,0>, 2.4 }
          box{ <-0.1,-0.1,-2.5>, <9.1,-2.5,2.5> } };

        #declare Chassis_Wagen1 = union {
          object{box { <-4,0.3,-2.25>, <4,0.8,2.25> }}
          object{Wheel translate <-2.6,0,2.4>}
          object{Wheel translate <2.6,0,2.4>}
          object{Wheel translate <-2.6,0,-2.4>}
          object{Wheel translate <2.6,0,-2.4>} };

        #declare Body = union {
          object{Long_Side translate <-4,0.8,-2.25>}
          object{Long_Side translate <-4,0.8,1.75>}
          object{Short_Side translate <-4,0.8,-1.75>}
          object{Short_Side translate <3.5,0.8,-1.75>} };

        #declare Wagen1 = union {
          object{Chassis_Wagen1 texture{DMFWood2}}
          object{Body}
          object{Roof translate <-4.5,4.3,0> pigment{Blue} finish{Shiny}}
          object{Kupplung rotate <0,180,0> translate <-4.1,.8,0>}
          object{Kupplung translate <4.1,.8,0>} };

        #declare Holzzug = union {
          object{Dampflok translate <-8,0,15>}
          object{Wagen1 rotate <0,10,0> translate <3.1,-.02,14.5>
            pigment{rgb<.5,.8,.3>} finish{Shiny}}
          object{Wagen1 rotate <0,20,0> translate <12.35,-.02,12>}
            pigment{rgb<.5,.9,.2>} finish{Shiny}};

        //-------------------- Kunst ----------------------------------

        #declare Glasperle = union{
          box{ <-1.25,0,-1.5>,<1.25,2,1> pigment{Red} finish{Shiny} }
          cylinder{ <0,2,-.25>,<0,4,-.25>,.6 texture{White_Marble scale .6} }
          sphere{ <0,5.9,-.25>,2 pigment{gradient y color_map{
            [0 color Red filter .7] [.15 color Orange transmit .7]
            [.3 color Yellow filter .7] [.45 color Green transmit .7]
            [.6 color Cyan filter .7] [.75 color Blue transmit .7]
            [.9 color Violet filter .7] [1 color Black transmit .7]
            } warp{turbulence .6 octaves 5 omega 1.2 lambda 1.2}}
            finish{Glossy} } };

        #declare HerzBallon = merge{
          sphere_sweep{ linear_spline 5
            <-1.8,1,0>,1, <-1.5,.5,0>,1, <-1,0,0>,1, <-.5,.5,0>,1, <-.2,1,0>,1
            tolerance 1.2e-4 pigment{rgbf<1,0,0,.6>} finish{Shiny}
            scale <1,1,.3> translate<3,6,3> }
          sphere_sweep{ b_spline 7
            <0,-2,0>,.2, <1,0,-.4>,.2, <-.6,1.5,.8>,.2, <.8,3,.2>,.2,
            <0,4.5,-.6>,.2, <-.8,6,0>,.2, <0,7,0>,.2 tolerance 1.2e-4
            pigment{Blue} scale <.16,0.6,.16> translate<2,1.5,3> } };
        

Wichtig ist dabei, dass nicht nur Definitionen von Gegenständen möglich sind, sondern auch Lichtquellen und Nebel in unserem Content Pack stecken. Der wirkliche Gewinn bei der Aktion ist jedoch die Übersichtlichkeit, die unser Bild gewinnt. Denn die vielen Zeilen der Definitionen sind nun ausgelagert. Außerdem ergibt sich dadurch die Möglichkeit auf einfachem Wege seine schönsten Gegenstände immer wieder in Bildern einzusetzen, ohne dabei den ganzen Text kopieren zu müssen. Tatsächlich ist man dabei nicht nur auf eigene Kreationen beschränkt, sondern es gibt sogar kommerzielle Content Packs, die zum Teil sehr viel Geld kosten. Um diese wollen wir uns hier aber nicht kümmern, sondern viel mehr unsere "Highlights" in ein Bild packen.

Beispiel: Die schönsten Motive

Mit unseren gerade erstellen Content-Pack gestaltet sich das erstellen der geplanten Szene sehr übersichtlich. Dabei werden wir alle Highlights aus diesem Tutorial in ein Bild packen.

        #version 3.6;
        #include "colors.inc"
        #include "textures.inc"
        #include "Tutorial.inc"  //Pfad zu Tutorial.inc, hier liegt die Datei im selben Verzeichnis

        camera{location <0,10,-15> look_at <0,9,0>}
        light_source{Sparlampe rotate -72*y translate<-5,16,4>}
        light_source{Sparlampe rotate 72*y translate<5,16,4>}
        sky_sphere{ pigment{gradient y
          color_map{[0 color Black] [.5 color Navy]} scale 2} }
        fog{Bodennebel1}
        plane{y,0 pigment{checker Blue White}}

        object{Sonne scale <5,4.5,3> translate<-40,34,60>}
        object{Wolken1}
        object{HerzBallon translate<5,3,8>}
        object{HerzBallon translate<-5,3,8>}
        object{Burg scale .8 translate<5,0,4>}
        object{Holzzug translate<2,1,12>}
        object{Glasperle translate<-6,0,6>}
        

In diesen paar Zeilen ist jetzt also das geballte Wissen dieses Tutorials, was ein durchaus nettes Bild ergibt. So lehnt euch zurück und genießt die Szene, denn sie bringt zum Ausdruck was wir in letzter Zeit alles gelernt haben!

Alle Objekte aus dem POV-Ray Tutorial vereint