Dokumentation

Grundlegendes und erste Schritte

 
-> Lichtquellen und die Kamera
Einleitung
Eine einfache Szene: Schritt 1
Eine einfache Szene: Schritt 2
Eine einfache Szene: Schritt 3
Einige Bemerkungen zur Scriptsprache

 

Einleitung

Ziel dieser Dokumentation ist es, eine Einführung in die Script-Sprache zu geben, mit deren Hilfe man Szenen definieren kann. Nicht jedoch wird hier das Raytracing selbst erklärt. Es ist daher sinnvoll, sich vorher die entsprechenden Seiten auf www.raytracer.de durchzulesen, wobei man die dort angegebenen Befehle für die Scriptsprache übersehen möchte. Sie sind veraltet, und: Die Version 3 des Raytracers ist nicht abwärtskompatibel! Das heißt, die alten Scripte lassen sich mit der neuen Version nicht mehr verwenden.
Die neue Scriptsprache ist vom Aussehen her an C angelehnt, auch wenn sie vom internen Aufbau her nichts mit der Programmiersprache gemeinsam hat. Wer aber einen Editor mit Syntax-Highlighting hat, der sollte ihn zur bearbeitund der Script-Dateien auf C++ einstellen, das macht das ganze dann schon einiges übersichtlicher.
In diesem Abschnitt werde ich in drei Schritten eine kleine Beispielszene entwerfen, ohne näher auf die einzelnen Befehle einzugehen. Man soll lediglich einen ersten Eindruck von der Scriptsprache erhalten.
[nach oben]


Quelltext

Eine einfache Szene: Schritt 1

Wir fangen mit einer einfachen Szene an, die nur aus einer roten Kugel besteht. Die Kugel wird definiert durch:

new sphere{
  color=[255,0,0];
}
Die Einträge in dem Farbvektor stehen dabei für die Rot- Grün- und Blaukomponente der Objektfarbe. Da wir keine weiteren Angaben gemacht haben, wird die Kugel an die Stelle [0,0,0] gelegt und hat den Radius 1.
Als Lichtquelle nehmen wir eine einfache weiße Punktlichtquelle:
light omni
{ pos=[10,-10,-10]; color=[255,255,255]; intensity=150; }
Der Vektor pos gibt dabei die Position in kartesischen Koordinaten an. Wie man sieht, können die einzelnen Zuweisungen wahlweise in einzelnen Zeilen oder nacheinander in einer Zeile stehen.
Was noch fehlt, ist die Kamera, die den Bildausschnitt festlegt. Dazu müssen die Position der Kamera, die Blickrichtung (durch Angabe eines Referenzpunktes, der dann in der Bildmitte liegt) sowie die Größe dies Sichtfeldes angegeben werden:
camera {
  pos=[0,-4,-10];
  to=[0,0,0];
  xsize=8;
  ysize=6;
}
Wichtig ist, dass das Seitenverhältnis xsize:ysize das gleiche ist wie bei dem späteren Bild. Meist hat man das Verhältnis 4:3.

[
nach oben]

Quelltext

Eine einfache Szene: Schritt 2

Wir wollen nun eine Würfel hinzufügen. Dieser soll natürlich nicht an derselben Stelle sein, wie die Kugel. Außerdem wollen wir keinen Einheitswürfel; die Kantenlängen sollen verschieden sein. Hier die Definition:

new cube{
  color=[255,255,255];
  pos=[0,2,2];
  scale=[5,3,0.5];
  rotate=[-45°,0,0];
}
scale gibt an, dass der Würfel um den Faktor 5 in x-Richtung, den Faktor 3 in y- Richtung und den Faktor 0.5 in z-Richtung gedehnt werden soll. Ohne Dehnung hätte der Würfel die Kantenlängen 1, jetzt hat er also als Kantenlängen 5, 3 und 0.5.
Mit pos wird der Ort des Mittelpunktes festgelegt. In diesem Falle ist er 2 Einheiten unterhalb und ebenfalls zwei Einheiten hinter dem Mittelpunkt der Kugel.
rotate gibt schließlich an, dass der Würfel noch um seinen Mittelpunkt rotiert werden soll. Die einzelnen Einträge geben dabei die Rotationswinkel um x- y- und z-Achse an. Die Rotationen werden in umgekehrter Reihenfolge durchgeführt: Erst um die z- dann um die y- und schließlich um die x-Achse. In diesem Beispiel ist der Würfel um 45 Grad um die x-Achse gedreht.
Weiterhin soll noch ambientes (Hintergrund-)Licht hinzukommen. Dazu muss nur die Farbe angegeben werden:
light ambient{ color=[50,50,50]; }
[
nach oben]

Quelltext

Eine einfache Szene: Schritt 3

Nun soll das Ganze noch etwas realistischer Wirken. Wir verändern dazu ein wenig die Oberfläche der Objekte. Die Kugel soll zusätzlich zur diffusen Lichtreflexion einen hellen Glanzpunkt bekommen. Dazu setzen wir die Parameter flat, phong und phongsize:

new sphere{
  flat=1;
  phong=1;
  phongsize=0.05;
  color=[255,0,0];
}
flat ist eine Zahl zwischen 0 und 1 und gibt den Anteil der diffusen Lichtreflexion an. 1 ist die Voreinstellung. phong gibt nun die Helligkeit und phongsize die Größe des Glanzpunktes an.
Die Oberfläche des Würfels soll nun verspiegelt werden. Dazu setzen wir den Parameter reflect:
new cube{
  reflect=0.8;
  flat=0.2;
  color=[255,255,255];
  pos=[0,2,2];
  scale=[5,3,0.5];
  rotate=[-45°,0,0];
}
Außerdem ist die die diffuse Reflexion auf 0.2 gesetzt werden. Für realistische Bilder ist es immer sinnvoll, reflect, flat und trans für die Transparenz so zu setzen, dass sie zusammen 1 ergeben. Schließlich kann der Körper nicht mehr Licht reflektieren, als überhaupt auftrifft.

[
nach oben]
 

Einige Bermerkungen zur Scriptsprache

Die obigen Beispiele haben schon die Grundlegende Struktur der Scriptsprache gezeigt.

  • Auf die Definition eines Objektes, einer Lichtquelle und der Kamera folgt ein in geschweifte Klammern { } gesetzter Block, in dem die einzelnen Attribute zugewiesen werden.
  • Innerhalb eines Objekt- (bzw. Kamera-, Lichtquellen-) Blockes können die Zuweisungen in beliebiger Reihenfolge stehen.
  • Zuweisungen können auch weggelassen werden. In dem Fall wird eine Standardvorgabe verwendet.
  • Auf Zuweisungen folgt immer ein Semikolon ;
  • Anweisungen (Zuweisungen, Objektdefinitionen, ...) können nach Belieben in einer Zweile oder jeder in einer eigenen Zeile geschrieben werden.
  • Dezimalzahlen werden mit Dezimalpunkt angegeben.
  • Die drei Komponenten eines Vektors werden in eckige Klammern [] gesetzt: [x, y, z]
  • Winkelangaben in Grad erhalten das Gradzeichen (°), z.B. 45°. Wird das ° weggelassen, so wir die Zahl als Winkel im Bogenmaß aufgefasst.
Ein weiteres wichtiges Element sind Kommentare:
  • Zwischen /* und */ kann ein Kommentarblock eingefügt werden. Alles, was zwischen /* und */ steht, wird vom Interpreter ignoriert. Dabei sind keine Verschachtelungen möglich.
  • Mit // kann am Ende einer Zeile ein Kommentar eingefügt werden. Alles zwischen // und Zeilenende wird vom Interpreter ignoriert.

[
nach oben]

Martin Melcher