Modelle mit Scripten animieren ed

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

Animationen abspielen ed

Die im Editor erstellten Animationen können auf drei 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 zurückgesetzt 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 der Funktion Model.OnIterate() ausgeführt werden.

Beispiel:

class MyModel : Model
    // die Variablen, die den Vortschritt der Animationen speichern
    float time_1, time_2

    overwrite void OnInit()
        time_1 = 0
        time_2 = 0

    overwrite void OnIterate()
        // Animationen abspielen lassen

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

        // Zurücksetzen der Animationsdaten
        ResetAnimation()

        // erste Animation
        Animate(MoveOpSet, 0, 0, // alles bisherige überschreiben
                23,              // Animation mit Index 23
                time_1,          // wird automatisch weiter gezählt
                Engine.elapsed,  // in Spielzeit weiter zählen
                v,               // abhängig von der Geschwindigkeit
                true)            // als Schleife

        // zweite Animation
        bool b = Animate(MoveOpNewKeyed, 0, 0, // überschreiben, nur wenn es wichtig ist
                         8,                    // Animation mit Index 8
                         time_2,
                         Engine.elapsed * 0.5, // in halber Spielzeit weiter zählen
                         0,                    // unabhängig
                         false)                // einmalig

    // zweite Animation
    bool b = m.Animate( MoveOpNewKeyed, 0, 0, // überschreiben, nur wenn es wichtig ist
                        8,                    // Animation mit Index 8
                        this._time_2,
                        Engine.elapsed * 0.5, // in halber Spielzeit weiter zählen
                        0,                    // unabhängig
                        false )               // einmalig

    overwrite void OnInit()

        // wir wollen selbst editieren!
        BeginEditAnimation()

        time = 0

    overwrite void OnIterate()

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

            // zugegebenermaßen nicht die sinnvollste Animation
            bone[i].cur_ang = vector(0, 0, time)

        time += Engine.elapsed