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
© 1997 Oberland Computer