Modelle mit Scripten animieren ed

Animiert wird ein Modell (Model, bzw. model = Model*).

Animationen abspielen ed

Die im Editor erstellten Animationen können auf zwei Arten verwendet werden:

Standart-Fall ed

Bei einem neu geladenen Modell wird automatisch die erste Animation als Schleife abgespielt (diejenige, die im Editor den niedrigsten Index hat).

Script ed

Zuerst müssen mit Model.ResetAnimation alle bisherigen Animationsdaten des Modells gelöscht werden.

Das eigentliche Animieren geschieht mit Model.Animate. Sollen sich mehrere Animationen überlagern, wird diese Funktion mehrmals mit den Daten der unterschiedlichen Animationen aufgerufen. Man benötigt für jede Animation eine eigene Variable vom Typ float, die speichert, wie weit die Animation schon ist, diese wird an die Funktion übergeben und von dieser weitergezählt.

Wenn sich ein Modell kontinuierlich bewegen soll (was fast immer der Fall ist!), müssen diese Befehle in einer Schleife ausgeführt werden.

Beispiel:

#define _time_1		var[13]
#define _time_2		var[14]

void OnInit(model this)
    this.var.resize(16)

    // die Variablen, die den Vortschritt der Animationen speichern
    this._time_1 = 0
    this._time_2 = 0

void OnIterate(model this)
    // Animationen abspielen lassen

    // Geschwindigkeit des Objektes berechnen
    float v = VecLength(this.vel)

    // Zuruecksetzen der Animationsdaten
    m.ResetAnimation()

    // erste Animation
    m.Animate( MoveOpSet, 0, 0,        // alles bisherige ueberschreiben
               23,                     // Animation mit Index 23
               this._time_1,           // wird automatisch weiter gezaehlt
               Elapsed,                // in Spielzeit weiter zaehlen
               v,                      // abhaengig von der Geschwindigkeit
               true )                  // als Schleife

    // zweite Animation
    bool b = m.Animate( MoveOpNewKeyed, 0, 0, // ueberschreiben, nur wenn es wichtig ist
                        8,                    // Animation mit Index 8
                        this._time_2,
                        Elapsed * 0.5,        // in halber Spielzeit weiter zaehlen
                        0,                    // unabhaengig
                        false )               // einmalig

    // Test, ob die 2. Animation zu Ende ist
    if b
        // ...

Skelett direkt beeinflussen ed

Besitzt ein Modell (Model) ein Skelett, so gibt es den Array Model.bone[], der die aktuelle Ausrichtung (bone.cur_ang, bone.cur_pos) der einzelnen Knochen repräsentiert. Wird Model.BeginEditAnimation ausgeführt, so kann diese Array direkt durch ein Script beschrieben werden und die Engine verwendet es zur Animation des Modells.

bone.cur_ang ist dabei die Winkel-Ausrichtung der Knochen. bone.cur_pos ist die Positon eine freien Knochens (d.h. er hat keinen übergeordneten Knochen) relativ zur Objektmitte, und wird nur für freie Knochen verwendet!

Sobald Model.ResetAnimation ausgeführt wird, werden diese Variablen wieder ignoriert und es können auch wieder vorgefertigte Animationen abgespielt werden.

Beispiel:

#define _time		var[13]

void OnInit(model this)

    // wir wollen selbst editieren!
    this.BeginEditAnimation()

    this._time = 0

void OnIterate(model this)

    // alle Knochen beeinflussen
    int i
    for i, 0, this.bone.num

        // zugegebener Massen nicht die sinnvollste Animation
        this.bone[i].cur_ang = vector(0, 0, this._time)

    t += Elapsed