POV-Raytracer Einsteiger-Kurs (2)

Nachdem in der vergangenen Ausgabe die ersten Schritte erläutert wurden, geht's nun ins Eingemachte...

"Nobody is perfect", das gilt natürlich auch für eine Zeitschrift. Leider gab es im ersten Teil des POV Kurses noch einen kleinen Druckfehler. Vor dem #include "colors.inc" dürfen natürlich keine zwei Querstriche sein, sonst ignoriert der POV diese Zeile einfach. Aber wer aufgepaßt hat, hat das ja sicherlich gemerkt. In diesem Sinne also herzlich willkommen zum zweiten Teil des POV-Raytracing Kurses, in der Hoffnung, diesmal ohne "Rätsel des Monats" auszukommen.

Die Erweiterung von "Hello World"

Unsere Kugel sah ja schon gut aus, doch es fehlte einfach noch ein bißchen drumherum. Sehr einfach, und trotzdem eindrucksvoll, ist eine Erweiterung durch eine Ebene mit einem Schachbrettmuster, die mit folgenden Zeilen definiert wird:

plane {
	<0, 1, 0>, -1.5 
	pigment {
		checker 
		color Red 
		color Yellow
	}
}

Schreiben sie diese Zeilen einfach in den Hauptteil der Hello World Szene aus dem ersten Teil. Weiterhin können Sie noch background (color Blue) hinzufügen, sowie die Kameraposition auf <0, 1, -4> ändern. Mit diesen einfachen Befehlen kommen wir dem Begriff "künstliche Welt" schon ein ganzes Stück näher, wenn wir das ausgerechnete Bild 'anschließend betrachten. Sicherlich werden jetzt einige bemerken, dass die ganze Sache doch noch etwas düster aussieht. Das liegt einfach daran, dass die Strahlen unserer kleinen Punktlichtquelle die Schattenbereiche nicht erreichen können.

Abhilfe schafft hier ein weiterer Oberflächeneffekt: ambientes Licht. Fügen Sie in den beiden finish { ) Befehlen jeweils noch ambient 0.25 hinzu. Das ganze müßte dann so wie in Listing 2_1 aussehen.

Die neuen Befehle im Detail

background definiert ganz einfach eine Hintergrundfarbe für die Szene. Dabei können Farben aus "colors.inc" oder eigene Farbtöne mit dem Befehl rgb <0-1, 0-1, 0-1> verwendet werden. Als Hintergrund gelten alle die Punkte, an denen die Kamera kein Objekt erfassen kann. Im Normalfall ist die Hintergrundfarbe schwarz, mit diesem Befehl haben wir den Hintergrund blau definiert.

plane ist ein Befehl, um flache, endlose Ebenen zu erzeugen. Die Ebene kann einfarbig sein, aber auch ein Muster erhalten. Der Vektor gibt die Ausrichtung der Ebene an. Man muss sich das so vorstellen, als wenn der (unsichtbare) Vektor auf die Ebene draufgeklebt ist, und die Pfeilspitze frei bewegt werden kann (Bild 1). Die Zahl hinter dem Vektor gibt an, wie weit die Ebene vom Ursprung aus verschoben wird. In unserem Beispiel heißt das also: Der Vektor <0, 1, 0>, der senkrecht nach oben zeigt, definiert eine horizontale Ebene, die durch den folgenden Wert -1 um eine Einheit nach unten verschoben wird. Die Farbzuweisung der Ebene erfolgt wie bei der Kugel mit dem pigment Befehl. Als Besonderheit haben wir hier ein Schachbrettmuster definiert. checker kann in allen pigment Anweisungen stehen. Es müssen daraufhin zweimal die Befehle color und die gewünschte Farbe folgen. Als Farbe können auch hier vordefinierte Farben aus "colors.inc" oder eigene Farbtöne verwendet werden.

ambient definiert für ein Objekt die Intensität des indirekten Lichts. Dieses Licht erreicht das Objekt immer, also auch in Schattenbereichen. So kann man den Effekt von Halbschatten ohne zusätzliche Lichtquellen oder die Lichtreflektion anderer Objekte simulieren.

Die Benutzung von Texturen

Bisher sahen unsere Beispiele mit den einfarbigen Objekten noch sehr einfach aus, doch jetzt geht es richtig Ios. Dem POV-Paket liegen zahlreiche Texturen bei, die sehr einfach zu benutzen sind. Texturen definieren das Aussehen und die Eigenschaften eines Objekts. Um sie zu benutzen, müssen am Anfang einer Szene folgende Zeilen stehen:

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

Danach können sämtliche vordefinierte Texturen verwendet werden. Was liegt also näher, als unserer Kugel eine Marmoroberfläche zu verpassen? Dazu muss unser Listing durch die obige Zeile ergänzt werden. Die Kugel wird dann wie folgt definiert (Listing b):

Neu hinzugekommen ist der Befehl scale. Mit ihm lassen sich ganze Objekte oder auch nur die Oberflächen skalieren. Da die fertigen Texturen in der Regel sehr groß definiert sind, müssen sie für so kleine Objekte wie unsere Kugel verkleinert werden. Durch den Zusatz scale 0.2 innerhalb der texture Anweisung wird die gesamte Oberfläche auf 1/5 verkleinert. Der scale Befehl lässt sich auch ganz wirkungsvoll für unser Schachbrettmuster einsetzen: Fügen Sie hinter dem finisch Befehl von plane einmal scale 2 hinzu. Die Größe des Schachbrettmusters wurde nun verdoppelt.

In diesem Zusammenhang sei auch der Befehl rotate zu erwähnen. Dadurch kann ein Objekt oder eine Textur um eine beliebige Achse gedreht werden. Der Winkel für jede Achse wird in eckigen Klammern angegeben. Der Befehl lautet rotate <x, y, z>, wobei für x,y,z der Drehwinkel angegeben werden muss. Soll sich nur um eine Achse gedreht werden, kann man alternativ beispielsweise auch rotate x10 schreiben, wenn nur um 10 Grad um die X-Achse gedreht werden soll. Im letzen Beispiel sind Ihnen sicherlich die von oben nach unten verlaufenden Linien im Marmormuster aufgefallen. Ergänzen Sie rotate <0, 0, 45> oder **rotate z45** eine Zeile unter dem scale 0.2 Befehl innerhalb der texture Anweisung. Das Muster wurde nun um 45 Grad um die Z-Achse gedreht, was man hier gut an den Linien erkennen kann. Genauso kann natürlich mit rotate y*45 das Schachbrettmuster gedreht werden.

Erweiterung der Szene durch eine Himmelsstruktur

Auch solche sind in der Datei "TEXTURES.INC" definiert und können theoretisch für jedes Objekt benutzt werden. Sinnvoll ist es aber, diese auch wirklich in einem "echten" Himmel zu verwenden. Dazu wird eine riesige Kugel um unsere Szene herumgelegt (siehe Bild 2), ganz so wie es ja in Wirklichkeit auch ist. Wir befinden uns jetzt nicht außerhalb, sondern innerhalb dieser Kugel mit unserer gesamten Szene, inklusive Lichtquelle und Kamera. Um den Himmel eine Leuchtkraft zu verleihen, benutzen wir zusätzlich noch den Befehl ambient. Schreiben Sie anstelle des background Befehls folgende Zeilen: (Listing b)
Die komplette Szene finden Sie in Listing 2_2.
Der blaue Hintergrund wurde nun mit Wolken versehen. Statt Blue_Sky können Sie auch Blue_Sky2, Blue Sky3, Blood Sky, Clouds oder jede andere Textur verwenden.

Weitere Grundkörper

Nachdem wir nun so viel über die Oberflächeneigenschaften gehört haben, wollen wir nun zum Abschluß noch eine neue Grundform kennenlernen, den Zylinder. Wir wie wissen, ist ein Zylinder ein Quader mit einer kreisförmigen Grundfläche. Im POV-Ray kann man ihn einfach mit dem Befehl cylinder erzeugen. Danach folgen zwei Koordinaten, eine für den Anfangs- und die andere für den Endpunkt, gefolgt vom Radius und den üblichen Oberflächeneigenschaften. Anfangsund Endpunkt bedeutet dabei jeweils der Mittelpunkt der beiden äußeren Kreise. Ein Zylinder könnte also so beschrieben werden: cylinder <-0.5, 1, 0>, <0.5, 1, 0>, 0.5 //Anfangs-, Endpunkt und Radius texture {Cherry_Wood} } Benutzt man große Radien, kann man auch Scheiben erzeugen. Ein Beispiel für eine einfache Metallhantel soll dies im Listing 2_3 verdeutlichen.
Damit ist auch schon der zweite Teil unseres POV-Kurses beendet. In der nächsten Ausgabe geht es natürlich weiter, u.a. mit neuen Grundformen.

Listings:

listing2_1.pov
listing2_2.pov
listing_b.pov
listing_c.pov
listing2_3.pov


Olaf Güthe
Aus: Atari Inside 06 / 1995, Seite 46

Links

Copyright-Bestimmungen: siehe Über diese Seite