Raytracing mit POV-Ray: Variablen, Schleifen und Makros
Variablen, Schleifen und Makros
BearbeitenVariablen
BearbeitenVariablen sind in der Programmierung Container im Hauptspeicher in denen Werte abgelegt bzw. gespeichert werden können. So auch in Pov-Ray. Sie werden mit der "#declare" Anweisung "bekannt gemacht". Nach jeder Deklaration muss ein Semikolon stehen! Die Deklaration einer Variablen mit dem Namen i sähe dann so aus:
#declare i = 0;
Wie sie vielleicht bemerkt haben, wird der Variablen direkt ein Wert zugewiesen. In solche Variablen kann man aber nicht nur Zahlenwerte speichern, sondern auch ganze Objekt oder Teile davon, wie z.B. die Textur. Dann kann man später deklarierte Texturen in mehrere Objekte gleichzeitig einbauen ohne das selbe Codefragment immer wieder neu zu schreiben. Hat man nun ein ganzes Objekt in eine Variable gespeichert, dann kann man dies mit "object{MeinObjekt}" anzeigen. Dabei kann man hinter "MeinObjekt" noch verschiedene Transformationen wie "translate<x,y,z>" einfügen:
#declare Blau = pigment{color rgb<0,0,1>};
#declare Blaue_Kugel = sphere{<0,0,0>,1 pigment{Blau}};
object{Blaue_Kugel translate<0,2,0>}
Schleifen
BearbeitenWenn man ein Objekt mehrmals darstellen will, nur in verschiedenen Größen und/oder an verschiedenen Orten, kann man sich Schleifen bedienen. Sie eignen sich für jede Form von Wiederholung. Sie wird mit "#while" eingeleitet und endet mit "#end". Dann wird eine Bedingung angegeben, nach der die Schleife wiederholt wird bis die Bedingung nicht mehr erfüllt ist.
#declare i = 0; //Zähler
#declare Kugel = sphere{<0,0,0>,0.5 pigment{color rgb<1,0,0>}}; //das zu zeichnende Objekt
#while(i<10)
object{Kugel translate<0,i,0>}
#declare i = i + 2;
#end
Dieses Stück Code zeichnet nun fünf Kugeln übereinander, ohne dass man fünf mal den Code für eine Kugel hätte hinschreiben müssen in dem immer nur ein Wert anders gewesen wäre.
Man kann natürlich auch mehrere while-Schleifen schachteln um beliebige Variablen verändern, so läßt sich eine Matrix aus Kugeln zaubern, die ihre Farben verändern.
Ebenso lassen sich Rotationen unterbringen, dabei verschmelzen die einzelnen Elemente je nach Schrittzahl miteinander, mit entsprechen hohen Schrittzahlen lassen sich somit glatte Objekte erzeugen. (Im gewählten Beispiel wäre ein Torus natürlich einfacher.)
#declare i = 0;
#declare Steps = 30;
#declare Kugel = sphere{<0,0,0>,0.5 pigment{color rgb<1,0,0>}};
#while(i<Steps)
object{Kugel translate<3,0,0> rotate <0,i * 360 / Steps, 0> }
#declare i = i + 1;
#end
Verändert man nun mehrere Komponenten, so lassen sich kompliziertere geometrische Gebilde erzeugen.
#declare i = 0;
#declare Steps = 300;
#declare Kugel = sphere{<0,0,0>,0.5 pigment{color rgb<1,0,0>}};
#while(i<Steps*10)
object{Kugel
translate<3,-10+i/100,0>
rotate <0,i * 360 / Steps, 0>
}
#declare i = i + 1;
#end
Makros
BearbeitenMakros sind mit Funktionen oder eher Methoden aus anderen Programmiersprachen vergleichbar. Sie führen bestimmte Aktionen bedingt von Parametern aus. Man kann sie nutzen wenn man eine Anweisung auf verschiedene Art und Weise ausführen will ohne sich verschiedene Schleifen Schreiben zu müssen.
In PovRay lautet die Syntax:
#macro [Name d. Makros]([Parameter1],[Parameter2],[Parameter3],[...]) Anweisungen #end
Um ein Makro später aufzurufen benutzt man:
object{[Name d. Makros]([Parameter])}
Ein Beispiel: Es soll ein Makro geschrieben werden der einen Turm aus immer kleiner werdenden Quadern "baut".
Zunächst überlegt man welche Parameter man für die einfachste Form braucht: -->Zunächst nur die Grundfläche des größten (also untersten) Quaders und die Anzahl der Quader. Nun kann man mit dem eigentlichen Schreiben anfangen.