Informatik
  Einführung in POV-Ray für Informatik

POV-Ray – Persistence of Vision Ray Tracer
(eine durch Verfolgung von Lichtstrahlen beständige Sicht auf ein Objekt)

1 Die POV-Ray-Welt
2 Einfache Objekte
3 Veränderung von Objekten
3.1 Verschiebungen
3.2 Drehungen
3.3 Vergrößerungen und Verkleinerungen (Skalieren)
3.4 Oberflächengestaltung
3.4.1 Farbgebung
3.4.2 Musterung
3.4.2.1 Karomuster
3.4.2.2 Sechseckmuster
3.4.2.3 Andere Mehrfarbmuster
3.4.2.4 Oberflächengestaltung mit Bildern
3.4.3 Lichtreflexion
3.4.4 Texturen
3.5 Hintergrundfarben
4 Beleuchtung von Szenen
5 Betrachtung von Szenen
6 Allgemeiner Aufbau eines POV-Ray-Scripts
6.1 Einbeziehung von Dateien
6.2 Darstellung von Objekten
6.3 Erzeugen der Beleuchtung
6.4 Positionierung der Kamera
6.5 Festlegung der Hintergrundfarbe
6.6 Aufrufen zusammengefasster Gesamtobjekte
6.7 Beispiel eines POV-Ray-Scripts
7 Wiederholungen mit while-Schleifen
8 Übungsaufgaben

 

1 Die POV-Ray-Welt

POV-Ray unterscheidet sich von üblichen Grafikprogrammen darin, dass hier Bilder in ihrer Entstehung berechnet werden. Grundlage dieser Berechnungen bildet eine Textdatei, in der Informationen über Objekte einschließlich ihrer Parameter (Vektoren, Formen, Farben, Texturen und Lichtquellen) definiert sind. Diese Informationen sind in Form einer von POV-Ray interpretierbaren Scriptsprache formuliert. POV-Ray simuliert mathematisch den Verlauf der Lichtstrahlen in einer „Szene“, um ein phantastisches, dreidimensionales fotorealistisches Bild zu erzeugen. Die entstandenen Bilder können in nahezu jedem gängigen Grafikformat gespeichert werden und sind somit auch betriebssystemunabhängig.

Grundsätzlich wichtig zum Verständnis der Scriptsprache ist ein dreidimensionales Koordinatensystem. Es enthält zusätzlich zum üblichen xy-Koordinatensystem eine dritte Achse (z-Achse), die in die Tiefe zeigt.

Die Pfeile geben die positive Koordinatenrichtung an. Der Schnittpunkt der drei Achsen ist der Nullpunkt <0, 0, 0> (auch Ursprung genannt) des Koordinatensystems. Jeden Punkt kann man durch die Angabe von drei Werten – von eckigen Klammern eingeschlossen – beschreiben, wobei die Reihenfolge x-Wert, y-Wert, z-Wert beachtet werden muss.

Beispiele:

1. Ein Punkt, der 2 Einheiten rechts, 5 Einheiten oben und 3 Einheiten hinten liegt:
<2, 5, 3>
2. Ein Punkt, der 10 Einheiten unten, 4 Einheiten hinten und 8 Einheiten rechts liegt:
<8, -10, 4>
3. Ein Punkt, der 2 Einheiten vorn und 12 Einheiten links liegt:
<-12, 0, -2>
4. Ein Punkt, der 2 Einheiten vorn und 12 Einheiten links liegt:
<0, -5, 7>
5. Ein Punkt, der 6 Einheiten nach vorn vom Ursprung entfernt liegt:
<0, 0, -6>
6. Ein Punkt, der 2 Einheiten links, 3 Einheiten oben und 4 Einheiten hinten liegt:
<-2, 3, 4>
7. Ein Punkt, der im Ursrung liegt:
<0, 0, 0>
8. Ein Punkt, der 1 Einheit links, 1 Einheit unten und 1 Einheit hinten liegt:
<-1, -1, -1>
9. Ein Punkt, der 5 Einheiten rechts und 4 Einheiten vorn liegt:
<5, 0, -4>
10. Ein Punkt, der 3 Einheiten rechts, 7 Einheiten unten liegt:
<3, -7, 0>

 

2 Einfache Objekte

Quader
 box
 {
 <-2, -4, -2> <2, 4, 2>
 pigment {color Orange}
 }
 

Zwei Punkte geben zwei diagonal gegenüberliegende Ecken des Quaders an.

Zylinder
 cylinder
 {
 <0, 3, 0> <0, -3, 0> 2.5
 pigment {color Yellow}
 }
 

Zwei Punkte geben die Mittelpunkte der beiden „Deckel“ des Zylinders an, die Zahl ist der Radius der beiden „Deckel“.

Kugel
 sphere
 {
 <0, 0, 0> 3.8
 pigment {color Blue}
 }
 

Der Punkt gibt den Mittelpunkt der Kugel an, die Zahl den Radius.

Kegel
 cone
 {
 <0, 2.5, 0> 0
 <0, -2.5, 0> 2.7
 pigment {color Red}
 }
 

Der Kegel entspricht fast dem Zylinder. Der erste Punkt gibt den Mittelpunkt, die erste Zahl den Radius des oberen „Deckels“ an. Bei einem Kegel ist der Radius 0, beim Kegelstumpf größer 0. Der zweite Punkt gibt den Mittelpunkt, die zweite Zahl den Radius des unteren „Deckels“ an.

Ring
 torus
 {
 3.7  1.2
 pigment {color Green}
 }
 

Der Ring liegt zunächst immer um den Ursprung <0, 0, 0> in der xz-Ebene. Die erste Zahl ist der Radius des Kreises im Innern des Rings, die zweite ist der Radius des „Schlauches“.

Scheibe
 disc
 {
 <0, 0, 0> <0, 1, 0>
 2  0.4
 pigment {color Flesh}
 }
 

Als erstes wird der Mittelpunkt der Scheibe angegeben. Der zweite Punkt erzeugt einen vom Mittelpunkt ausgehenden virtuellen Pfeil (Vektor), der senkrecht auf der Scheibe steht und somit die Achsenlage der Scheibe bestimmt. Die erste Zahl legt den Gesamtradius, die zweite Zahl einen Lochradius (wenn gewünscht!) fest.

Ebene
 plane
 {
 <0, -1, 0> 0
 pigment {color Brown}
 }
 

Ein vom angegebenen Punkt zum Ursprung zeigender virtueller Pfeil (Vektor) steht senkrecht auf der Ebene, womit die Achsenlage der Ebene bestimmt wird. Die nachfolgende Zahl gibt den Abstand zum Ursprung an (Höhe). Hier wird also eine Ebene erzeugt, die in xz-Richtung liegt und direkt durch den Ursprung verläuft.

Text
 text
 {
 ttf "timrom.ttf"
 "Text"
 1.2  0
 pigment {color Plum}
 }
 

„ttf“ leitet die Schriftartdefinition ein. In der nächsten Zeile steht der darzustellende Text. Die erste Zahl bestimmt die Dicke der Buchstaben, die zweite Zahl gibt den Abstand der Buchstaben zueinander an. Der Text verläuft zunächst immer vom Ursprung (Beginn links unten) in xy-Richtung. Verwendbare Schriftarten: timrom.ttf, umbrella.ttf, cooper.ttf, galleria.ttf, goudy.ttf, crillee.ttf.

Beispiele:

11. Quader: 2 hoch (stehend), 1 breit, 1.4 tief, Mittelpunkt im Ursprung, rot:
box {<-0.5, -1, -0.7> <0.5, 1, 0.7> pigment {color Red}}
12. Würfel: Kantenlänge 2, Mittelpunkt im Ursprung, gelb:
box {<-1, -1, -1> <1, 1, 1> pigment {color Yellow}}
13. Zylinder: 6.4 hoch (stehend) , Durchmesser 4, Mittelpunkt im Ursprung, blau:
cylinder {<0, 3.2, 0> <0, -3.2, 0> 2 pigment {color Blue}}
14. Zylinder: 5 hoch (liegend), Durchmesser 5, Mittelpunkt im Ursprung, grün:
cylinder {<-2.5, 0, 0> <2.5, 0, 0> 2.5 pigment {color Green}}
15. Kugel: Durchmesser 7, Mittelpunkt im Ursprung, weiß:
sphere {<0, 0, 0> 3.5 pigment {color White}}
16. Kugel: Durchmesser 4, Mittelpunkt 2 vorn, 3 rechts, 5 unten, rot:
sphere {<3, -5, -2> 2 pigment {color Red}}
17. Kegel: 5 hoch (stehend) spitz, Durchmesser 3, Mittelpunkt des unteren „Deckels“ im Ursprung, rot:
cone {<0, 5, 0> 0 <0, 0, 0> 1.5 pigment {color Red}}
18. Kegel: 10 hoch (liegend) stumpf, Durchmesser oben 1, Durchmesser unten 2, Mittelpunkt des oberen „Deckels“ im Ursprung, grün:
cone {<0, 0, 0> 0.5 <-10, 0, 0> 1 pigment {color Green}}
19. Ring: Innenradius 7, Schlauchradius 1.4 (liegend), gelb:
torus {7  1.4 pigment {color Yellow}}
20. Ring liegt auf gelber Ebene: Innenradius 4.3, Schlauchradius 2.6 (liegend), blau:
torus {4.3  2.6 pigment {color Blue}}
plane {<0, -1, 0> 2.6 pigment {color Yellow}}

 

3 Veränderung von Objekten

Der Einfachheit halber sollten Objekte zunächst im Ursprung erzeugt und anschließend durch Verschiebungen, Drehungen, Verkleinerungen oder Vergrößerungen verändert werden.

 

3.1 Verschiebungen

Objekte werden durch den Befehl translate verschoben, in dem man durch einen sogenannten Vektor angibt, um wie viel Einheiten es entlang der x-Achse, y-Achse und z-Achse zu verschieben ist. Der allgemeine Befehl dazu lautet:

 
  translate <x, y, z>

Will man nur in die Richtung einer Achse verschieben, so lautet der Befehl:

 
  translate achse * wert

Beispiele:

21. Das Objekt aus Beispiel 11 soll um 2 Einheiten nach unten, 3 Einheiten nach links und 4 Einheiten nach hinten verschoben werden:
box {<-0.5, -1, -0.7> <0.5, 1, 0.7> pigment {color Red} translate <-3, -2, 4>}
22. Das Objekt aus Beispiel 12 soll um 1.5 Einheiten nach oben, 1.8 Einheiten nach rechts und 2.2 Einheiten nach vorn verschoben werden:
box {<-1, -1, -1> <1, 1, 1> pigment {color Yellow} translate <1.8, 1.5, -2.2>}
23. Das Objekt aus Beispiel 15 soll um 0.8 Einheiten nach hinten und 4 Einheiten nach links verschoben werden:
sphere {<0, 0, 0> 3.5 pigment {color White} translate <0, 0, 0.8>}
24. Das Objekt aus Beispiel 18 soll um 4.2 Einheiten nach rechts verschoben werden:
cone {<0, 0, 0> 0.5 <-10, 0, 0> 1 pigment {color Red} translate x * 4.2}

 

3.2 Drehungen

Objekte werden durch den Befehl rotate gedreht, in dem man den Drehwinkel um die x-Achse, y-Achse und z-Achse angibt. Soll das Objekt um seinen eigenen Mittelpunkt rotieren, so muss es sich im Ursprung befinden. Natürlich kann der Befehl auch dazu benutzt werden, ein Objekt auf einer Kreisbahn zu bewegen, wenn es sich außerhalb des Ursprungs befindet. Der Drehwinkel kann positiv (gegen den Uhrzeigersinn) oder negativ (im Uhrzeigersinn) sein. Der allgemeine Befehl dazu lautet:

 
  rotate <winkelx, winkely, winkelz>

Will man nur um eine Achse drehen, so lautet der Befehl:

 
  rotate achse * winkel

Beispiele:

25. Das Objekt aus Beispiel 12 soll um 45 Grad um die y-Achse, 10 Grad um die x-Achse und 60 Grad um die z-Achse gedreht werden:
box {<-1, -1, -1> <1, 1, 1> pigment {color Yellow} rotate <10, 45, 60>}
26. Das Objekt aus Beispiel 14 soll um 30 Grad um die z-Achse und 30 Grad um die x-Achse gedreht werden:
cylinder {<-2.5, 0, 0> <2.5, 0, 0> 2.5 pigment {color Green} rotate <0, 30, 30>}
27. Das Objekt aus Beispiel 18 soll um 45 Grad um die z-Achse gedreht werden:
cone {<0, 0, 0> 0.5 <-10, 0, 0> 1 pigment {color Green} rotate z * 45}

 

3.3 Vergrößerungen und Verkleinerungen (Skalieren)

Objekte werden durch den Befehl scale vergrößert oder verkleinert, in dem man durch einen Vektor angibt, um welchen Faktor das Objekt in Richtung x-Achse, y-Achse und z-Achse zu skalieren ist. Das zu skalierende Objekt sollte sich im Ursprung befinden, da sonst auch der Abstand zum Ursprung mitskaliert wird. Der allgemeine Befehl dazu lautet:

  scale <faktorx, faktory, faktorz>

Will man nur um eine Achse skalieren, so lautet der Befehl:

  scale achse * faktor

Will man auf allen Achsen gleichmäßig skalieren, lautet der Befehl:

  scale faktor

Wenn eine Angabe faktor für eine Achse kleiner als 1 ist, dann wird verkleinert. Wenn eine Angabe für eine Achse größer als 1 ist, dann wird vergrößert.

Beispiele:

28. Das Objekt aus Beispiel 11 soll doppelt so hoch und dreimal so breit werden:
box {<-0.5, -1, -0.7> <0.5, 1, 0.7> pigment {color Red} scale <3, 2, 0>}
29. Das Objekt aus Beispiel 13 soll im Durchmesser halbiert werden:
cylinder {<0, 3.2, 0> <0, -3.2, 0> 2 pigment {color Blue} scale <0.5, 0, 0>}
30. Das Objekt aus Beispiel 19 soll in der Gesamtgröße vervierfacht werden:
torus {7  1.4 pigment {color Yellow} scale 4}

 

3.4 Oberflächengestaltung

3.4.1 Farbgebung

Mit pigment wird die Farbe und die Farbverteilung eines Objekts angegeben. Der allgemeine Befehl dazu lautet:

 
  pigment {color farbname}

Farbnamen können sein:

 DimGray  Black  Tristle  Sienna  PaleGreen
 DimGrey  Clear  Very_Light_Purple    DarkWood  Aquamarine
 Gray  White  Plum  Brown  LimeGreen
 Grey  Silver  Pink  Firebrick  MediumAquamarine
 LightGray  Quartz  Orchid  DustyRose  ForestGreen
 LightGrey  Turquoise  Magenta  Maroon  MediumForestGreen
 VLightGray    LightBlue  SpicyPink  Scarlet  SeaGreen
 VLightGrey  Cyan  NeonPink  SemiSweetChoc  DarkOliveGreen
 Gray05  MediumTurquoise    MediumVioletRed  Salmon  DarkSlateGrey
 Gray10  DarkTurquoise  VioletRed  BakersChoc  Mica
 Gray15  SummerSky  Light_Purple  VeryDarkBrown  MediumSeaGreen
 Gray20  SkyBlue  Med_Purple  DarkBrown  DarkSlateGray
 Gray25  CadetBlue  BlueViolet  MediumGoldenrod  DarkGreen
 Gray30  LightSteelBlue  MediumOrchid  Yellow  GreenCopper
 Gray35  SteelBlue  DarkOrchid  Goldenrod  DkGreenCopper
 Gray40  Blue  DarkPurple  BrightGold  HuntersGreen
 Gray45  SlateBlue  Violet  Brass  Orange
 Gray50  NeonBlue  IndianRed  OldGold  OrangeRed
 Gray55  MediumSlateBlue  Wheat  Bronze  CoolCopper
 Gray60  MediumBlue  LightWood  Bronze2  MandarinOrange
 Gray65  NewMidnightBlue  Flesh  Gold  Red
 Gray70  DarkSlateBlue  NewTan  Khaki  Coral
 Gray75  RichBlue  Feldspar  SpringGreen    
 Gray80  Navy  Tan  Green    
 Gray85  NavyBlue  Copper  MediumSpringGreen      
 Gray90  MidnightBlue  MediumWood  YellowGreen    
 Gray95  CornflowerBlue  DarkTan  GreenYellow    

Da es insgesamt ca. 16 Millionen Farbabstufungen gibt, kann nicht jede Farbe einen Namen haben. So kann jede beliebige Farbe auch aus den drei Farben rot, grün und blau dargestellt werden. Der Befehl dazu lautet:

 
  pigment {color rgb <r, g, b>}

wobei r, g und b Werte zwischen 0 (nicht) und 1 (voll) annehmen kann. Bei Angabe eines vierte Parameters f (Filter) kann die Transparenzstärke eingestellt werden. Der Befehl dazu lautet:

 
  pigment {color rgbf <r, g, b, f>}

wobei f Werte zwischen 0 (völlig undurchsichtig) und 1 (völlig durchsichtig) annehmen kann.

 
3.4.2 Musterung
 
3.4.2.1 Karomuster

Mit checker wird ein räumliches Karomuster erzeugt. Dazu sind zwei Farbangaben notwendig. Der allgemeine Befehl dazu lautet:

 
  pigment {checker color rgb <r, g, b> color rgb <r, g, b>} oder
pigment {checker color farbname color farbname}

 
3.4.2.2 Sechseckmuster

Mit hexagon werden regelmäßige Sechsecke erzeugt. Dazu sind drei Farbangaben notwendig. Der allgemeine Befehl dazu lautet:

 
  pigment {hexagon color rgb <r, g, b> color rgb <r, g, b> color rgb <r, g, b>} oder
pigment {hexagon color farbname color farbname color farbname}

 
3.4.2.3 Andere Mehrfarbmuster

Soll ein Objekt mit mehrere Farben versehen werden, kann auch color_map (Farbbereich von 0.0 bis 1.0) zur Anwendung kommen. Dazu ist ein Schlüsselwort für den Farbverlauf bzw. das Muster anzugeben. Schlüsselwörter können sein:

gradient achse Regenbogenähnlicher Farbverlauf, angeordnet entlang der angegebenen Achse.
marble Regenbogenähnlicher Farbverlauf, angeordnet entlang der x-Achse, bei zweimaligem Durchlauf der Farbpalette.
wood Holzähnlicher Farbverlauf kreisförmig um die z-Achse.
onion Zwiebelähnlicher Farbverlauf kreisförmig um alle Raumachsen.
leopard Leopardähnliche Musterung.
granite Steinähnliche Musterung.
bozo Wolkenähnliche Musterung.

Der allgemeine Befehl dazu lautet:

pigment {mustername color_map {[farbwert1 color farbname]
                              [farbwert2 color farbname]
                              [...]
                             }
        }

Beispiel: Würfel mit der Größe 5 (Mittelpunkt im Ursprung) mit Leopardenmuster

box
{
<-5, -5, -5> <5, 5, 5>
pigment {leopard color_map {[0.0 color Yellow]
                            [0.5 color Brown]
                            [1.0 color Black]
                           }
        }
}

 
3.4.2.4 Oberflächengestaltung mit Bildern

Mit image_map kann ein Bild auf die Objektoberfläche projeziert werden. Der allgemeine Befehl dazu lautet:

 
  pigment {image_map {grafikdateiformat "bilddateipfad" map_type wert}}

wobei für grafikdateiformat gif, tga, iff, png oder sys, für bilddateipfad der vollständige bzw. relative Pfad (wenn sich die Grafik nicht im aktuellen Verzeichnis befindet) einschl. Dateiname der Grafikdatei und für wert 0, 1, 2 oder 5 (Anordnung des Bildes auf der Oberfläche) eingesetzt werden kann.

Beispiel: Zylinder, 2 hoch bzw. lang (liegend), Radius 1, Oberfläche mit Rosen

cylinder
{
<-1, 0, 0> <1, 0, 0> 1
pigment {image_map {gif "rosen.gif" map_type 0}}
}

 
3.4.3 Lichtreflexion

Mit finish kann die Lichtreflexion beeinflusst werden. Dazu ist ein Schlüsselwort mit einem entsprechenden Wert anzugeben. Schlüsselwörter können sein:

phong wert Gibt an, wie stark die Oberfläche des Objekts glänzen soll.
diffuse wert Steuert die Reflexion von Licht, das direkt aus Lichtquellen kommt und das Objekt trifft.
ambient wert Steuert die Reflexion von Licht, das nicht aus Lichtquellen kommt – ist für „eigenes Leuchten“ zuständig.

Der allgemeine Befehl dazu lautet:

 
  finish {lichtreflexionsname wert}

wobei wert zwischen 0 (nicht) und 1 (voll) liegen kann.

Beispiel: Im Ursprung liegende Kugel mit dem Radius 1, rot glänzend

sphere
{
<0, 0, 0> 1
pigment  {color Red}
finish {phong 1}
}

 
3.4.4 Texturen

Eine Textur ist als eine Zusammenfassung mehrerer Oberflächeneigenschaften anzusehen. Mit texture können u. a. die in den Punkten 3.4.1 bis 3.4.3 angegebenen Oberflächengestaltungsmöglichkeiten gebündelt definiert und weitere speziellere Manipulierungen vorgenommen werden. Außerdem hat man die Möglichkeit, solch einer Zusammenfassung von Eigenschaften mit #declare einen Namen zu geben und mehreren Objekten zur Verfügung zu stellen, wie das z. B. in der Datei „textures.inc“ zu sehen ist. Wird diese Datei in ein POV-Ray-Script einbezogen, können u. a. folgende Texturen genutzt werden:

Jade EMBWood1 Bronze_Metal Lightening2
Red_Marble Yellow_Pine Copper_Texture Green_Glass
(Ruby_Glass,
Yellow_Glass)
Blood_Marble Rosewood Brushed_Aluminum Bright_Blue_Sky
Blue_Agate Sandalwood Brass_Valley Blue_Sky3
Sapphire_Agate DMFLightOak Rust Blood_Sky
Brown_Agate Cherry_Wood Cork Apocalypse
PinkAlabaster Pine_Wood Lightening1 Starfield

Beispiel: Im Ursprung liegende Kugel mit dem Radius 1, granitähnliches Aussehen

sphere
{
<0, 0, 0> 1
texture {Brown_Agate}
}

 

3.5 Hintergrundfarben

Mit background wird die Hintergrundfarbe festgelegt. Der allgemeine Befehl lautet:

 
  background {color farbname}

Farbnamen können dem Punkt 3.4.1 entnommen werden. Da es insgesamt ca. 16 Millionen Farbabstufungen gibt, ist es unmöglich, jeder Farbe einen Namen zu geben. So kann jede beliebige Farbe auch aus den drei Farben rot, grün und blau dargestellt werden. Der Befehl dazu lautet:

 
  background {color rgb <r, g, b>}

wobei r, g und b Werte zwischen 0 (nicht) und 1 (voll) annehmen kann.

 
4 Beleuchtung von Szenen

Die Gesamtheit von dargestellten Objekten – auch Szene genannt – ist erst sichtbar, wenn sie mit dem Befehl light_source beleuchtet wird. Dabei gibt man im einfachsten Fall den Ort und die Farbe der Lichtquelle, die in alle Richtungen strahlt, an. Allgemein lautet der Befehl:

 
  light_source {<x, y, z> color rgb <r, g, b>} oder
light_source {<x, y, z> color farbname}

Die Lichtintensität kann durch mehrfache Angabe dieses Befehls hintereinander erhöht werden, d. h., dass sich mehrere Lichtquellen an ein und derselben Stelle befinden. Außerdem ist auch eine Beleuchtung von mehreren Positionen möglich.

Beispiele:

31. Eine weiße Lichtquelle liegt auf der x-Achse 5 Einheiten vom Ursprung entfernt:
light_source {<5, 0, 0> color White}
32. Zwei grüne Lichtquellen liegen jeweils 10 Einheiten nach links, oben und vorn:
light_source {<-10, 10, -10> color Green}
light_source {<-10, 10, -10> color Green}
33. Ein beliebiges Objekt, was gleichmäßig von zwei Seiten weiß beleuchtet werden soll, liegt im Ursprung. Die erste Lichtquelle liegt 6 Einheiten nach oben, 2 Einheiten nach hinten und 4 Einheiten nach rechts. Die zweite Lichtquelle liegt „gegenüber“:
light_source {<4, 6, 2> color White}
light_source {<-4, -6, -2> color White}

 

5 Betrachtung von Szenen

Szenen können trotz Beleuchtung erst gesehen werden, wenn es einen „Betrachter“ gibt. Diese Aufgabe übernimmt eine „Kamera“ mit dem Befehl camera. Dabei muss der Ort der Kamera und der Punkt auf dem sie gerichtet ist angegeben werden. Der allgemeine Befehl lautet:

 
  camera {location <positionx, positiony, positionz> look_at <szenex, szeney, szenez>}

Je näher die Kamera zur Szene positioniert wird, um so größer erscheint auch die Szene. Wird die Kamera weiter entfernt, erscheint die Szene kleiner. Mehrere Kameras verwenden zu wollen ist sinnlos, da immer nur ein Bild dargestellt werden kann und das ist immer das durch die im Quelltext an letzter Stelle stehende Kameradefinition erzeugte Bild.

Beispiele:

34. Eine Kamera soll auf den Ursprung gerichtet und 5 Einheiten nach oben positioniert sein:
camera {location <0, 5, 0> look_at <0, 0, 0>}
35. Eine Kamera soll auf den Ursprung gerichtet und 3 Einheiten nach unten, 2 Einheiten nach links und 4 Einheiten nach vorn positioniert sein:
camera {location <-2, -4, -3> look_at <0, 0, 0>}
36. Eine Kamera soll auf den Ursprung gerichtet und 10 Einheiten nach hinten, 15 Einheiten nach links und 20 Einheiten nach oben positioniert sein:
camera {location <-15, 20, 10> look_at <0, 0, 0>}

 

6 Allgemeiner Aufbau eines POV-Ray-Scripts

 
6.1 Einbeziehung von Dateien

Im ersten Teil eines POV-Ray-Scripts werden zunächst mit #include Dateien ins Programm mit einbezogen, in denen Objekte, Objekteigenschaften und Farben definiert sind. Im Allgemeinen sind das folgende Zeilen:

#include "shapes.inc"
#include "colors.inc"
#include "textures.inc"

 

6.2 Darstellung von Objekten

Im zweiten Teil eines POV-Ray-Scripts erfolgt die Objektdefinition wie im Punkt 2. beschrieben. Da eine Szene in den meisten POV-Ray-Scripts aus mehr als einem Objekt besteht, kann man auch eine Szene als ein gesamtes Objekt zusammenfassen. Das Schlüsselwort #declare leitet solch eine Objektkonstruktion ein. Dahinter schreibt man alle Befehle, die für die Erzeugung der Szene benötigt werden. Außerdem müssen Schlüsselwörter, die die Art und Weise der Darstellung von ineinanderliegenden bzw. sich überschneidenen Objekten beeinflussen, verwendet werden. Diese können sein:

union Einfache Vereinigung aller Objekte.
difference Vom ersten angegebenen Objekt werden alle nachfolgend aufgeführten Objekte „abgezogen“ (besonders für Aushöhlungen).
intersection Bezeichnet nur den Teil des Raumes, der von allen beteiligten Objekten belegt wird.

Beispiel: Ein liegender Quader hat am „Ende“ eine Kugel (ähnlich einem Streichholz)

#declare streichholz = union
{
box
  {
  <-3, -0.25, -0.25><3, 0.25, 0.25>
  pigment {color Yellow}
  }
sphere
  {
  <-2.5, 0, 0> 0.7
  pigment {color Red}
  }
}

In der letzten Zeile des Scripts muss dann das Objekt mit object aufgerufen werden.

Beispiel:

object {streichholz}

 

6.3 Erzeugen der Beleuchtung

Im dritten Teil eines POV-Ray-Scripts wird die Lichtquelle bzw. werden die Lichtquellen, wie im Punkt 4. beschrieben, definiert.

 

6.4 Positionierung der Kamera

Im vierten Teil eines POV-Ray-Scripts wird die Kamera, wie im Punkt 5. beschrieben, positioniert und ausgerichtet.

 

6.5 Festlegung der Hintergrundfarbe

Im fünften Teil eines POV-Ray-Scripts kann eine Hintergrundfarbe festgelegt werden. Diesen Punkt kann man auch weglassen, dann bleibt der Hintergrund automatisch schwarz. Häufig ist die Einbeziehung einer Ebene sehr hilfreich, da sie ja die weite Palette der Möglichkeiten der Oberflächen- und somit auch der Hintergrundgestaltung bietet.

 

6.6 Aufrufen zusammengefasster Gesamtobjekte

Im sechsten Teil eines POV-Ray-Scripts werden definierte Gesamtobjekte, wie im Punkt 6.2 beschrieben, aufgerufen.

 

6.7 Beispiel eines POV-Ray-Scripts

 
#include "colors.inc"
#include "textures.inc"
#include "shapes.inc"


#declare morgenstern = union
{
sphere /*Kugel*/
  {
  <0, 0, 0> 2
  }
cone  /*Spitze oben*/
  {
  <0, 3, 0> 0 <0, 0, 0> 1
  }
cone  /*Spitze vorn*/
  {
  <0, 3, 0> 0 <0, 0, 0> 1
  rotate x * 270
  }
cone  /*Spitze unten*/
  {
  <0, 3, 0> 0 <0, 0, 0> 1
  rotate x * 180
  }
cone  /*Spitze links*/
  {
  <0, 3, 0> 0 <0, 0, 0> 1
  rotate z * 90
  }
cone  /*Spitze rechts*/
  {
  <0, 3, 0> 0 <0, 0, 0> 1
  rotate z * -90
  }
cone  /*Spitze mitte oben links*/
  {
  <0, 3, 0> 0 <0, 0, 0> 1
  rotate x * -45
  rotate z * 45
  }
cone  /*Spitze mitte oben rechts*/
  {
  <0, 3, 0> 0 <0, 0, 0> 1
  rotate x * -45
  rotate z * -45
  }
cone  /*Spitze mitte unten links*/
  {
  <0, 3, 0> 0 <0, 0, 0> 1
  rotate x * -135
  rotate z * -45
  }
cylinder  /*Griff bzw. Stiel*/
  {
  <0, 0, 0> <7, 0, 0> 0.3
  rotate y * 45
  rotate z * -45
  }
}


light_source
{
<5, 2, -8>
color White
}


light_source
{
<-5, 2, -8>
color White
}


camera
{
location <0, 0, -10>
look_at  <0, 0, 0>
}


background {color White}


object {morgenstern texture {Copper_Texture}}

 

7 Wiederholungen mit while-Schleifen

Häufig sollen Objekte erzeugt werden, die aus mehreren gleichartigen Teilobjekten zusammengesetzt sind. Definiert man dann jedes Objekt einzeln, kann es schnell viel und unübersichtlichen Quellcode geben. Abhilfe kann hierbei eine while-Schleife leisten, die es ermöglicht, ein einmalig definiertes Objekt mehrfach darzustellen. Dabei muss jedoch darauf geachtet werden, dass die Objekte nicht alle an derselben Position entstehen, sondern mit Einsatz einer deklarierten Variablen nacheinander zu platzieren sind. Innerhalb einer Schleife lassen sich auch mehrere Variablen einbinden, die für die Änderung unterschiedlicher Objekteigenschaften sorgen können. Die Erzeugung und Veränderung von Variablen setzt immer die Verwendung des reservierten Wortes #declare und der Beginn der Schleife das reservierte Wort #while voraus.

#declare anfangx = 1; => legt Anfangskoordinate für x fest
#declare endex = 10; => legt Endekoordinate für x fest
#while (anfangx <= endex) => solange Anfangskoordinate für x kleiner oder
gleich der Endekoordninate für x ist
... zu deklarierendes Objekt mit
sich ändernder Variablen anfangx ...
=> erzeuge deklariertes Objekt unter Verwendung
der Variablen anfangx
#declare anfangx = anfangx + 1; => verändere bzw. erhöhe die Variable anfangx um 1
#end => Ende der Wiederholung

Beispiel 1: Steckzylinder auf einem Legobaustein mit einer while-Schleife erzeugt
 
#include "colors.inc"
#include "textures.inc"
#include "shapes.inc"


#declare lego = union
{
box
  {
  <-8, -1, -1> <8, 1, 1>
  }
#declare kx = -7;
#while (kx < 8)
  cylinder
    {
    <kx, 0.9, 0> <kx, 1.5, 0> 0.5
    }
  #declare kx = kx + 2;
#end
}


light_source
{
<10, 12, -8>
color White
}


light_source
{
<-10, 12, -8>
color White
}


camera
{
location <10, 10, -8>
look_at  <2, 0, 0>
}


background {color White}


object {lego pigment {color Red} finish {phong 1}}

Beispiel 2: Pyramide, bestehend aus mehreren (flachen Quadern), mit einer while-Schleife erzeugt
 
#include "colors.inc"
#include "textures.inc"
#include "shapes.inc"


#declare pyramide = union
{
#declare kx = 2;
#declare ky = 0;
#declare kz = 2;
#declare h  = 0.02;  /*Höhe eines Teilstücks*/
#while (kx > 0)
  box
    {
    <-kx, ky, -kz> <kx, ky + h, kz> 
    }
  #declare kx = kx - 0.01;
  #declare ky = ky + 0.02;
  #declare kz = kz - 0.01;
#end
}


light_source
{
<-5, 0, -5>
color White
}


light_source
{
<-5, 0, -5>
color White
}


light_source
{
<5, 0, -5>
color White
}


light_source
{
<5, 0, -5>
color White
}


camera
{
location <0, 2, -7>
look_at  <0, 1.5, 0>
rotate y * 35
}


background {color White}


object {pyramide pigment {color SkyBlue}}

 

  Fachbereich-Kontakt:            

Anfang  nach oben