Animation (M.Trautmann)

Zurück zur Vortragliste Zum vorherigen Vortrag Zum nächsten Vortrag

 

1. Einführung

Mit POV-Ray erstellt man normalerweise Standbilder. Viel eindrucksvoller ist es aber, wenn sich dabei etwas bewegt. Soetwas bezeichnet man in der Computerwelt als Animation. Dort werden sie oft dadurch erzeugt, daß viele Bilder nacheinander angezeigt werde, die sich nur geringfügig unterscheiden. Das Gehirn nimmt eine geschickte Animation als fließende Bewegung wahr.

Auch POV-Ray kann Animationen berechnen. Man muß ihm dazu vorgeben, was sich von Bild zu Bild ändern soll, und aus wieviel Zwischenbildern die Animation besteht.

Zeile in einer INI-DateiKürzel als KomandozeilenparameterBedeutungDefaultwert
[Initial_Frame = n] [+KFIn] Bild n ist das erste Bild 1
Final_Frame = n +KFFn Bild n ist das letzte Bild -
[Initial_Clock = n.n] [+KIn.n] Anfangswert der Variablen clock ist n.n0.0
[Final_Clock = n.n] [+KFn.n] Endwert der Variablen clock ist n.n1.0

Um POV-Ray eine Animation berechnen zu lassen, muß im einfachsten Fall nur Final_Frame gesetzt werden. Es entspricht dann der Bilderanzahl der Animation. Ansonsten gilt:

Bildanzahl = Final_Frame - Initial_Frame + 1 

In POV-Ray ist es möglich mit

"#declare Name=Zahl"
eine Variable zu definieren. Diese können in einer POV/INC-Datei Zahlen ersetzen und verrechnen.

Berechnet POV-Ray eine Animation, so ist in der POV-Datei automatisch eine Variable clock definiert. Wenn Initial_Clock und Final_Clock nicht angegeben werden, so geht clock von 0 bis 1. Bei einer 3-Bilder-Animation z.B. hat clock beim ersten Bild den Wert 0, beim zweiten Bild den Wert 0.5 und beim dritten Bild den Wert 1.

Damit in dem zu rendernden POV-File nicht jedes Bild der Animation gleich aussieht, muß die Variable clock verwendt werden. Diese kann normale Zahlen/Konstanten ersetzen und beliebig verrechnet werden.

Als Dateinamen sollten jetzt nur noch kürzere Dateinamen angegeben werden, da die Nummer eines Bildes an den Dateinamen drangehängt wird, der insgesamt nur 8 Buchstaben haben darf. D.h. bei zweistelligen Bilderanzahlen sollte der Dateiname nur 6 Buchstaben lang sein.

 

 

2. Rechenfunktionen von POV-Ray

RechenfunktionBefehl in POV-Ray
Grundrechenarten(6-5*clock+3)/2
Sinus,Arcussinus von x (Trigonometrische Funktionen benötigen ihre Parameter im Bogenmaß)sin(x), asin(x)
Cosinus,Arcuscosinus von xcos(x), acos(x)
Tangens von xtan(x)
Arcustangens von a/batan(a,b)
x° im Bogenmaßradians(x)
a hoch bpov(a,b)
Quadratwurzel von xsqrt(x)
e hoch xexp(x)
Logarithmus von x zur Basis elog(x)
Aufrunden von xceil(x)
Abrunden von xfloor(x)
Schneidet Nachkommastellen von x abint(x)
Ganzzahlige Division von a durch bdiv(a,b)
Divisionsrest von a/bmod(a,b)
Der größere Wert von a und bmax(a,b)
Der kleinere Wert von a und bmin(a,b)
Zufallswert zwischen 0.0 und 1.0 (einschließlich)rand()

Handelt sich es bei einer Animation z.B. um eine Drehung, so entsteht bei einer Drehung um 360° wieder das selbe Bild, wie bei 0°. Wird POV-Ray mit +KC aufgerufen, so erreicht die Variable clock nicht ganz den angegebenen Endwert, damit das Erste Bild nicht gleich dem letzten ist. Der Eintrag Cyclic_Animation=true in eine INI-Datei hat den gleichen Effekt.

 

3. In Abschnitte aufteilen

Bei großen Animationen bietet es sich manchmal an, die Berechnung auf mehrere Rechner zu verteilen. Dabei hat man die Möglichkeit Initial_Frame und Final_Frame auf die Gesamtanzahl der Bilder der Animation zu setzen und jedem Rechner einen anderen Bereich mit Startnummer und Endnummer der Bilder anzugeben. Dabei sind folgende Kommandos interessant:

Zeile in einer INI-Datei Kürzel als
Komandozeilenparameter
Bedeutung
Subset_Start_Frame=n +SFnSetzt das Anfangsbild auf n
Subset_Start_Frame=0.n +SF0.n Setzt den Anfang des Bereichs auf n%
Subset_End_Frame=n +EFnSetzt das Endbild auf n
Subset_End_Frame=0.n +EF0.n Setzt das Ende des Bereichs auf n%

 

4. Bedingungen

In POV-Ray ist es möglich, bestimmte Befehle nur bedingt auszuführen. Syntax einer #if-Abfrage:
  #if ( Bedingung )
     ... Befehle ...
  #else
     ... Befehle ...
  #end

Die Bedingung kann z.B. ein Vergleich sein:

BedingungDie Befehle nach der #if-Anweisung werden ausgeführt ...
a > b wenn a größer b ist
a < b wenn a kleiner b ist
a = b wenn a gleich b ist
a != b wenn a ungleich b ist
a >= b wenn a größer oder gleich b ist
a <= b wenn a kleiner oder gleich b ist

Die Befehle nach #else werden ausgeführt, wenn die Bedingung nicht zutrifft!

Will man je nach Zustand einer Variable bestimmte Befehle ausführen, so kann man die #switch-Anweisung verwenden.

Syntax einer #switch-Anweisung:

  #switch ( Variable )
    #case ( Wert1 )
       ... Befehle ...
    #break
    #case ( Wert2 )
       ... Befehle ...
    #break
    #range ( VonWert1,BisWert1)
       ... Befehle ...
    #break
    ...
  #end

Die Befehle nach dem #case ( Wert1 ) werden nur ausgeführt, wenn die Variable gleich Wert1 ist. Gleiches gilt für die Befehle nach #case ( Wert2 ), wenn die Variable gleich Wert2 ist.

Die Befehle nach dem #range werden dagegen dann ausgeführt, wenn die Variable zwischen VonWert1 und BisWert1 liegt (je einschl. Randwert).

Es werden immer nur die ersten Befehle ausgeführt, für die die Bedingung erfüllt ist.

 

 

5. Schleifen

Manchmal kann es auch sinnvoll sein, eine Reihe von Befehlen mehrfach mit geringer Veränderung auszführen. In POV-Ray gibt es dafür sogenannte #while-Schleifen.

Syntax einer #while-Schleife:

  #while ( Bedingung )
     ... Befehle ...
  #end

Die Befehle werden solange ausgeführt, solange die Bedingung erfüllt ist.

Das folgende Beispiel erzeugt ein Feld von 3 auf 2 Würfel.

#declare x=0
#while (x < 3)
  #declare y=0
  #while (y < 2)
    box {< x*2-2.5,y*2-1.5,0 >,
         < x*2-1.5,y*2-0.5,1 >
        }
    #declare y=y+1
  #end
  #declare x=x+1
#end

 

6. Beispiel

Beispielanimation

SIMPLE.POV:

#include "colors.inc"
background {color Blue}

box {  < 0,-1,-1 >,< 1,2,2 >
       pigment {Red}
    }
box {  < -1,-1,0 >,< 2,2,1 >
       pigment {Green}
    }
box {  < -1,0,-1 >,< 2,1,2 >
       pigment {Blue}
    }

camera
{
  location < 0.5+5*cos(clock*2*pi),sin(clock*2*pi),0.5+5*sin(clock*2*pi) >
  look_at< 0.5,0.5,0.5 >
}

light_source
{
  < 0.6+5*cos(clock*2*pi),sin(clock*2*pi)+0.3,0.4+5*sin(clock*2*pi) > color White
}

SIMPLE.INI:

Input_File_Name=SIMPLE.POV

Final_Frame=40

Cyclic_Animation=on
Zurück zur Vortragliste