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

Zurück zur Übersicht


© 1997 Oberland Computer