Programmierung von Animationseffekten
8) Abbruch von Animationen
Wenn eine Animation mit AnimFX-Objekten abgebrochen wird, gilt es bei manchen AnimFX-Objekten einiges zu beachten. Für ein AnimFX-Objekt stellt sich dabei die Frage: Kann ich meinen Zustand wieder genauso herstellen, wie er vor dem Abbruch war?
Man fragt sich zuerst, was Schwierigigkeiten bereiten könnte. Probleme treten auf, wenn der Zustand des Effektes sich nicht unmittelbar aus der aktuellen Szene oder der aktuellen Zeit wiederherstellen läßt.
Problemlos ist z.B. der Flügel-Effekt. Der berechnet die Stellung der Flügel aus seinen Objektvariablen und der aktuellen Zeit mithilfe einer Sinusfunktion.
Problematisch ist es aber bei Effekten, bei denen Zwischenobjekte erzeugt (und manipuliert) wurden, die sich nicht mehr einfach aus dem Zeitpunkt oder der Bildnummer rekonstruieren lassen.
Partikelobjekte sind ein Beispiel dafür. Hier ist meist für jeden Partikel ein eigener Bewegungsvektor sowie weitere Daten gespeichert, die sich während der Animation ständig ändern.
Partikel entstehen oft entlang der Flugbahn sich bewegender Geo-Objekte, und außerdem wird bei Partikelobjekten häufig ein Zufallszahlengenerator verwendet.
Beispielsweise wird der Dampf-Effekt oft benutzt, um bei fliegenden Objekten eine "Rauchfahne" hinterher zu ziehen. Um das Partikelobjekt, das die Rauchfahne darstellt wieder genauso, wie vor dem Bildabbruch zu rekonstruieren, müßte die in dem Fall auch die Flugbahn der Objektes nachinterpoliert werden.
Kurz gesagt, es kann für manche AnimFX-Objekte schwierig sein, ihren Zustand nach einem Abbruch zu rekonstruieren.
Deshalb gibt es für AnimFX-Objekte die Möglichkeit, Objekte, die sie erzeugt haben, nach einem Abbruch in einer Datei zwischenzuspeichern.
Wird die Animation wieder weitergerechnet, so kann monzoom® die gespeicherten Objekte wieder einlesen. An der gleichen Stelle wird dann weitergerechnet.
Das AnimFX-Objekt muß nun nicht selber die Objekte in einem File abspeichern, sondern monzoom® übernimmt diese Aufgabe. monzoom® will nur von dem Skript wissen, ob es Objekte zum Abspeichern hat und wenn ja, welche.
Für alle AnimFX-Objekte, für die das zutrifft, speichert monzoom® die Objekte in einer
Szenendatei, die genauso wie die Job-Datei heißt, nur hat sie die Dateiendung .AF2. Welche Objekte das sind und zu welcher AnimFX-Objekt sie gehören, speichert monzoom® in einer Textdatei, die mit .AF1 endet.
Um nun vom AnimFX-Objekt zu erfahren, ob es Objekte speichern will, verwendet monzoom® wieder spezielle Skript-Aufrufe. Mit folgendem Aufruf fragt monzoom®, ob das AnimFX-Objekt Objekte speichern muß:
GET_INFO <animfx_name> 1
Das Skript muß einen String returnen, dessen erste zwei Buchstaben "OK" lauten (zum Zeichen, daß es den Aufruf verstanden hat) und daran muß eine '0' gehängt werden, wenn kein Objekt zu speichern ist oder eine '1', wenn ein (oder mehrere) Objekte zu speichern sind.
Beispiele:
oben im Skript wird nach modus unterschieden:
IF_STR_EQUAL_GOTO modus GET_INFO get_info
1) das Flügel-animfx braucht keine Objekte, also returned es OK0
>get_info:
;
; ich brauche keine Objekte, also returne ich 0
RETURN OK0
2) das Pen3D-AnimFX braucht ein Polygon, also liefert es OK1
>get_info:
;
GET_PARAM_NR 3
GET_RESULT ask_info
; abfragen, was für Information gewünscht ist
IF_EQUAL_GOTO ask_info 1 create_obj
; kein Information, die ich liefern kann, returne also 0
RETURN OK0
>create_obj
RETURN OK1
Die 1 als Aufrufparameter sagt aus, daß monzoom® wissen will, ob Objekte gespeichert werden sollen. (Eventuell gibt es zukünftig weitere Informationen, die monzoom® will.)
Als nächstes muß monzoom® nun wissen, welches (oder welche) Objekte gespeichert werden sollen. Hierzu gibt es den Aufruf:
GET_OBJS <animfx_name>
Hierbei ist das Skript aufgefordert, die Namen der Objekte zu liefern, die im AF2-File gespeichert werden sollen. Das Skript sollte dann einen String bauen, bei dem sich die Namen der gewünschten Objekte aneinanderreihen. Die Reihenfolge ist dabei beliebig. (Beim Wiederaufnehmen der Animation bekommt das AnimFX die Objekte in der gleichen Reihgenfolge mit dem SET_OBJS-Aufruf geliefert.)
Das Skript muß wieder einen String liefern, der als erste zwei Buchstaben "OK" enthält. Anschließend kommt der(die) Name(n) des(der) Objektes(Objekte), das(die) gespeichert werden soll(sollen). Die Objektnamen werden durch ein ' ' (Leerzeichen) getrennt. In nachfolgendem Beispiel beinhaltet die Variable "res" der Befehlszeile "RETURN res" einen zusammengesetzten String, nämlich "OK poly_obj".
Werden hingegen keine Objekte benötigt, steht als drittes Zeichen "-". Dies hat die Befehlszeile "RETURN OK-" zur Folge.
Beispiel: Pen3D
oben im Skript wird nach modus unterschieden:
IF_STR_EQUAL_GOTO modus GET_OBJ get_objs
...
>get_objs:
; ich muß alle internen Objekte liefern, die ich besitze und
; die gespeichert werden sollen
; mein Polygon-Objekt steht in der internen Objektvariable Nr. 2
AFX_GET_OBJ ich 2
GET_RESULT poly_obj
; sicherheitshalber testen, ob es schon erzeugt war
IF_STR_EQUAL_GOTO poly_obj ---- ret1
ADD_STR OK poly_obj
GET_RESULT res
RETURN res
>ret1:
RETURN OK-
monzoom® fragt also alle AnimFX-Objekte, ob sie Objekte zum Speichern haben. Diejenigen, die "ja, ich" rufen, werden dann gefragt, welche Objekte das schließlich sind. Sodann schreibt monzoom® alle diese Objekte (und nur diese!) in ein AF2-File. Die Information, welches Objekt zu welchem AnimFX gehört, schreibt er in AF1-File.
Wichtig!
Nur solche Objekte dürfen hier zum Speichern angegeben werden, die im AnimFX im Zuge der Animation erzeugt wurden.
Normale Objekte der Szene hier bitte nicht angeben!
Auch Objekte die sich per Skript rekonstruieren lassen, sollten hier nicht angegeben werden.
Dieser Vorgang wird bei einer Raytrace-Animation vor jeder Bildberechnung vorgenommen. Dadurch ist der Zustand der AnimFX-Objekte gesichert, falls die Animation abgebrochen wird oder gar der Rechner abstürzt.
© 1997 Oberland Computer