Game Engine Math

KWEngine, Teil 15: Abprallen bei Kollision

Kollidiert ein Objekt mit einem anderen Objekt, kann es von diesem abprallen, indem es seine Ausrichtung (Rotation) neu berechnet. Die Ausrichtung ist dabei abhängig von der Kollisionsfläche und ihrer Ausrichtung. Die Ausrichtung einer Fläche wird durch einen Vector3 bestimmt – die ColliderSurfaceNormal.

Die ColliderSurfaceNormal ist eine Art Pfeil, der senkrecht auf der Fläche steht:

Die ColliderSurfaceNormal (Ebenenvektor) wird dazu verwendet, mit Hilfe des Eingangswinkels den dazugehörigen Ausgangswinkel zu berechnen. Jede Kollision (Intersection-Objekt) beinhaltet diesen Vektor.

KWEngine bietet hier die passenden Hilfsmethoden bereits an. Es folgt ein Beispiel aus Sicht des abprallenden Objekts:

using System;
using KWEngine3;
using KWEngine3.GameObjects;
using KWEngine3.Helper;
using OpenTK.Mathematics;

public class Player : GameObject
{

    public override void Act()
    {
        Move(0.1f);
        
        Intersection i = GetIntersection();
        if(i != null)
        {
            // Zunächst wird die eigentliche Kollision behandelt,
            // indem das Objekt so korrigiert wird, dass es nicht
            // mehr mit dem anderen Objekt kollidiert:
            Vector3 mtv = i.MTV;
            MoveOffset(mtv);
    
            // Der Eingangswinkel wird durch die aktuelle Blick-
            // richtung bestimmt, also benötigen wir den Look-At-Vektor:
            Vector3 lookAtVector = LookAtVector;

            // Jetzt wird dieser Vektor so gedreht, dass er in die 
            // abgeprallte Richtung zeigt:
            Vector3 newLookAtVector = HelperVector.ReflectVector(
                lookAtVector,             // Eingangswinkel
                i.ColliderSurfaceNormal // Ebenenvektor
            );

            // Mit TurnTowardsXYZ kann man das Objekt dazu bringen,
            // sich in Richtung einer Position auszurichten. In diesem Fall
            // wird die neue Blickrichtung auf die aktuelle Position
            // addiert und dem Objekt anschließend befohlen, sich in
            // Richtung dieser Position zu drehen.
            TurnTowardsXYZ(this.Position + newLookAtVector);

            // Sollte das Objekt den Höhenunterschied (y-Achse) ignorieren, 
            // könnte stattdessen die Methode 'TurnTowardsXZ' verwendet werden.
        }
    }
}

Beitrag veröffentlicht

in

von

Kommentare

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.