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 den aktuellen Stand der Animation (in %):
    private float _animationPercentage = 0;

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

    public override void Act(KeyboardState ks, MouseState ms)
    {
        bool animationSwitched = false;
    
        if(ks.IsKeyDown(Key.Left))
        {
            // Wenn die Spielfigur vorher still stand, 
            // muss ein Wechsel der Animation stattfinden:
            if(_isWalking == false)
            {
                animationSwitched = true;
                _isWalking = true;
            }
            MoveOffset(-0.1f, 0f, 0f);
        }
        if(ks.IsKeyDown(Key.Right))
        {
            // Wenn die Spielfigur vorher still stand, 
            // muss ein Wechsel der Animation stattfinden:
            if(_isWalking == false)
            {
                animationSwitched = true;
                _isWalking = true;
            }
            MoveOffset(+0.1f, 0f, 0f);
        }
        
        if(ks.IsKeyDown(Key.Left) == false && ks.IsKeyDown(Key.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)
        {
            _animationPercentage = 0;
        }
    
        if(isWalking == true)
        {
            // Jedes GameObject hat die Felder 
            // 'AnimationID' und 'AnimationPercentage'.
            // In diesem Beispielmodell hat die Laufanimation die ID 1:
            AnimationID = 1;
            AnimationPercentage = _animationPercentage;
            
            // Jeden Frame sollte die Animation um ein kleines Stück
            // weitergeführt werden, damit die Animation später flüssig
            // aussieht:
            _animationPercentage = _animationPercentage + 0.01f;
            if(_animationPercentage > 1)
            {
                _animationPercentage = 0;
            }
        }
        else
        {
            AnimationID = 0;
            AnimationPercentage = _animationPercentage;
            
            _animationPercentage = _animationPercentage + 0.01f;
            if(_animationPercentage > 1)
            {
                _animationPercentage = 0;
            }
        }
    }
}

Jedes GameObject verfügt über die beiden Eigenschaften (Felder):

  • AnimationID
  • AnimationPercentage

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.
Das Feld 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.

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

2 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.