Programmierung von Animationseffekten
Dokumentation eines AnimFX-Objektes
Das zweite Skript ist der Effekt "Reifen(.AFX)". Im Unterschied zum vorigen Skript verwendet dieses Parameter, die im Falle eines Abbruchs einer zu berechnenden Animation mitgesichert werden müssen. Die Parameter können nicht aus dem Zustand der Animation errechnet werden, deshalb müssen sie mitgesichert werden. Wird die Berechnung später fortgesetzt, muß der Zustand wieder hergestellt werden, der zum Zeitpunkt des Abbruchs bestand.
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
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
;*****************************************************
>init:
; Ergebnis:
; OK alles geklappt
; ER Fehler
; AB Abbruch
;
; Objekt abfragen:
GET_GEO_OBJ Rad_vorne_links
RETURN_IF_ABBRUCH AB
GET_RESULT rad_vl
GET_GEO_OBJ Rad_vorne_rechts
RETURN_IF_ABBRUCH AB
GET_RESULT rad_vr
GET_GEO_OBJ Rad_hinten_links
RETURN_IF_ABBRUCH AB
GET_RESULT rad_hl
GET_GEO_OBJ Rad_hinten_rechts
RETURN_IF_ABBRUCH AB
GET_RESULT rad_hr
; sich selbst umbenennen in reifen-<objname>
ADD_STR ich - rad_vl
GET_RESULT ich1
OBJ_SET_NAME ich ich1
GET_RESULT ich
>init_read:
; ich brauche folgende interne Variablen
; 28 Reals: um Radien, Koordinaten und Orientierung
; der Raeder vom letzten Bild zu speichern,
; sowie 2*vorletzte Pos. = 4*(rad(1) + koord(3)+orient(3)),
; sowie die Radien in Weltkoordinaten
; 4 Objekt-Pointer für 4 Raeder und
; 1 AFX-Objekt, um die aktuellen Winkel der Raeder zu speichern.
AFX_ALLOK_INTERN_VARS ich 28 1 5
; objekt 0..3 = Raeder
AFX_SET_OBJ ich 0 rad_vl
AFX_SET_OBJ ich 1 rad_vr
AFX_SET_OBJ ich 2 rad_hl
AFX_SET_OBJ ich 3 rad_hr
AFX_SET_OBJ ich 4 ----
; Variable heißt Blockier und geht von 0 bis 1
AFX_SET_N_OBJ_VARS ich 1
AFX_DEFINE_OBJ_VAR ich 0 0 Blockier 0 1
AFX_SET_INT ich 0 0
RETURN OK
;********************************************************
>start:
; falls Integer-Variable ungleich 0, dann wurde ich von set_objs schon gesetzt
AFX_GET_INT ich 0
GET_RESULT flag
; falls flag=1 müssen wir keines erzeugen; dann wurde es schon gelesen
IF_EQUAL_GOTO flag 1 start1
; ein AFX-Objekt erzeugen, das die aktuellen Winkel der 4 Raeder aufnimmt
ADD_STR ich winkel
GET_RESULT afx1
OBJ_NEW afx1 25
GET_RESULT afx1
AFX_SET_OBJ ich 4 afx1
AFX_ALLOK_INTERN_VARS afx1 4 0 0
GOTO start1a
>start1:
AFX_GET_OBJ ich 4
GET_RESULT afx1
>start1a:
; aktuelle Position der Raeder lesen
SET_VAR i 0
>loop1:
; jedes Rad
PRINT i
AFX_GET_OBJ ich i
GET_RESULT rad
; Position erfragen
GEO_GET_POS rad 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
GEO_GET_ORIENT rad
GET_RESULT or
COPY_WORD or 1
GET_RESULT roll
COPY_WORD or 2
GET_RESULT steig
COPY_WORD or 3
GET_RESULT dreh
IF_EQUAL_GOTO flag 0 start2
; wir nehmen den Steigwinkel aus dem afx1
AFX_GET_REAL afx1 i
GET_RESULT steig
>start2:
MUL i 7
GET_RESULT j
; und in Real-variable(j) speichern
AFX_SET_REAL ich j x
ADD j 1
GET_RESULT j
AFX_SET_REAL ich j y
ADD j 1
GET_RESULT j
AFX_SET_REAL ich j z
ADD j 1
GET_RESULT j
AFX_SET_REAL ich j roll
ADD j 1
GET_RESULT j
AFX_SET_REAL ich j steig
ADD j 1
GET_RESULT j
AFX_SET_REAL ich j dreh
ADD j 1
GET_RESULT j
; radius berechnen = dz/2
GEO_GET_BBOX rad
GET_RESULT box
COPY_WORD box 3
GET_RESULT dz
DIV dz 2
GET_RESULT radius
GEO_GET_FATHER rad
GET_RESULT father
IF_STR_EQUAL_GOTO father ---- w1
GEO_PT_TO_WK father 0 0 radius
GET_RESULT res
COPY_WORD res 1
GET_RESULT xx
COPY_WORD res 2
GET_RESULT yy
COPY_WORD res 3
GET_RESULT zz
GEO_PT_TO_WK father 0 0 0
GET_RESULT res
COPY_WORD res 1
GET_RESULT x0
COPY_WORD res 2
GET_RESULT y0
COPY_WORD res 3
GET_RESULT z0
FUNCTION SQRT(((xx-x0)^2)+((yy-y0)^2)+((zz-z0)^2))
GET_RESULT radius
>w1:
AFX_SET_REAL ich j radius
ADD j 1
GET_RESULT j
ADD i 1
GET_RESULT i
IF_LESS_GOTO i 4 loop1
RETURN OK
;*******************************************************
>prerender:
; falls Faktor=0, dann nichts machen (nicht bremsen)
OBJ_GET_VAR ich 0
GET_RESULT rfaktor
PRINT rfaktor
RETURN_IF_NOT_EQUAL rfaktor 0 OK
; jetzt für alle räder:
; Abstand zur Position im letzten Bild feststellen,
; in Winkel entsprechend Radius umrechnen;
; Rad entsprechend drehen
SET_VAR PI 3.14159
AFX_GET_INT ich 0
GET_RESULT flag
AFX_SET_INT ich 0 0
AFX_GET_OBJ ich 4
GET_RESULT afx1
SET_VAR i 0
>loop2:
; jedes Rad
AFX_GET_OBJ ich i
GET_RESULT rad
; Position erfragen
GEO_GET_POS rad 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
; letzte Position abfragen
MUL i 7
GET_RESULT j
AFX_GET_REAL ich j
GET_RESULT x1
ADD j 1
GET_RESULT j
AFX_GET_REAL ich j
GET_RESULT y1
ADD j 1
GET_RESULT j
AFX_GET_REAL ich j
GET_RESULT z1
ADD j 1
GET_RESULT j
AFX_GET_REAL ich j
GET_RESULT roll
ADD j 1
GET_RESULT j
AFX_GET_REAL ich j
GET_RESULT steig
ADD j 1
GET_RESULT j
AFX_GET_REAL ich j
GET_RESULT dreh
ADD j 1
GET_RESULT j
AFX_GET_REAL ich j
GET_RESULT radius
; Abstand zu letzter Position berechnen
FUNCTION SQRT(((x-x1)^2)+((y-y1)^2)+((z-z1)^2))
GET_RESULT abst
FUNCTION (abst*360)/(2*PI*radius)
GET_RESULT winkel
PRINT rad radius abst winkel
ADD steig winkel
GET_RESULT winkel
; falls flag=1, dann wird der Winkel nicht veraendert,
; sondern der aus afx verwendet
IF_EQUAL_GOTO flag 0 pre2
AFX_GET_REAL afx1 i
GET_RESULT winkel
>pre2:
GEO_SET_ORIENT rad roll winkel dreh
; jetzt noch Position und neue Orientierung speichern
MUL i 7
GET_RESULT j
AFX_SET_REAL ich j x
ADD j 1
GET_RESULT j
AFX_SET_REAL ich j y
ADD j 1
GET_RESULT j
AFX_SET_REAL ich j z
ADD j 1
GET_RESULT j
AFX_SET_REAL ich j roll
ADD j 1
GET_RESULT j
AFX_SET_REAL ich j winkel
ADD j 1
GET_RESULT j
AFX_SET_REAL ich j dreh
AFX_SET_REAL afx1 i winkel
ADD i 1
GET_RESULT i
IF_LESS_GOTO i 4 loop2
RETURN OK
;*********************************************************************
>afterrender:
RETURN OK
;*********************************************************
>finish:
; winkel-afx löschen
AFX_GET_OBJ ich 4
GET_RESULT afx1
IF_STR_EQUAL_GOTO afx1 ---- finish1
AFX_SET_OBJ ich 4 ----
OBJ_DEL afx1
>finish1:
RETURN OK
;**********************************************************
>get_objs:
; winkel-afx-objekt
AFX_GET_OBJ ich 4
GET_RESULT afx1
ADD_STR OK afx1
GET_RESULT res
RETURN res
;*********************************************************
>set_objs:
GET_PARAM_NR 3
GET_RESULT afx1
AFX_SET_OBJ ich 4 afx1
AFX_SET_INT ich 0 1
RETURN OK
;*********************************************************
>get_info:
;
GET_PARAM_NR 3
GET_RESULT ask_info
; abfragen, was für Information gewuenscht ist
IF_EQUAL_GOTO ask_info 1 create_obj
; kein Information, die ich liefern kann; returne also 0
RETURN OK0
>create_obj:
; reifen.afx braucht ein Objekt, also liefere ich 1
RETURN OK1
;*********************************************************
Zum ersten dokumentierten AnimFX
© 1997 Oberland Computer