kurse:povray23:hilfenfuerprojekte

Generelle Hilfen

Die clock-Variable in POV-Ray läuft (normalerweise) von 0 bis 1 (ohne Angabe von +KC inklusive 1, mit +KC exklusive). Vielleicht haben Sie Ihre Animation in einem anderen Bereich parametriert, dann schlage ich folgendes vor:

// So läuft die Variable myclock von 0 bis 4
#declare myclock=4*clock;

Folgende Funktion gliedert sich in zwei Teile. Ich habe es nicht hingekriegt, eine bedingte Funktion direkt in POV-Ray zu realisieren. Darum eine eigene Funktion myif(bedingung, wennwahr, wennfalsch):

// Für bedingte Funktionen
#declare myif=function(bedingung, wennwahr, wennfalsch) {
        bedingung*wennwahr+(1-bedingung)*wennfalsch
}
 
// Folgende Funktion ist immer Null zwischen 0 und 0.7, danach steigt die Funktion linear durch den Punkt $(1,1)$.
#declare durchsichtig=function(zeit) { 
        myif(zeit<0.7, 0, (zeit-0.7)/0.3)
}
 
// Benutzung der Funktion
object {
   meinCoolesDing
   pigment { color rgbt <1,0,0,durchsichtig(clock)> }
}

Anstatt 20 (oder mehr) Bilder zu rendern, kann mit einem Trick auch ein einziges Bild mit allen Schritten gerendert werden. Der eigene Animationscode muss aber in eine Schleife eingepackt werden und es muss immer mit einer eigenen Zeitvariablen (z.B. myclock) gearbeitet werden.

// Kamera
// Licht
// Eigene zeitunabhängige Variablendefinitionen
 
#declare myclock=clock;  // Default Wert, damit die Animation dann gerendert werden kann.
 
#declare numFrames=20;  // Auf Eins setzen für normale Animation
#declare frame=0;
#while (frame<numFrames) // Hier < durch <= ersetzen, wenn das letzte Frame auch gerendert werden soll.
  #if (numFrames>1)
    #declare myclock=frame/numFrames;
  #end // if
 
  //
  // Hier der Animationscode, alles mit myclock (und nicht direkt clock)
  //
 
  #declare frame=frame+1;
#end // while

Man kann Macros definieren, die von Parmetern abhängen, z.B. wie folgt:

#include "transforms.inc"
 
#declare meinDing=union{
 // Grundkörper
}
#marcro meinCoolesDing(orientierung, zeit)
  object {
      meinDing
      rotate 360*zeit*z
      Reorient_Trans(z, orientierung)  // Dreht so, dass die z-Achse in Richtung des Vektors 'orientierung' zeigt
  }
#end
 
// Benutzung des Macros
object {
   meinCoolesDing(<1,1,1>, 0)
   pigment {color rgb x}
}
object {
   meinCoolesDing(<-1,-1,1>, 0.25)
   pigment {color rgb y}
}
// etc...

Hinweis: Die Vektoren <1,1,1>, ←1,-1,1>, ←1,1,-1> und <1,-1,-1> Zeigen zu den Eckpunkten eines regulären Tetraeders.

Wird eine Wurfparabel in folgender Form geschrieben (dazu sind wohl Umformungen nötig): \[ \vec{OP}(t) = \vec p_0 + t \cdot \vec v_0 + t^2 \cdot \vec a, \] dann ist der Geschwindigkeitsvektor der folgende: \[ \vec v(T) = \vec v_0 + 2\cdot t \cdot \vec a \]

Mit dieser Tangente kann dann z.B. ein Zylinder ausgrichtet werden.

difference {
   cylinder {0, z, 1 }  // Grundform
   cylinder {-0.1*z, 1.1*z,0.9 }   // Ausschnitt (sollte keine zusammenfallenden Flächen haben, darum von -0.1*z bis 1.1*z).
}
  • kurse/povray23/hilfenfuerprojekte.txt
  • Last modified: 2023/08/22 17:24
  • by Ivo Blöchliger