Programmierung von Animationseffekten
3) AnimFX-Skript
Das Skript des AnimFX-Objekts wird von monzoom® zu bestimmten Anlässen aufgerufen:
1) Beim Initialisieren des Objektes - INIT-Aufruf
2) Bei Beginn der Animation - START-Aufruf
3) Am Ende der Animation - FINISH-Aufruf
4) Vor der Berechnung jedes Bildes - PRERENDER-Aufruf
5) Nach der Berechnung jedes Bildes - AFTERRENDER-Aufruf
Zu 2) ist das Gegenstück die 3),
zu 4) ist das Gegenstück die 5).
Dies sind die wichtigsten Aufrufe.
Es gibt zwar noch einge andere Aufrufe (s.u.), die z.B. mit dem Initialisieren des Objektes oder dem Abbruch und Wiederaufnehmen des Objektes zu tun haben, aber zum Verständnis der Arbeitsweise von AnimFX-Objekten sind diese fünf die wichtigsten.
Innerhalb dieser fünf Aufrufe hat das Skript die Möglichkeit, durch Skriptbefehle den gewünschten Animationseffekt zu realisieren. Dabei werden üblicherweise neue Objekte erzeugt oder verdoppelt, manipuliert, bewegt, gedreht, vergrößert und wieder gelöscht.
Die Aufrufe erfolgen immer nach dem gleichen Schema. monzoom® ruft das Skript mit einer Reihe von Parametern auf:
<Aufruf-Art> <AnimFX-Name> [<Startzeit> <Endzeit> <Zeitpunkt> <bildnr> <n_bilder> <wire>]
Diese Parameter kann das Skript mit dem Befehl
GET_PARAM_NR
abfragen.
Die einzelnen Parameter haben folgende Bedeutung:
<Aufruf-Art> Dies ist ein Text-String, der besagt, was für ein Aufruf dies ist. Er kann folgene Werte haben:
INIT Beim Objekt-Initialisieren
START Beim Beginn der Animation
FINISH Am Ende der Animation
PRERENDER Vor der Bildberechnung jedes Bildes
AFTERRENDER Nach der Bildberechnung jedes Bildes
neben den fünf gibt es weitere Aufrufarten:
INIT_READ
GET_OBJS
SET_OBJS
GET_INFO
<AnimFX-Name> Name des AnimFX-Objektes. Der Name wird gebraucht, um per Skriptbefehl auf sich selbst zugreifen zu können, z.B. um die eigenen Objekt- oder internen Variablen zu definieren.
<Startzeit><Endzeit>
Zeitdauer des Animation. Dies ist entweder das aktuelle Intervall bei Wire-Animationen oder aus dem Animjob-Fenster die Werte von Start und Ende bei Raytrace-Animationen.
<Zeitpunkt> Der genaue Zeitpunkt für das Bild, das jetzt berechnet wird.
<bildnr> Die aktuelle Bildnummer für das Bild, das jetzt berechnet wird.
<n_bilder> Aus wievielen Bilden die Animation insgesamt besteht.
<wire> Ein Flag, das besagt, ob es eine Wire-Animation (1) oder eine
Raytrace-Animation (0) ist.
Wichtig!
Ein Sonderfall tritt auf, wenn monzoom® das Skript ohne(!) Parameter aufruft. monzoom® macht dies, um zu prüfen, ob das entsprechende Skript-File auch wirklich zu einem AnimFX-Objekt gehört und nicht etwa nur die gleiche Endung (.afx) besitzt.
Wenn der Aufruf also ohne Parameter erfolgt, muß das Skript mit dem String
ANIM_FX
antworten, sonst bricht monzoom® die Aktion ab. Erfolgt der Aufruf dagegen mit Parametern, so müssen die ersten beiden Parameter auf jeden Fall geprüft werden. Die übrigen werden nur bei Bedarf benötigt.
Der erste Befehl sollte also das Feststellen der Parameteranzahl und die Rückgabe von ANIM_FX sein, falls diese Anzahl gleich 0 ist:
REFSKRIPT
GET_N_PARAMS
GET_RESULT np
RETURN_IF_EQUAL np 0 ANIM_FX
Falls die Parameteranzahl ungleich 0 ist, dann sollten als nächstes die beiden ersten Parameter gelesen werden und dementsprechend zu den betreffenden Programmteilen gesprungen werden:
GET_PARAM_NR 1
GET_RESULT modus
GET_PARAM_NR 2
GET_RESULT ich
IF_STR_EQUAL_GOTO modus INIT init
IF_STR_EQUAL_GOTO modus INIT_READ init_read
IF_STR_EQUAL_GOTO modus START start
IF_STR_EQUAL_GOTO modus PRE_RENDER prerender
IF_STR_EQUAL_GOTO modus AFTER_RENDER afterrender
IF_STR_EQUAL_GOTO modus FINISH finish
IF_STR_EQUAL_GOTO modus GET_OBJS get_objs
IF_STR_EQUAL_GOTO modus SET_OBJS set_objs
IF_STR_EQUAL_GOTO modus GET_INFO get_info
MELDUNG Falscher Aufruf
RETURN 0
Das Skript ließt den ersten Parameter in die Variable "modus" und prüft dann "modus" auf die verschiedenen Aufrufarten ab und springt jeweils zu der Marke, ab dem der Programmteil für den Aufruf steht. Paßt der Wert auf keinen der abgeprüften, gibt obiges Beispiel vor Beendigung eine Meldung auf falschen Aufruf aus.
In der Variable "ich" wird der <AnimFX-Name> gespeichert (siehe obige Beschreibung).
a) Der INIT-Aufruf
Wenn der Benutzer aus der Liste einen AnimFX-Effekt auswählt, erzeugt monzoom® ein neues AnimFX-Objekt (leer), ordnet diesem die dazugehörige Skriptdatei zu, gibt dem AnimFX-Objekt den Namen der Skriptdatei und ruft dann das Skript mit den Parametern
INIT <name>
auf. <name> ist der Name, den das AnimFX-Objekt bekommen hat.
Achtung!
Verlassen Sie sich nicht darauf, daß das automatisch der Name des Effekts ist. Wenn Sie z.B. ein AnimFX-Objekt mit dem Namen "explode" zweimal erzeugen, dann heißt das erste AnimFX-Objekt "explode", das zweite dagegen "explode1" (denn in monzoom® heißen zwei Objekte niemals gleich).
Das Skript, das (nach Prüfung des ersten Parameters) zur INIT-Marke springt, muß dann folgende Dinge erledigen:
1) Die Anzahl der Objektvariablen des AnimFX-Objektes muß festgelegt werden (mindestens 1). Dies geschieht mit dem Skriptbefehl
AFX_SET_N_OBJ_VARS
2) Die Objektvariablen müssen definiert werden. Dabei wird festgelegt, wie die Variable heißt, ob die Variable eine Float-Zahl oder eine Integer-Zahl aufnimmt, und wie der Bereich des Schiebereglers sein soll. Und zwar wird für das AnimFX-Objekt bei Bedarf auch ein Parametereditor-Fenster angelegt. Dort erhält jede hier vereinbarte Objektvariable ein Eingabefeld und einen Schieberegler.
3) Falls interne Variablen benötigt werden (was meistens der Fall ist), so muß die Anzahl der Variablen hier festgelegt werden. Dazu dient der Skriptbefehl
AFX_ALLOK_INTERN_VARS
Falls interne Pointer auf andere Objekte benötigt werden, beachten Sie unbedingt auch das Kapitel zu den internen Pointer-Variablen.
4) Falls nötig, muß das Skript noch vom Benutzer bestimmte Eingaben abfragen und diese dann in internen Variablen speichern.
5) Falls das Skript abbricht (z.B. weil der Benutzer bei der Frage nach einem Objekt den Requester abbricht), muß das Skript mit dem String AB returnen.
Beispiel:
GET_DREI_OBJ Dreiecksobjekt?
RETURN_IF_ABBRUCH AB
Falls ein Fehler auftritt, der im Skript abgefangen werden kann, so sollte das Skript mit dem String ER returnen. Hinter dem ER kann noch ein Text gesetzt werden, der als Fehlermeldung interpretiert wird und in einer Meldungsbox automatisch dargestellt wird.
Beispiel:
GET_STRING Körper?
RETURN_IF_ABBRUCH AB
GET_RESULT kp
KP_EXIST kp
GET_RESULT janein
IF_STR_EQUAL_GOTO janein JA weiter
; jetzt einen String erzeugen, der das Schlüsselwort ER
; und danach die Fehlermeldung enthält
ADD_STR ER Körper existiert nicht
GET_RESULT melde
RETURN melde
Die meisten Effekte beziehen sich auf Objekte. Ein Geo-Objekt soll z.B. rütteln, ein Dreiecksobjekt soll explodieren, ein Geo-Objekt soll auf ein anderes Geo-Objekt schießen,...
Hier sollten diese Objekte, auf die sich der Effekt bezieht, im INIT-Aufruf vom Benutzer abgefragt werden, und dann in internen Variablen gespeichert werden.
Beispiel:
REFSKRIPT
..
GET_PARAM_NR 1
GET_RESULT modus
GET_PARAM_NR 2
GET_RESULT ich
..
>init:
; Objektvariablen initialisieren.
.
.
.
; jetzt fragen, welches Objekt rütteln soll
GET_GEO_OBJ "Welches Objekt"
RETURN_IF_ABBRUCH AB
GET_RESULT obj
; nun eine interne Variable für Objekte anfordern
; (keine Real-, keine Int-Zahl, ein Objekt-Pointer)
AFX_ALLOK_INTERN_VARS ich 0 0 1
; jetzt das vom Benutzer gewählte Objekt in der
; internen Pointer-Variable 0 abspeichern.
AFX_SET_OBJ ich 0 obj
RETURN OK
Bei den folgenden Aufrufen (START, PRERENDER, ...) kann das Skript nun aus der internen Variable lesen, welches Objekt manipuliert werden soll.
>prerender:
; interne Pointer-Variable 0 lesen
AFX_GET_OBJ ich 0
GET_RESULT obj
; irgendetwas mit obj anstellen
.
.
.
Wichtig!
Ein AnimFX-Skript sollte beim INIT-Aufruf keine temporären Objekte erzeugen. Dafür eignen sich besser der START- oder PRERENDER-Aufruf, und zwar aus folgendem Grunde:
Zu jedem START-Aufruf gibt es immer einen FINISH-Aufruf und zu jedem PRERENDER-Aufruf gibt es immer einen AFTERRENDER-Aufruf. Ein Objekt, das bei START erzeugt wird, kann dann in FINISH gelöscht werden. Ein bei PRERENDER erzeugtes Objekt ebenso bei AFTERRENDER. Zu einem INIT-Aufruf gibt es aber keinen passenden Gegenaufruf.
Wenn Sie ein Objekt beim INIT-Aufruf erzeugen, kann es sein, daß der Benutzer das Skript gar nicht benutzt, sondern wieder löscht. Das Skript bekommt so nie die Gelegenheit, das bei INIT erzeugte Objekt wieder zu löschen.
b) Der START-Aufruf
Der START-Aufruf erfolgt, sobald der Benutzer eine Wire-Anim startet (und die Sequenz des AnimFX-Objektes aktiviert ist), oder wenn eine Raytrace-Animation per Anim-Job-Fenster gestartet wird.
Als Parameter bekommt das Skript folgende übergeben:
START <AnimFX-Name> <startzeit> <endzeit> <zeitpunkt> <bildnr> <n_bilder> <wire>
Falls für den Effekt Objekte nötig sind, die über mehrere Bilder oder gar während der ganzen Animation bestehen bleiben sollen, so sollten diese hier im START-Aufruf erzeugt werden.
Wichtig!
Alle Objekte, die im START-Aufruf erzeugt werden, sollten im FINISH-Aufruf wieder gelöscht werden. Die Objekte sollten dazu in internen Objektvariablen gespeichert werden, damit sie später wieder gelöscht werden können.
c) Der FINISH-Aufruf
Als Parameter bekommt das Skript folgende übergeben:
FINISH <AnimFX-Name> <startzeit> <endzeit> <zeitpunkt> <bildnr> <n_bilder> <wire>
Der FINISH-Aufruf kommt immer dann, wenn:
- Die Wire-Animation fertig gerechnet oder abgebrochen wurde.
- Die Raytrace-Animation fertig gerechnet oder abgebrochen wurde.
- Während der Abarbeitung eines Skripts ein Fehler auftritt, und die Animationsberechnung (Wire oder Raytrace) abgebrochen wird.
Spätestens beim FINISH-Aufruf sollten komplett alle Objekte wieder gelöscht werden, die im Verlauf der Animation von dem Skript erzeugt wurden.
d) Der PRERENDER-Aufruf
Als Parameter bekommt das Skript folgende übergeben:
PRERENDER <AnimFX-Name> <startzeit> <endzeit> <zeitpunkt> <bildnr> <n_bilder> <wire>
Der Aufruf erfolgt immer nachdem alle Sequenz interpoliert wurden. Bei Wire-Anims erfolgt der Aufruf unmittelbar vor dem Plotten der Szene im Fenster. (Sie brauchen im Skript keine Plotbefehle zu verwenden, denn nach der Abarbeitung der Skripts und vor dem Plotten wird das Plotfenster gelöscht; Plotbefehle sind nicht zu verwechseln mit PKL-Befehlen!)
Bei Raytrace-Anims (per Anim-Job) erfolgt der Aufruf unmittelbar bevor die Szene zum Rendern für Beams gespeichert wird.
Objekte, die nur für ein Bild benötigt werden, sollten Sie im PRERENDER-Aufruf erzeugen. Diese Objekte sollten dann im AFTERRENDER-Aufruf (s.u.) wieder gelöscht werden.
Wichtig ist hier auch der Parameter <wire>. Dieser sollte auf jeden Fall hier im PRERENDER-Aufruf getestet werden, denn daran kann erkannt werden, ob hier eine Wire-Anim (<wire>=1) oder eine Raytrace-Anim (<wire>=0) läuft.
Im Fall der Wire-Anim ist es mitunter von Nutzen, Geo-Objekte, die hier erzeugt wurden, in die PKL aufzunehmen, sonst sieht man nichts von ihnen. Bei Raytrace-Anims ist das dagegen nicht nötig, da immer die ganze Szene gespeichert wird. Dann werden alle PKL-Befehle wie z.B. der PKL_ADD-Befehl übersprungen (Ausnahme siehe unten, Spezialbefehle für Animationen: GEO_VISIBLE).
Beispiel:
GET_PARAM_NR 8
GET_RESULT wire
...
; Objekt erzeugen
OBJ_NEW ....
GET_RESULT obj
...
IF_EQUAL_GOTO wire 0 fertig
; bei Wire-Anim in PKL aufnehmen
PKL_ADD obj
>fertig:
...
Im PRERENDER-Aufruf werden normalerweise alle aktuellen Manipulationen an Geo-Objekten vorgenommen. Geo-Objekte werden manipuliert, Punkte bewegt, Materialien geändert usw. Diese Manipulationen sind meistens abhängig vom aktuellen Zeitpunkt oder von der aktuellen Bildnummer.
e) Der AFTERRENDER-Aufruf
Als Parameter bekommt das Skript folgende übergeben:
AFTERRENDER <AnimFX-Name> <startzeit> <endzeit> <zeitpunkt> <bildnr> <n_bilder> <wire>
Der AFTERRENDER-Aufruf kommt immer:
- Bei Wire-Animation nach jedem Bildzeichnen.
- Bei Raytrace-Animation unmittelbar, nachdem die Szene für Beams in eine Datei gespeichert wurde.
- Wenn während der Abarbeitung eines PRERENDER-Aufrufs eines Skripts ein Fehler auftrat.
Beim AFTERRENDER-Aufruf sollten die Objekte gelöscht werden, die während des PRERENDER-Aufrufs erzeugt wurden.
f) Weitere Aufrufarten
Neben obigen fünf Aufrufarten wurden zu Beginn weitere angesprochen bzw. aufgezählt. Diese finden Sie in später folgenden Abschnitten:
7) AnimFX-Objekte speichern und lesen
INIT_READ
8) Abbruch von Animationen
GET_INFO
GET_OBJS
9) Wiederaufnahme von abgebrochenen Animationen
SET_OBJS
© 1997 Oberland Computer