Programmierung von Animationseffekten

Dokumentation eines AnimFX-Objektes

Der erste AnimFX ist der Effekt "Rüttel(.AFX)". Er läßt ein Geo-Objekt rütteln. Da keine weiteren Objekte erzeugt oder benötigt werden, läßt sich Abfolge und Einsatz der verschiedenen Schlüsselwörter gut mitverfolgen, die monzoom® als Einsprungmarken dem Skript übergibt.

REFSKRIPT

; Aufruf moeglich mit folgendenen Parametern:

; (kein Parameter)

; INIT <objekt>

; START <objekt> <time1> <time2> <t> <picnr> <npics> <wire>

; PRE_RENDER <objekt> <time1> <time2> <t> <picnr> <npics> <wire>

; AFTER_RENDER <objekt> <time1> <time2> <t> <picnr> <npics> <wire>

; FINISH <objekt> <time1> <time2> <t> <picnr> <npics> <wire>

 

GET_N_PARAMS

GET_RESULT np

RETURN_IF_EQUAL np 0 ANIM_FX

; das RETURN antwortet der Anfrage von monzoom®: ja, bin ein ANIM_FX

; damit erkennt REF4, daß ich auch ein richtiges ANIM_FX-Werkzeug bin

 

GET_PARAM_NR 1

GET_RESULT modus

; in welchem Modus wird das Skript aufgerufen?

GET_PARAM_NR 2

GET_RESULT ich

; Name des AnimFX-Objektes. Wird ggf. gebraucht, um (wiederum per

; Skriptbefehl) auf sich selbst zugreifen zu koennen

 

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

;*****************************************************

 

>init:

; Init-Skript für AnimFX:

; wird innerhalb der AFX_init-routine aufgerufen

; hier werden alle internen Variablen allokiert;

; hier müssen die Anzahl der Objektvariablen festgelegt werden,

; sowie die internen Variablen allokiert und initialisiert

; und ein Zielobjekt für die Rauchwolke abgefragt werden

;

; Ergebnis:

; OK alles geklappt

; ER Fehler

; AB Abbruch

;

; ich brauche 1 Objektvariable,

; die enthält den Prozentsatz des Ruettels:

; bei 0 wird gar nicht geruettelt

; bei 1 wird maximal soviel geruettelt, wie das Objekt

; maximal in x,y,z-Richtung ausgedehnt ist

 

; Objekt abfragen

GET_GEO_OBJ Welches_Geo-Objekt_rütteln? 1

RETURN_IF_ABBRUCH AB

GET_RESULT ruettel_obj

 

; sich selbst umbenennen in rüttel-<objname>

ADD_STR ich - ruettel_obj

GET_RESULT ich1

OBJ_SET_NAME ich ich1

GET_RESULT ich

goto init1

 

>init_read:

; Hier wird das AnimFX-Objekt beim Einlesen aufgerufen;

; initialisiere die Variable ruettel_obj auf "----", damit sie

; vorne benutzt werden kann

SET_VAR ruettel_obj ----

 

>init1:

; ich brauche interne Variablen:

; 3 Reals, um Koordinate zwischenzuspeichern

; 1 Pointer-Obj, um Ruettel-Objekt zu speichern

 

AFX_ALLOK_INTERN_VARS ich 3 0 1

; Objekt 0 = Ruettel-Objekt

AFX_SET_OBJ ich 0 ruettel_obj

 

; jetzt eine Objektvariable für den Ruettelfaktor

; vereinbaren: sie heißt Faktor, Wertebereich von 0 bis 1

AFX_SET_N_OBJ_VARS ich 1

AFX_DEFINE_OBJ_VAR ich 0 1 Faktor 0 1

 

RETURN OK

;********************************************************

 

>start:

; hier mache ich noch nichts

RETURN OK

;*******************************************************

 

>prerender:

; hier das Ruettel-Objekt um Faktor mal Zufall aendern

; falls Faktor=0, dann nichts machen

OBJ_GET_VAR ich 0

GET_RESULT rfaktor

RETURN_IF_EQUAL rfaktor 0 OK

 

AFX_GET_OBJ ich 0

GET_RESULT ruettel_obj

; die Ausdehnung des Objektes abfragen

GEO_GET_BBOX ruettel_obj

GET_RESULT bbox

PRINT BBOX

wait_secs 0.1

; size abfragen, und dann dx dy dz durch size teilen

OBJ_GET_VAR ruettel_obj 6

GET_RESULT objsize

; x1,y1,z1 herausholen

COPY_WORD bbox 1

GET_RESULT x1

COPY_WORD bbox 2

GET_RESULT y1

COPY_WORD bbox 3

GET_RESULT z1

; dx,dy,dz herausholen

COPY_WORD bbox 4

GET_RESULT dx

COPY_WORD bbox 5

GET_RESULT dy

COPY_WORD bbox 6

GET_RESULT dz

SUB dx x1

GET_RESULT dx

SUB dy y1

GET_RESULT dy

SUB dz z1

GET_RESULT dz

 

MUL dx objsize

GET_RESULT dx

MUL dy objsize

GET_RESULT dy

MUL dz objsize

GET_RESULT dz

 

; jetzt Koordinaten abfragen und um maximal size in jeder

; Richtung bewegen (per zufall gesteuert )

GEO_GET_POS ruettel_obj 1

GET_RESULT pos

COPY_WORD pos 1

GET_RESULT x

COPY_WORD pos 2

GET_RESULT y

COPY_WORD pos 3

GET_RESULT z

; ich speichere die aktuelle Position, um bei afterrender

; diese wieder zu setzen

AFX_SET_REAL ich 0 x

AFX_SET_REAL ich 1 y

AFX_SET_REAL ich 2 z

 

; zufällige Bewegungsvektoren berechnen

RAND

GET_RESULT fak

FUNCTION (rfaktor*dx*(fak-0.5))

GET_RESULT dx

 

RAND

GET_RESULT fak

FUNCTION (rfaktor*dy*(fak-0.5))

GET_RESULT dy

 

RAND

GET_RESULT fak

FUNCTION (rfaktor*dz*(fak-0.5))

GET_RESULT dz

 

PRINT Rüttel-delta: dx dy dz

WAIT_SECS 0.2

; zur Position hinzuaddieren

ADD x dx

GET_RESULT x1

ADD y dy

GET_RESULT y1

ADD z dz

GET_RESULT z1

 

; und schliesslich Position setzen

GEO_SET ruettel_obj x1 y1 z1 1

 

RETURN OK

;*********************************************************************

 

>afterrender:

; ich setze das Ruettel-Objekt wieder auf gespeicherte

; Position zurueck

AFX_GET_OBJ ich 0

GET_RESULT ruettel_obj

 

AFX_GET_REAL ich 0

GET_RESULT x

AFX_GET_REAL ich 1

GET_RESULT y

AFX_GET_REAL ich 2

GET_RESULT z

 

GEO_SET ruettel_obj x y z 1

RETURN OK

;*********************************************************

 

>finish:

; nichts zu tun

RETURN OK

;**********************************************************

 

>get_objs:

; ich brauche kein Objekt, also returne ich -

RETURN OK-

;*********************************************************

 

>set_objs:

RETURN OK

;*********************************************************

 

>get_info:

; ich brauche keine Objekte, also returne ich 0

RETURN OK0

;*********************************************************

 

 

Zum zweiten dokumentierten AnimFX

Zurück zur Übersicht


© 1997 Oberland Computer