Game Engine Math

KWEngine, Teil 10: Animationen von 3D-Modellen steuern

KWEngine kann 3D-Modelle mit vorgefertigten Animationen importieren. Die Animationen sind nicht separat erhältlich, sondern sind in die 3D-Modelldatei integriert.
Gängige Dateiformate für Modelle mit integrierten Animationen sind:

  • Filmbox (FBX)
  • glTF (GLB oder GLTF)
  • Collada (DAE)

Jede Animation hat unabhängig von ihrer Länge einen Start- und Endpunkt. Der Startpunkt wird mit der Zahl 0.0 (für 0%) gekennzeichnet, der Endpunkt mit der Zahl 1.0 (für 100%).

Es folgt ein Beispiel für eine Player-Klasse, in der bei Stillstand und Bewegung zwischen zwei Animationen (‚idle‘ und ‚walk‘) hin- und hergeschaltet wird.

class Player : GameObject
{
    // Merkt sich, ob die Figur im letzten Frame lief oder nicht:
    private bool  _isWalking = false;

    public override void Act()
    {
        bool animationSwitched = false;
    
        if(Keyboard.IsKeyDown(Keys.Left))
        {
            // Wenn die Spielfigur vorher still stand, 
            // muss ein Wechsel der Animation stattfinden:
            if(_isWalking == false)
            {
                animationSwitched = true;
                _isWalking = true;
            }
            MoveOffset(-0.01f, 0f, 0f);
        }
        if(Keyboard.IsKeyDown(Keys.Right))
        {
            // Wenn die Spielfigur vorher still stand, 
            // muss ein Wechsel der Animation stattfinden:
            if(_isWalking == false)
            {
                animationSwitched = true;
                _isWalking = true;
            }
            MoveOffset(+0.01f, 0f, 0f);
        }
        
        if(Keyboard.IsKeyDown(Keys.Left) == false && Keyboard.IsKeyDown(Keys.Right) == false)
        {
            // Wenn die Spielfigur sich vorher bewegt hat, 
            // muss ein Wechsel der Animation stattfinden:
            if(_isWalking == true)
            {
                animationSwitched = true;
                _isWalking = false;
            }
        }
        
        DoAnimation(_isWalking, animationSwitched);
    }
    
    private void DoAnimation(bool isWalking, bool animationSwitched)
    {
        // Wenn das Modell keine Animationen besitzt, beende die 
        // Methode vorzeitig:
        if(HasAnimations == false)
        {
            return;
        }

        // Wenn die Animation wechselt, muss der Stand der Animation
        // auf 0% zurückgesetzt werden:
        if(animationSwitched)
        {
            SetAnimationPercentage(0f);
        }
    
        if(isWalking == true)
        {
            // Jedes GameObject hat die Felder 
            // 'AnimationID' und 'AnimationPercentage'.
            // In diesem Beispielmodell hat die Laufanimation die ID 1:
            SetAnimationID(1);
            SetAnimationPercentageAdvance(0.001f);
        }
        else
        {
            SetAnimationID(0);
            SetAnimationPercentageAdvance(0.001f);
        }
    }
}

Jedes GameObject verfügt über die drei Methoden:

  • SetAnimationID()
  • SetAnimationPercentage()
  • SetAnimationPercentageAdvance()

Die AnimationID beginnt bei 0 zu zählen, so dass die erste im Modell gespeicherte Animation den Wert 0 hat. Die zweite hat den Wert 1, usw.
Die AnimationPercentage beinhaltet den aktuellen Stand der Animation. Setzt man für dieses Feld z.B. den Wert 0.25, so würde sich das 3D-Modell so ausrichten, dass es den Animationsstand bei 25% der Animation einnimmt.
Die Advance-Variante hingegen führt die gerade aktuelle Animation um den übergebenen Wert fort und springt automatisch an den Anfang der Animation zurück, wenn das Animationsende erreicht ist.

Sollte das importierte 3D-Modell keine Animationen beinhalten, kann die AnimationID nur den Wert -1 annehmen.


Beitrag veröffentlicht

in

von

Schlagwörter:

Kommentare

2 Antworten zu „KWEngine, Teil 10: Animationen von 3D-Modellen steuern“

  1. Avatar von Johnny

    Zeile 47 muss geändert werden.
    Alt/falsch:
    DoAnimation(isWalking, animationSwitched);
    Neu/richtig:
    DoAnimation(_isWalking, animationSwitched);

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.