Modelle mit Scripten animieren ed

Animiert wird ein Modell (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 ModelMoveReset alle bisherigen Animationsdaten des Modells gelöscht werden.

Das eigentliche Animieren geschieht mit ModelMoveSet. 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:

void main()
{
    // Modell waehlen
    model m = this->model;

    // die Variablen, die den Vortschritt der Animationen speichern
    float time_1 = 0;
    float time_2 = 0;

    // Animationen abspielen lassen
    while(true){

        // Geschwindigkeit des Objektes berechnen
        float v = VecLength( this->Vel );

        // Zuruecksetzen der Animationsdaten
        ModelMoveReset( m );

        // erste Animation
        ModelMoveSet(  m,
                       MoveOpSet, 0, 0,        // alles bisherige ueberschreiben
                       23,                     // Animation mit Index 23
                       time_1,                 // wird automatisch weiter gezaehlt
                       elapsed,                // in Spielzeit weiter zaehlen
                       v,                      // abhaengig von der Geschwindigkeit
                       true );                 // als Schleife

        // zweite Animation
        bool b = ModelMoveSet( m,
                               MoveOpNewKeyed, 0, 0, // ueberschreiben, nur wenn es wichtig ist
                               8,                    // Animation mit Index 8
                               time_2,
                               elapsed * 0.5f,       // in halber Spielzeit weiter zaehlen
                               0,                    // unabhaengig
                               false );              // einmalig

        // Test, ob die 2. Animation zu Ende ist
        if ( b ){
            // ...
        }

        wait_of();
    }
}

Skelett direkt beeinflussen ed

Besitzt ein Modell (model) ein Skelett, so gibt es die Arrays BoneCurPos[] und BoneCurAng[], die die aktuelle Ausrichtung der einzelnen Knochen repräsentieren. Wird ModelMoveEditBegin ausgeführt, so können diese Arrays direkt durch ein Script beschrieben werden und die Engine verwendet sie zur Animation des Modells.

BoneCurAng ist dabei die Winkel-Ausrichtung der Knochen. BoneCurPos 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 ModelMoveReset ausgeführt wird, werden diese Variablen wieder ignoriert und es können auch wieder vorgefertigte Animationen abgespielt werden.

Beispiel:

void main()
{
    // irgend ein Modell auswaehlen...
    model m = ego->model;

    // wir wollen selbst editieren!
    ModelMoveEditBegin( m );

    float t = 0;

    while( true ){

        // alle Knochen beeinflussen
        int i=0;
        while( i < m->NumBones ){

            // zugegebener Massen nicht die sinnvollste Animation
            m->BoneCurAng = vector( t, t, t );
            i++;
        }

        wait_of();
        t += elapsed;
    }
}