Spielephysik (game physics): Auftriebskraft und Schwimmfähigkeit

Die Darstellung von realistischen Wassereffekten hat sich in den letzten Jahren kontinuierlich weiterentwickelt und ist aus modernen Computerspielen mittlerweile nicht mehr wegzudenken. Dabei kommt es natürlich nicht nur auf die grafische Umsetzung an – wirklich realistisch wird das Ganze erst durch eine glaubhaft wirkende Interaktion zwischen dem Wasser und den Spieleobjekten.
In diesem Zusammenhang steht neben der stark abbremsend wirkenden Newton-Reibung ein zweites Phänomen im Vordergrund, mit dem wir uns an dieser Stelle befassen werden – die Auftriebskraft (Buoyancy).
Archimedes hatte bereits 300 Jahre vor Christi erkannt, dass der Auftrieb eines Körpers proportional zur Gewichtskraft der verdrängten Flüssigkeitsmenge ist. Die Auftriebskraft eines Körpers können wir nun ganz einfach simulieren, indem wir die Fallbeschleunigung unter Berücksichtigung der Auftriebseigenschaften des Körpers (StandardBuoyancyValue) modifizieren. Die modifizierte Fallbeschleunigung bezeichnen wir im weiteren Verlauf als Gravitations-Auftriebs-Beschleunigung (GravityBuoyancyAcceleration):

GravityBuoyancyAcceleration = GravityAcceleration -
                              GravityAcceleration*StandardBuoyancyValue;

Physikalisch gesehen bedeutet ein Auftriebswert (StandardBuoyancyValue) von 1, dass die Gewichtskraft der verdrängten Flüssigkeit (mit der Dichte von 1) gleich der Gewichtskraft ist, die auf ein einzelnes Massenelement einwirkt. Gewichtskraft und Auftriebskraft heben sich also gegenseitig auf, die Fallbeschleunigung ist entsprechend gleich 0 und das Massenelement schwimmt.

Bei einem Auftriebswert < 1 sinkt ein Massenelement,
bei einem Auftriebswert > 1 taucht ein vormals gesunkenes Massenelement wieder an die Oberfläche auf.

Bei der Berechnung der Auftriebskraft in Flüssigkeiten mit Dichten ungleich 1 muss der Auftriebswert noch mit der Dichte der jeweiligen Flüssigkeit multipliziert werden (z.B. BuoyancyDensityFactor_Water). Hierbei ist natürlich zu prüfen, in welchem Medium sich das betreffende Massenelement gerade befindet. Der nachfolgende Source Code demonstriert ihnen, wie sich die Stärke der Newton-Reibung und des Auftriebs im und über dem Wasser berechnen lassen:

for(long i = 0; i < NumMassElements; i++)
{
   
// Massenelement des Körpers (Körperteil) über der Wasseroberfläche:
    if(MassElement[i].WorldSpacePos.y > WaterHeight)
    {
        NewtonFrictionValue = MassElement[i].StandardNewtonFrictionValue*
                              NewtonFrictionDensityFactor_Air;

        BuoyancyValue = MassElement[i].StandardBuoyancyValue*
                        BuoyancyDensityFactor_Air;
    }
   
// Massenelement des Körpers im Wasser:
    else
    {
        NewtonFrictionValue = MassElement[i].StandardNewtonFrictionValue*
                              NewtonFrictionDensityFactor_Water;

        BuoyancyValue = MassElement[i].StandardBuoyancyValue*
                        BuoyancyDensityFactor_Water;
    }

    GravityBuoyancyAcceleration = GravityAcceleration -
                                  GravityAcceleration*BuoyancyValue;
...
}