HomeMapIndexSearchNewsarchivesLinks/about LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Carlos Calzada

Über den Autor
Ich habe einen  Abschluß in Informatik. Computergrafik fasziniert mich seit meinem ersten Spektrum Rechner. Ich bin wirklich begeistert von Linux, der Philosopie, die seiner Entwicklung zugrunde liegt und prinzipiell allem, was nichts mit Micro$oft zu tun hat. Daneben zählen noch Bonsais und Aquarien zu den Dingen, mit denen ich mich in meiner Freizeit beschäftige.

M@ail an den Autor

Inhalt
Einführung
Grundlegendes der Kamerapositionierung 
Motion Blur
Depth of Field

RenderMan II - Grundlegendes über die Kamerapositionierung

[Ilustration]

Zusammenfassung

In diesem zweiten Artikel über RenderMan wird die Konfigurierung und Positionierung der Kamera diskutiert, sowie Spezialeffekte betrachtet, die dadurch erreicht werden können. Obwohl die Positionierung nicht ganz so intuitiv wie bei Pov-Ray ist, weist sie Vorteile bei der Beschreibung der Bewegungen der Kamera auf. Dieser letzte Punkt wird zum Teil auch im dritten Artikel über RenderMan behandelt.


Einführung

In diesem zweiten Artikel wird das Kameramodell von RenderMan im Detail betrachtet. Die Kamera ist eines der wichtigsten Elemente eines Renderers. 
Durch sie können einige der interessantesten Effekte, wie etwa Motion Blur (auftretender Effekt bei der Photographie von bewegten Objekten) und Depth of Field (Fokussierung) realisiert werden. Auch wenn viel mehr Effekte mittels der Kamera erreicht werden könnten, zum Beispiel Lens Flare (Lichtschein, der bei der Photographie von Lichtquellen auftreten kann),  hätte dies das Kameramodell zu kompliziert gemacht. Stattdessen können diese Effekte bei der Manipulation von Eigenschaften der Objekte erreicht werden, und zwar mittels eines komplexen Systemes von Shadern (Shader, als Werkzeuge, die Texturen auf den Objekten rendern). Durch den Gebrauch von Gruppen von Shadern können eigene "Shader" konstruiert und so recht eindrucksvolle Effekte erzeugt werden. Der Vorgang, Shaders zu programmieren und zu kompilieren wird in späteren Artikeln diskutiert, da  es zweifellos ein recht umfangreiches Thema ist (sehr, sehr umfangreich...auch fehlt mir zum Teil noch das nötige Wissen). 

Wie im vorhergehenden Artikel beschrieben, muß Folgendes für das Rendern eines Bildes eingegeben werden:

rendrib fichero.rib
für die Ausgabe in eine Datei 
rendrib -d fichero.rib
für die Bildschirmausgabe.

Grundlegendes der Kamerapositionierung

Das Koordinatensystem der Kamera ist ein Linkssystem und deckt sich mit der Oberfläche des Monitors. Der Koordinatenursprung liegt im Mittelpunkt des Bildschirms. Die X Achse weist nach rechts, die Y Achse nach oben und die Z Achse in den Monitor. Standardmässig ist das "gegenwärtige Koordinatensystem" identisch mit dem System der Kamera, genau, wie in der ersten Abbildung gezeigt wird (X in Rot, Y in Grün und Z in Blau). Die erste Abbildung zeigt die Szene aus der Vogelperspektive, die zweite Abbildung stellt die gerenderte Szene dar (die Lichtquellen sind in beiden Bildern verschieden, damit diese klarer sind). Auch wenn die Szene nicht sonderlich komplex ist (in Wahrheit sieht sie furchtbar aus), reicht sie aus, um die RIB Beispieldateien zu verstehen, ohne durch komplexe geometrische Modelle abgelenkt zu werden.

Nun wird die Positionierung der Kamera betrachtet. Es ist nur logisch, vorallem für Benutzer von Pov-Ray, dafür die Kamera zu bewegen. Um die Szene von einer weiter entfernten Position zu betrachten, müßte die Kamera auf die Position (0,0,-20) gesetzt werden. Dies entspricht einer Rückwärtsbewegung der Kamera. Bei RenderMan wird diese Kamerabewegung durch das Kommando Translate 0 0 -20 realisiert und zwar vor dem  WorldBegin:

Allerdings hat das Kommando die Kamera vorwärts bewegt! In Wirklichkeit war es nicht die Kamera sondern das Koordinatensystem, daß bewegt worden ist,  nach hinten verschoben wurde und so die Kamera nach vorn gebracht hatte. Also muß das genaue Gegenteil getan werden, wenn die Kamera nach hinten bewegt werden soll: eine Bewegung nach vorne. Dies sollte man sich nicht als Kamerabewegung, sondern als Verschiebung des Koordinatensystemes vorstellen (mittels Translate 0 0 20). 

Nun befindet sich die Kamera genau an der gewünschten Stelle. Von nun an beziehen sich alle Veränderungen der Geometrie der Szene auf das gegenwärtige Koordinatensystem. Im nächsten Beispiel bleibt das Modell im Ursprung, allerdings rotiert die Kamera um das Objekt:

Die RIB Datei mit den geometrischen Transformationen der Kamera sieht wie folgt aus:

Display "camara_default2.tif" "file" "rgb"
Projection "perspective" "fov" 45
Format 320 240 1

LightSource ämbientlight" 1 "intensity" 
            0.3 "lightcolor" [1 1 1]
LightSource "distantlight" 2 "intensity" 
            1.0 "from" [10 10 -10] "to" [0 0 0]

Translate 0 0 20
Rotate 45 1 0 0
Rotate 135 0 1 0

WorldBegin
        Color 1 1 1
        # Background blanco
        Sphere 10000 -10000 10000 360 

        # Objeto de la escena
        TransformBegin
                Color 1 0 0
                Sphere 3 -3 3 360
        TransformEnd
        TransformBegin
                Rotate -90 1 0 0
                Translate 0 0 2
                Cone 3 3 360
                Disk 0 3 360
        TransformEnd
        TransformBegin
                Rotate -90 0 1 0
                Cylinder 1 -4 4 360
                Disk 4 1 360
                Disk -4 1 360
        TransformEnd
WorldEnd


Es gibt eine Verschiebung  (Translate 0 0 20) und zwei Rotationen, eine um die X Achse (Rotate 45 1 0 0) und eine um die Y Achse (Rotate 135 0 1 0).  Es kann durchaus sein, daß Pov Ray Benutzer von der Abfolge der Operationen in diesem Beispiel irritiert sind, da sie gewohnt sind, daß Operationen in der Reihenfolge ihres Erscheinens angewandt werden. Jedoch ist dies bei RenderMan anders. Viemehr werden die Operationen in einer Warteschlange gehalten, bis ein entsprechendes Token gefunden wird (in diesem Beispiel WorldBegin). Erst dann werden die Operationen wirklich auf die Szene angewandt. Aufgrund der Art und Weise der Verwaltung der Schlange werden die Operationen in der umgekehrten Reihenfolge ausgeführt, d.h. die zuletzt aufgeführte Operation wird als erste angewandt. Deshalb sollten die geometrischen Operationen des Beispieles  wiefolgt interpretiert werden:
 
1. Ausgangssituation 
2. Rotation des Koordinatensystemes um 135 Grad um die Y Achse
3. Rotation des Koordinatensystemes um 45 Grad um die X Achse
4. Verschiebung des Koordinatensystemes um 20 Einheiten entlang der Z Achse 

Es sollte nie vergessen werden, daß alle Änderungen des gegenwärtigen Koordinatensystemes (Rotationen und Verschiebungen) immer relativ zu der Kamera sind. Deswegen sollte eine Rotation um die X Achse als "Rotation um die X Achse der Kamera" verstanden werden. 

Nun kommt der interessanteste Teil des Artikel, nämlich, wie das RenderMan Kameramodell benutzt werden kann, um Spezialeffekte zu erzeugen.

Motion Blur (Simulation bewegter Objekte)

Motion Blur ist der erste mittels Kamera erzeugte Effekt. Er imitiert die verschwommenen Konturen, die ein bewegtes Objekt auf einem Film hinterläßt.

Der Effekt wird durch das Einfügen des Befehles Shutter 0 1 in den Teil der Beispieldatei, der für die Kameraspezifikationen zuständig ist, erzeugt. Dieses Kommando simuliert die Belichtungszeit, in diesem Fall die Öffnung des Verschlusses zum Zeitpunkt 0 für genau eine Zeiteinheit. Die Werte 0 1 für die Blende sind dabei recht allgemein, sodaß diese Parameter in Zukunft benutzt werden, da sie nur einen bestimmten Teil des Kameraverhaltens in RenderMan beeinflußen.

Als nächstes müssen die Objekte gewählt werden, die in der Szene bewegt werden sollen. Dafür wird das Befehlspaar MotionBegin/MotionEnd eingesetzt. Die folgenden Abbildungen zeigen das Beispiel eines sich bewegenden Balles (und die dazugehörige RIB Datei), und zwar von den Koordinaten 0 10 5 zum Zeitpunkt 0 zu den Koordinaten 5 10 0 zum Zeitpunkt 1. Die Anweisung MotionBegin [0 1] in der RIB Datei gibt RenderMan an, zu welchem genauen Zeitpunkt die Transformationen gehören (Instanz 0 korrespondiert zu Ersterem, Instanz 1 zu Letzterem) und die Werte müssen mit denen des Shutter Abschnittes übereinstimmen. Die Abbildung zeigt ganz klar, wie realistisch der Effekt wirkt; in einer Animation verstärkt sich dies natürlich noch.

Die Operationen, die zwischen MotionBegin und MotionEnd stehen dürfen, beschränken sich natürlich nicht nur auf Verschiebungen. RenderMan kann nicht-lineare Bewegungen in Verbindung mit Motion Blur rendern. Im nächsten Beispiel wird eine Rotationen der Koordinatenachsen um 25 Grad um die Y Achse demonstriert: 

Normalerweise bewegen sich nur die Objekte einer Szene. RenderMan jedoch bietet zusätzlich die Möglichkeit, die Kamera selbst zu bewegen, wodurch der Effekt des Motion Blur auch auf die Kamera angewandt werden kann. In diesem Beispiel wird die Kamera 5 Einheiten nach rechts bewegt (z.B. durch Bewegen des Koordinatensystemes um 5 Einheiten nach rechts), und alle Objekte in der Szene werden unscharf. Natürlich muß ein Paar MotionBegin/MotionEnd in der RIB Datei innerhalb der Kamerasektion stehen:

Depth of Field (Fokussierung)

Zum Schluß wird noch ein anderer interessanter Effekt vorgestellt, den RenderMan anbietet: "Depth of Field", oder auch Mechanismus zur Fokussierung der Kamera. Die Anweisung hierfür lautet DepthOfField. Sie erwartet drei Parameter: f-stop, fov (field of view) and focus-lenght (focal length). Der erste Parameter, f-stop, bestimmt die Reichweite des Focus, in diesem Beispiel erscheinen alle Objekte, die 2 Einheiten oder noch weniger von der Kamera entfernt waren, gleich fokussiert/defokussiert. fov wird allgemein auf 1.0 gelassen, wenn vorher die Perspektive als Projection "perspective" "fov" 45 definiert worden ist (wie hier). Eine Änderung dieses Wertes auf eine Zahl ungleich 1 wechselt das perspektivische Sichtfeld um diese Größenordnung. Zum Schluß bleibt noch focus-length, welches der eigentlich interessante Paramter ist. Er definiert den Abstand, den ein Objekt haben muß, um auf den Bild als außerhalb des Fokusses zu erscheinen. Im folgenden Beispiel befindet sich die Kamera im Ursprung und die drei Kugeln je 10,20 und 30 Einheiten entfernt von ihr. Es werden beispielhaft verschiedene Werte für den Parameter focus-length demonstriert.

Beim ersten Bild wird DepthOfField 2.0 1.0 10 benutzt, wodurch alle Objekte, die 10 Einheiten von der Kamera entfernt sind, fokussiert sind (die rote Kugel):

Im zweiten Fall wird  DepthOfField 2.0 1.0 20  eingesetzt. Nun ist die grüne Kugel, 30 Einheiten von der Kamera entfernt, im Fokus:

Damit zum Schluß auch die letzte Kugel fokussiert wird  (30 Einheiten entfernt), muß DepthOfField 2.0 1.0 30 angegeben werden:

Die erreichten Effekte geben den erzeugten Bildern einen größeren Realismus. Natürlich steigt durch sie die für die Bilder benötigte Rechenzeit, beide Effekte, Motion Blur und Depth of Field erfordern mehrere Durchgänge des Renderers.


Übersetzung: Harald Radke
Webpages maintained by Miguel Ángel Sepúlveda
© Carlos Calzada 1998
LinuxFocus 1998