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

 

Zurück zur Übersicht


© 1997 Oberland Computer