Oberflächen gestalten mit Texturen
Texturen ermöglichen es, Formen nicht nur einfarbig darzustellen, sondern bringen sowohl Vielfalt als auch Realismus ins Spiel. Ob Gold oder Regenbogen, es ist alles möglich. Glänzend oder matt, dank Texturen sind der Phantasie keine Grenzen gesetzt. Wie man Texturen anwendet und gestaltet, beschreibt dieses Kapitel. Zumindest die Grundlagen, denn alle Möglichkeiten lassen sich im Rahmen dieses Tutorials nicht abbilden.Fertige Texturen einbinden
Oberflächen lassen sich beim Raytracing nicht nur mit einer einzelnen Farbe belegen, sondern es gibt vielfältige Möglichkeiten diese zu gestalten. Dazu gehört die Beschaffenheit, die mit finish betimmt wird. Ebenso kann durch die Angaben transmit und filter die Transparenz eines Objekts angegeben werden. Weiterhin ist durch die Angabe normal Unebenheiten in der Oberfläche zu erzeugen. Somit bieten sich nahezu unendlich viele Möglichkeiten, die platzierten Gegenstände zu Formen.
Include: Dateien einbinden
Bisher haben wir die Farben von Gegenständen immer selbst über einen rgb-Wert definiert. Dies ist zwar die allgemeinste Form eine Farbe zu erzeugen, jedoch gibt es bereits ein Paket, in dem die gebräuchlichsten Farben enthalten sind. Diese muss jedoch zunächst in unser Bild eingebunden werden. Das funktioniert über die Zeile
#include "colors.inc"
Das einbinden von Paketen erfolgt dabei grundsätzlich ganz am Anfang einer Datei. Um herauszufinden, welche Farben in colors.inc definiert sind, öffnen wir diese mit einem Editor (wo die Datei colors.inc zu finden ist, wird im Anhang beschrieben). Wir finden dort Farben wie Yellow, Green, Magenta, MidnightBlue oder Light_Purple. Um bei den Grundfarben zu bleiben lässt sich unser Schattenspiel aus vorigem Kapitel nun wie folgt erzeugen:
#version 3.6; #include "colors.inc" camera{ location <-10, 18, -10> look_at <0,0,0> } light_source{ <5, 8, -10> color White } light_source{ <-5, 8, -10> color White } background{SkyBlue} plane{y,0 pigment{checker Black White}} 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,5,1.8> } cylinder{ <0,0,0>,<0,3,0>,1 pigment{Blue} translate<1,5,1> } cone{ <0,0,0>,1.5 <0,2,0>,1e-4 pigment{Red} translate<1,8,1> } sphere{ <0,0,0>,3 pigment{White} translate<0,3,6> }
Auch wenn die hier verwendeten Farben problemlos über die rgb-Definition erzeugt werden konnten, so bringt die Einbindung per colors.inc eine bessere Übersicht der verwendten Farben mit sich.
Natürlich ist colors.inc nicht das einzige Pakte, das mit "POV-Ray(TM)" mitgeliefert wird. Daher wollen wir uns auch gleich mit einem zweiten dieser Pakete befassen.
Glanz, Glamour und Glas
In diesem Abschnitt werden wir lernen, was man mit Oberflächen alles anstellen kann. So lassen sich über die Datei finish.inc matte und glänzende Oberflächen erstellen:
#version 3.6; #include "colors.inc" #include "finish.inc" camera{ location <0, 3, -8> look_at <0,2,0> } light_source{ <0, 8, -10> color White } background{SkyBlue} plane{y,0 pigment{checker Black White}} sphere{ <2,1,0>,1 pigment{Blue} finish{Shiny} } sphere{ <-2,1,0>,1 pigment{Red} finish{Dull} } sphere{ <0,1,2>,1 pigment{Grey} finish{Mirror} }
![Kugeln mit diversen Oberflächen](../Motive/Bild2_1.png)
Damit erzeugen wir drei Kugeln, die verschiedene Oberflächen besitzen. Außerdem spendieren wir der Szene noch einen himmelblauen Hintergrund. Gut zu sehen ist dabei, dass die blaue Kugel einen glänzenden Einduck macht, während die rote Kugel matt wirkt. Die letzte Kugel schließlich besitzt eine perfekt spiegelnde Oberfläche. Diese überdeckt die eigentliche Farbe, weshalb das Grau der Kugel nicht sichtbar ist. In jedem Fall sehen wir sehr gut, wie sich die Oberfläche und damit das Erscheinungsbild eines Gegenstands mit Hilfe der Datei finish.inc beeinflussen lässt. Als letztes wollen wir den Glanz-Effekt noch mit Transparenz verbinden, um zu sehen was für Effekte sich damit erzeugen lassen.
Dafür müssen wir beachten, dass es zwei verschiedene Arten von Transparenz gibt. Zunächst gibt es die Option filter, die den Gegenstand wie ein Farbfilter wirken lässt. Mit diesem Befehl können wir also die sprichwörtliche "Rosarote Brille" erstellen.
Die zweite Möglichkeit besteht in der Option transmit, bei der das Licht einfach durch den Gegenstand läuft, ohne die Farbe zu verändern. Wir wollen und den Unterschied an folgendem Beispiel klar machen:
#version 3.6; #include "colors.inc" #include "finish.inc" camera{ location <0, 3, -10> look_at <0,0,0> } light_source{ <0, 6, -10> color rgb<1,1,1> } background{SkyBlue} plane{y,0 pigment{checker Blue White}} box{ <-10,-.1,6>, <10,5,7> pigment{MediumForestGreen} finish{Dull} } cylinder{ <-3,2,4>, <-3,2,4.5>,1 pigment{Red transmit .7} } cylinder{ <3,2,4>, <3,2,4.5>,1 pigment{Red filter .7} }
![Vergleich filter und transmit](../Motive/Bild2_2a.png)
Wie auf obigem Bild zu sehen ist, erzeugen wir durch die box eine Wand in einem hübschen Grün. Zu beachten ist dabei, dass die Wand etwas unterhalb des Bodens beginnt, da sonst unschöne Effekte an der unteren Kante auftreten. Neu ist, dass wir keine "0" vor den Punkt setzen. Das ist bei "POV-Ray(TM)" auch nicht nötig, was uns einige Schreibarbeit spart.
Vor dieser Wand schweben zwei Scheiben, die jeweils aus einem sehr dünnen Zylinder bestehen. Die Zylinder sind beide rot eingefärbt und besitzen die oben eingeführten Transparenzen. Dabei ist jedoch wichtig, dass der Wert hinter der Transparenz die Stärke angibt. In unserem Beispiel passiert 70% des einfallenden Lichts die Objekte.
Wir beobachten, dass die rechte Scheibe einen roten Schatten auf die Wand wirft, während dieser bei der linken Scheibe in Grau dargestellt wird. Außerdem erscheint die linke Scheibe undeutlicher als die Rechte. Dies liegt daran, dass sie eben von 70% des einfallenden Lichts durchdrungen wird. Probiert einfach mal aus, was passiert, wenn ihr die Transparenz wie folgt ändert:
cylinder{ <-3,2,4>, <-3,2,4.5>,1 pigment{Red transmit 1} } cylinder{ <3,2,4>, <3,2,4.5>,1 pigment{Red filter 1} }
Das Ergebnis ist durchaus erstaunlich:
![Zwei transparente Scheiben](../Motive/Bild2_2b.png)
Plötzlich ist die rechte Scheibe verschwunden und wirft auch keinen Schatten mehr auf die Wand. Im ersten Moment wirkt das seltsam, wenn wir uns jedoch den Transparenz-Effekt geauer anschauen wird das Resultat klar. So ist die linke Scheine vollständig durchsichtig. Alles einfallende Licht durchläuft den Gegenstand ohne davon beeinflusst zu werden. Daher sieht man nichts von der Scheibe. Die rechte Scheibe wirkt jedoch wie buntes Glas. Alles Licht was hindurch fällt wird entsprechend eingefärbt. Daher ist der Schatten in diesem Fall kräftiger, genau wie die Färbung der Scheibe.
Die Option transmit macht daher nur Sinn, wenn ein Wert < 1 angegeben wird. Außer man beabsichtigt, aus welchen Gründen auch immer, einen unsichtbaren Gegenstand zu erschaffen.
Übrigens lässt sich Transparenz auch direkt mit der entsprechenden Farbe eine Gegenstands in Kurzschreibweise angeben. Obiges Beispiel sieht dann wie folgt aus:
cylinder{ <-3,2,4>, <-3,2,4.5>,1 pigment{rgbt<1,0,0,1>} cylinder{ <3,2,4>, <3,2,4.5>,1 pigment{rgbf<1,0,0,1>} }
Dabei steht rgb wie bisher bekannt für die Rot-, Grün- und Blauwerte. Neu ist das t bzw. f, was direkt die Art der Transparenz angibt. Gefolgt wird die Angabe rgbt bzw. rgbf dann natürlich von vier Zahlen, wobei die letzte Zahl die Stärke der Transparenz einstellt.
Als Letztes sei noch darauf hingewiesen, dass Effekte wie Glanz und Mattheit einer Oberfläche auch mit Transparenz kombinierbar sind. Mit einer geschickten Wahl der Effekte lassen sich so verschiedene Arten von Glas nachbilden. Als kleines Beispiel und zur Motivation selbst ein wenig auszuprobieren, wollen wir folgendes Bild erstellen:
#version 3.6; #include "colors.inc" #include "finish.inc" camera{ location <0, 3, -10> look_at <0,0,0> } light_source{ <0, 6, -10> color rgb<1,1,1> } background{SkyBlue} plane{y,0 pigment{checker Blue White}} box{ <-10,-.1,6>, <10,5,7> pigment{MediumForestGreen} finish{Dull} } sphere{ <3,1.5,2>, 1.5 pigment{Gray70 filter .7} finish{Glossy} } sphere{ <3,1.5,2>, 1 pigment{Red filter .5} finish{Dull} } sphere{ <-3,1.5,2>, 1.5 pigment{Gray70 transmit .7} finish{Glossy} } sphere{ <-3,1.5,2>, 1 pigment{Red filter .5} finish{Dull} }
![Beispiel für Oberflächen](../Motive/Bild2_3.png)
Erhebungen, Senken und Wellen
Bisher haben wir ausschließlich glatte Oberflächen erzeugt, weshalb unsere Gegenstände immer wie neu und poliert wirkten. Dies lässt sich natürlich auch ändern. Dazu lassen sich die Objekte mit normal versehen. Das wollen wir uns gleich mal an einem konkreten Beispiel anschauen:
#version 3.6; #include "colors.inc" #include "textures.inc" camera{ location <0, 4, -8> look_at <0,2,0> } light_source{ <0, 6, -10> color rgb<1,1,1> } background{Navy} plane{y,0 texture{PinkAlabaster scale .6} } box{ <-15,-.1,6>, <15,5,7> texture{Brown_Agate} } box{ <-4,0,-1>,<-2,2,1> texture{Chrome_Metal} normal{bumps 1.4 scale .4} } box{ <-1,0,-1>,<1,2,1> texture{Chrome_Metal} normal{wrinkles 1.4 scale .4} } box{ <2,0,-1>,<4,2,1> texture{Chrome_Metal} normal{waves 1.4 scale .2} } sphere{ <-1.5,2.7,0>,1 texture{New_Brass} normal{dents 1.4 scale .2} } sphere{ <1.5,2.7,0>,1 texture{New_Brass} normal {ripples 1.4 scale.2} }
Dabei handelt es sich wieder um das bereits bekannte Bild, jedoch wieder einmal leicht angepasst. So wurde auf eine Kugel verzichtet, da es insgesamt nur fünf Modifikatoren von normal gibt. Außerdem haben alle Kisten sowie alle Kugeln die selbe Textur bekommen, damit wir die erzeugten Effekte besser vergleichen können. Die Texturen stammen dabei aus der Datei textures.inc, die im nächsten Kapitel genauer betrachtet wird. Wir betrachten jetzt aber zunächst einmal das erstellte Bild:
![Modifikatoren der Oberfläche](../Motive/Bild2_6b.png)
Auf den ersten Blick sehen wir, dass unser schön glänzendes Chrome nicht ganz fabrikneu aussieht. So hat der ganz linke Klotz einige Dellen und Beulen ab bekommen, während der Mittlere eine Prägung aus konzentrischen Kreisen besitzt. Diese Prägung erinnert an einen Stein, der ins Wasser fällt und eben solche Ringe hinterlässt. Als Letzter besitzt der rechte Klotz einen kreisförmigen Schliff. Die Kugel sind ebenfalls mit Effekten ausgestattet. So sind auf der linken Kugel kleine Berge oder Ausbeulungen zu sehen, während die rechte Kugel mit wrinkles versehen ist. Dieser Effekt bewirkt, dass die Oberfläche "zerknittert", also unregelmäßig wirkt. So lässt sich damit beispielsweise eine zerknitterte Lage Alufolie erzeugen.
Zusammenfassend soll folgende Liste eine Übersicht der möglichen Effekte geben:
- bumps: Erzeugt Täler oder Beulen im Gegenstand
- dents: Erzeugt Berge oder Ausbeulungen im Gegenstand
- ripples: Erzeugt konzentrische Ringe, wie wenn ein Stein ins Wasser fällt
- waves: Erzeugt einen wellenförmigen Schliff auf der Oberfläche
- wrinkles: Erzeugt eine zerknitterterte, unregelmäßige Oberfläche
Wichtig ist dabei, dass hinter jedem der gewählten Effekte noch eine Zahl steht. Diese gibt die Stärke des Effektes an. Wählt man bei bumps beispielsweise einen kleinen Wert, so sind die Täler nicht so tief und die Berge der dents nicht so hoch. Das anschließende scale hat übrigens nur Einfluss auf die Ausdehnung des Effekts, die Tiefe der Täler oder Rillen bleibt dabei gleich.
Viele Effekte wirken jedoch erst richtig gut, wenn man sie stark verkleinert oder auf entsprechend großen Objekten anwendet. Bevor wir uns daran machen, aus aller unserer hier gesammelten Erfahrung ein hübsches Bild zu basteln sein noch ein Hinweis gegeben: Der Modifikator normal hat seinen Namen bekommen, da die erzeugten Effekte senkrecht zur Oberfläche stehen und daher durch deren "Normalenvektor" vorgegeben werden.
Farben und Verläufe
Für mehr Abwechslung im Bild bietet "POV-Ray(TM)" umfangreiche Möglichkeiten, die Oberflächen mit Mustern zu versehen. Dazu kann die Angabe des pigment mit ganz verschiedenen Modifikationen versehen werden. Dazu beschätigt sich dieses Kapitel mit der color_map sowie mit warp, das Unregelmäßigkeiten im Muster erzeugt. Zuletzt wird gezeigt, wie sich vorgefertigte Texturen aus der Datei textures.inc nutzen lassen.
Farbverläufe
Als einfachen Einstieg wollen wir eine Szene mit Boden, Himmel einer Wand und drei Kisten erzeugen. Natürlich geben wir jedem dieser Gegenstände ein eigenes Muster. Dazu erstellen wir aus folgenden Zeilen ein Bild:
#version 3.6; #include "colors.inc" camera{ location <0, 3, -10> look_at <0,0,0> } light_source{ <0, 6, -10> color rgb<1,1,1> } background{SkyBlue} plane{y,0 pigment{hexagon Black White Grey}} box{ <-10,-.1,6>, <10,5,7> pigment{brick Gray75 Brown scale .25} } box{ <-4,0,0>,<-2,2,1> pigment{gradient x color_map{ [0 color Brown] [.33 color Red] [.66 color Orange] [1 color Yellow]}} } box{ <-1,0,0>,<1,2,1> pigment{gradient -y color_map{ [0 color Brown] [.33 color Red] [.66 color Orange] [1 color Yellow]}} } box{ <2,0,0>,<4,2,1> pigment{gradient -y color_map{ [0 color Brown] [.33 color Red] [.66 color Orange] [1 color Yellow]} rotate<0,0,45>} }
Wie erwartet haben wir die gewünschte Szene erstellt. Doch um zu verstehen wie die einzelnen Muster zustandekommen, schauen wir uns das Bild genauer an.
![Beispiele für Muster](../Motive/Bild2_4.png)
Der Boden ist mit sechseckigen Fließen belegt, was durch die Anweisung hexagon erreicht wird. Dabei ist zu beachten, dass drei Farben angegebene werden müssen. Allerdings haben Muster gewisse vordefinierte Farben, die zum Einsatz kommen, sollte man einen Eintrag vergessen. Gibt man bei hexagon also nur zwei Farben an, so wird beim Rendern kein Fehler ausgegeben, sondern die dritte Farbe einfach vorgegeben, was zu der einen oder anderen Überraschung führen kann. Da wir jedoch drei Farben definiert haben, sieht alles aus wie gewünscht: Der Boden ist abwechselnd mit schwarzen, weißen und grauen Fließen bedeckt.
Im Hintergrund steht eine Wand, die in Backsteinoptik ausgeführt ist. Hierfür ist die Angabe brick verantwortlich. Diese wird gefolgt von zwei Angaben. Die erste steht für die Farbe der Backsteine, gefolgt von der Farbe des Mörtels. Außerdem ist das Muster auf den Faktor 1/4 verkleinert dargestellt, was durch scale .25 erreicht wird. Wichtig ist dabei, dass der Modifikator scale innerhalb den geschweiften Klammern des Ausdrucks hinter pigment steht. In diesem Fall wird nämlich nur das Muster verkleinert, der Gegenstand bleibt jedoch in seiner ursprünglichen Größe.
Vor der Mauer stehen drei Kisten, die jeweils einen Farbverlauf mit unterschiedlicher Ausrichtung haben. Den Farbverlauf erzeugen wird dabei durch die Anweisung gradient, gefolgt von der Richtung des Verlaufes. In der ersten Kiste ändert sich die Farbe daher entlang der x-Achse. Um die Farben des Verlaufs vorzugeben, muss eine color_map erstellt werden.
Hinweis:
Bei "POV-Ray(TM)" spielt die Reihenfolge eine Rolle, in der Operationen angegeben werden. Setzt man scale z.B. vor den Ausdruck pigment, so wird zunächst die Wand verkleinert und dann das Muster darauf gelegt. Setzt man scale dahinter, schrumpft die gesamte Mauer, gemeinsam mit dem Muster.
Die "color_map"
Zunächst wird eine color_map benötigt, denn sie gibt an, in welcher Reihenfolge und mit welcher Verteilung die Farben angezeigt werden. Bei Wand und Boden reicht dagegen die Angabe von Farben, da hier das Muster die Verteilung festlegt. Die Kisten jedoch haben Übergänge, weshalb eine color_map benötigt wird.
Dies ist etwa beim Einsatz von gradient der Fall. Schauen wir uns jetzt aber mal eine color_map genauer an.
color_map{ [0 color Brown] [.33 color Red] [.66 color Orange] [1 color Yellow]}
Wir erstellen mit dieser Anweisung einen Farbverlauf, der von Braun nach Rot, weiter zu Orange und schließlich in Gelb übergeht. Die Zahl vor der Farbe gibt dabei an, bei welcher Position bezogen auf eine Längeneinheit (LE) genau diese Farbe erscheint. Braun haben wir bei x = 0 LE erreicht, in dieser Farbe ist also die linke Ecke der Kiste eingefärbt. Der Übergang zu Rot wird nun automatisch berechnet und angezeigt. Vorgegeben ist nur, wann die Farbe Rot erreicht sein soll, nämlich bei x = 0,33 LE also nach 1/3 einer Längeneinheit. Ein weiteres Drittel später hat sich die Farbe in Orange geändert, bis nach einer Längeneinheit die letzte Farbe, in unserem Fall ist das Gelb, angezeigt wird.
Zu Beachten gilt, dass die Angabe einer color_map sich immer auf eine LE bezieht. Werte größer als Eins werden einfach ignoriert. Daher bedeckt der Farbverlauf lediglich die Hälfte der Kiste. Damit das Objekt jedoch komplett eingefärbt ist, wird der Verlauf auf der zweiten Hälfte der Kiste einfach wiederholt. Möchte man den Farbverlauf auf die ganze Kiste ausdehnen, so wäre das über scale 2 innerhalb des pigment möglich.
Die beiden anderen Kisten zeigen nun einen Farbverlauf entlang der y-Achse, sowie einen Farbverlauf, der durch eine Drehung um 45° entlang der z-Achse erzeugt wird. Es ist nämlich durchaus möglich, komplette Muster nicht nur in der Größe zu ändern, sondern auch zu drehen. Prinzipiell kann man einfach alle Manipulationen, die bei Objekten möglich sind, auch auf Muster anwenden.
Holz, Stein und Leoparden
Neben einfachen Farbverläufen gibt es noch weitere Möglichkeiten, seinen Gegenständen ein besonderes Äußeres zu verleihen. Als kleinen Vorgeschmack geben wir folgende Zeilen in den Editor ein:
#version 3.6; #include "colors.inc" camera{ location <0, 3, -10> look_at <0,0,0> } light_source{ <0, 6, -10> color rgb<1,1,1> } background{SkyBlue} plane{y,0 pigment{granite color_map{ [0 color Black] [.5 color Navy] [1 color White]}} } box{ <-10,-.1,6>, <10,5,7> pigment{leopard frequency 3 color_map{ [0 color Brown] [.33 color Grey] [.66 color Orange] [1 color Navy]}} } box{ <-4,0,-1>,<-2,2,0> pigment{marble frequency 2 color_map{ [0 color Black] [.33 color Grey] [.66 color Gray70] [1 color White]} warp{turbulence .6 octaves 5 omega 1.2 lambda 1.2}} } box{ <-1,0,-1>,<1,2,0> pigment{spotted frequency 4 color_map{ [0 color SeaGreen] [.33 color Orange] [.66 color Gold] [1 color Plum]} scale 2} } box{ <2,0,-1>,<4,2,0> pigment{agate color_map{ [0 color Black] [.33 color Gray40] [.66 color Gray70] [1 color White]} rotate<0,0,45>} } sphere{ <-2,3,1>,1 pigment{bozo frequency 4 color_map{ [0 Yellow] [.5 Brown] [1 Black]}} } sphere{ <2,3,1>,1 pigment{wood frequency 2 color_map{ [0 Yellow] [.5 Brown] [1 Black]}} }
Von der Szene her handelt es sich immer noch um das bekannte Bild aus dem vorangeganenen Abschnitt. Allerdings haben wir die Muster zum Teil massiv verändert und noch zwei Kugeln hinzugefügt, um die Vielfalt der Möglichkeiten besser aufzeigen zu können.
Das Bild mag zwar unreal wirken, doch zeigt es sehr gut die Bandbreite an Mustern auf, die möglich sind. Wer sich also schon lange mal mit abstakter Kunst beschäftigen wollte, hat jetzt das Mittel seiner Wahl gefunden...
Wir wollen jedoch nicht allzu lange bei dem Gedanken an eine Verwertung als Kunstwerk verharren, sondern uns viel mehr mit den erstellten Gegenständen und deren Muster auseinander setzen. Dazu schauen wir uns das erstelle Bild einmal genauer an.
![Versammlung der Muster](../Motive/Bild2_5.png)
Beginnen wir mit dem Boden, der nun nicht mehr mit Fließen bedeckt ist, sondern wie ein sonderbar gefärbter Steinboden wirkt. Hier sehen wir die Wirkung des Musters granite, dessen Farben einem Verlauf folgen und daher durch eine color_map angegeben werden.
Die Mauer im Hintergrund besitzt große und kleine Flecken unterschiedlicher Farben die ebenfalls ineinander übergehen. Das dazu verwendete Muster leopard benötigt daher auch eine color_map als Farbangabe. Neu ist hier außerdem der Modifikator frequency, der angibt wie oft sich das Muster innerhalb einer Einheitslänge wiederholt. Je größer der Wert, umso dichter wird das Muster also gepackt. Im Prinzip kann man diesen Effekt auch durch anfügen von scale .33 erreichen, bei dieser Version muss man aber genau darauf achten wo man scale platziert.
Die nächste Kiste hat ebenfalls ein aufwendiges Muster. Hier verwenden wir marble, das durch den Modifikator warp verändert wird. In unserem Fall fügen wir damit dem ansonsten recht langweiligen marble etwas Unordnung hinzu. Dafür dient die Zeile:
warp{turbulence .6 octaves 5 omega 1.2 lambda 1.2}} }
Die Angabe turbulence .6 gibt dabei an wie "turbulent" das Muster im Allgemeinen werden soll. Hier gilt, dass "0" sehr wenig Durchmischung bedeutet, während "1" sehr viel Unordnung erzeugt. Die Angaben dahinter beeinflussen schließlich noch die Art, zur Erzeugung der Unordnung. Dabei gilt:
- octaves: Gibt an, wie stark ausgeprägt die Wellenform des Musters wird. Bei hohen Werten ergeben sich starken Krümmungen, das Muster bekommt Zacken und wirkt wie Abgerissen. Möglich sind Werte von 1 - 10.
- omega: Es beeinflusst die Wirkung von octaves. So wird bei Werten zwischen "0" und "1" der Effekt unschaf, die Ecken verwischen und wirken nicht mehr so stark ausgeprägt. Werte die größer sind als "1" führen dagegen zu einer stärkeren Ausprägung der Ecken, das Motiv wird kantiger.
- lambda: Gibt vor, wie stark das Muster vom Zufall bestimmt sein wird. Werte zwischen "1" und "2" stehen für sehr kurvenreiche Muster mit häufigen Wendungen. Kleine Werte bedeuten nur leicht wellige Linien.
Um gute Effekte zu erzeugen benötigt man durchaus etwas Erfahrung mit dem Modifikator turbulence, macht euch also keine Sorgen wenn es nicht gleich auf Anhieb funktioniert.
Einfacher ist dagegen das Muster der mittleren Kiste. Diese ist mit einer spotted Oberfläche überzogen, die ebenfalls eine color_map benötigt, da sie Farbübergänge beinhaltet. Hier ist der Modifikator frequency mit einem anschließenden scale kombiniert. Das ist dabei problemlos möglich.
Die letzte Kiste schließlich besitzt wieder eine steinige Oberfläche. In diesem Fall handelt es sich um das Muster agate, das ebenfalls Farbübergänge besitzt und daher eine color_map benötigt.
Die beiden Kugeln führen schließlich noch die Muster bozo und wood ein, die beide Farbübergänge beinhalten sowie mit dem Modifikator frequency bedacht sind, um die Muster besser sichtbar zu machen.
Damit beinhaltet das Bild alle verfügbaren Muster und kann daher als eine Art Referenz dienen. Wer sich nicht ständig mit diversen color_maps herumschlagen möchte, der kann an dieser Stelle aufatmen. So bringt "POV-Ray(TM)" als Geschenk an uns bereits einige vorgefertigte Muster mit, die wir uns im Folgenden näher anschauen möchten.
Texturen einbinden
Um auf die bereits vordefinierten Muster oder Texturen zugreifen zu können, müssen wir die Datei texturs.inc einbinden. Also nehmen wir uns obige Szene mit den Kisten und Kugeln erneut vor. Wir wollen sie diesmal jedoch noch etwas ergänzen und mit vorgefertigten Texturen verschönern:
#version 3.6; #include "colors.inc" #include "textures.inc" camera{ location <0, 4, -8> look_at <0,2,0> } light_source{ <0, 6, -10> color rgb<1,1,1> } background{Navy} plane{y,0 texture{PinkAlabaster scale .6} } box{ <-15,-.1,6>, <15,5,7> texture{Brown_Agate} } box{ <-4,0,-1>,<-2,2,1> texture{White_Marble} } box{ <-1,0,-1>,<1,2,1> texture{Tan_Wood scale .5} } box{ <2,0,-1>,<4,2,1> texture{New_Brass} } sphere{ <-3,2.9,0>,1 texture{Green_Glass} } sphere{ <-3,2.9,0>,.6 texture{Starfield} } sphere{ <0,2.9,0>,1 texture{Yellow_Glass} } sphere{ <0,2.9,0>,.6 texture{Candy_Cane scale .3} } sphere{ <3,2.9,0>,1 texture{NBglass} } sphere{ <3,2.9,0>,.6 texture{Lightning1 scale .4} }
Erneut gibt es eine Mauer, drei Kisten und diesmal gleich sechs Kugeln. Bevor ich aber lange versuche mit Worte zu beschreiben, wie das Bild aussieht, schauen wir es uns doch lieber an:
![Texturen auf Kugeln](../Motive/Bild2_6.png)
Dieses Mal schweben die Kugeln nicht mehr in der Luft, sondern liegen auf den Kisten. Außerdem sind die drei äußeren Kugeln jeweils aus Glas und geben den Blick nach Innen frei. Die Kugeln dort sind mit speziellen Texturen überzogen. Außerdem wurden viele der Texturen verkleinert, damit ihr Effekt besser zur Geltung kommt.
Natürlich gibt es noch wesentlich mehr vordefinierte Texturen, die hier noch keine Verwendung fanden. Hier hilft es, die Datei textures.inc durch zu schauen und viel auszuprobieren.
Texturen Teil 3
Um die vielfältigen Möglichkeiten des Raytracings darzustellen, wollen wir in diesem Kapitel eine Glasperle erstellen. Diese wird in einer Szene platziert, die sehr viele verschiedene Muster und Texturen enthält.
Beispiel: Die Glasperle
Ein wenig Arbeit steht durchaus an, wenn eine hübsche Szene erstellt werden soll. Lasst euch von den vielen Zeilen Code nicht abschrecken. Es lohnt sich, denn die Glasperle zeigt sehr schön auf, was mit "POV-Ray(TM)" alles möglich ist.
#version 3.6; #include "colors.inc" #include "finish.inc" #include "textures.inc" camera{ location <0,4,-10> look_at <0,4.5,0> } light_source{ <0,12,-10> color White } background{Navy} plane{ y,2 pigment{Aquamarine filter .8} normal{ripples 3.4 scale .6} finish{Shiny} } plane{ y,0 pigment{checker Black White scale 2} } box{ <-15,-.1,6>, <15,5,9> pigment{brick Gray75 Brown scale .25} } box{ <-7.25,5,6.25>,<-4.75,7,8.75> pigment{wood frequency .3 color_map{ [0 color Black] [.5 color Brown] [1 color Orange]} warp{turbulence .6 octaves 5 omega 1.2 lambda 1.2}} } sphere{ <-6,8.8,7.5>,2 texture{Yellow_Glass} } sphere{ <-6,8.8,7.5>,1.5 texture{Candy_Cane} } box{ <4.75,5,6.25>,<7.25,7,8.75> texture{Chrome_Metal} normal{waves .8 scale .2} } sphere{ <6,8.8,7.5>,2 texture{NBglass} } sphere{ <6,8.8,7.5>,1.5 texture{New_Brass} normal{bumps 1.2 scale .4} } 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} } light_source{ <0,5.9,-.25> color White}
Die Holz-Textur der linken Kiste wurde dabei selbst erstellt und nicht auf eine vorgerfertige Version zurück gegriffen. Wir sehen dadurch, dass es durchaus machbar ist, schöne Texturen selbst zu erstellen. Ihr könnt das aber gerne selbst ausprobieren.
Außerdem ist neu, dass wir in der mittleren Glaskugel eine Lichtquelle plaziert haben, was in "POV-Ray(TM)" absolut kein Problem darstellt. Im Gegenteil, damit lassen sich sehr nette Effekte erzielen, wie sich an dem erstellen Bild zeigt:
![Glasperlenspiel](../Motive/Bild2_7b.png)
Ich freue mich über Spenden, die mir helfen die Kosten vom Webspace zu decken!