POV-Ray
– Persistence of Vision Ray
Tracer
(eine durch Verfolgung von Lichtstrahlen
beständige Sicht auf ein Objekt)
| 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:
Will man nur in die Richtung einer Achse
verschieben, so lautet der Befehl:
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:
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:
Will man auf allen Achsen gleichmäßig
skalieren, lautet der Befehl:
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:
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}}
|
 |
|