Kollision, Physik



  • Hey,

    ich würde gerne ein kleines Physikspiel programmieren. DIe Frage die sich mir stellt ist, wie gut sich das umsetzen lässt.

    Nehmen wir an, ich habe eine Kugel und diese prallt gegen ein gerades Rechteck. Der Einfallswinkel entspricht dem Ausfallswinkel. Das lässt sich also sehr einfach umsetzen (wie so ein billiger Bildschirmschoner).

    Nehmen wir aber an ich lasse die Kugel gegen ein Dreieck prallen. Wie verhält es sich hier? Oder nehmen wir doch mal an ich zeichne eine beliebige Figur. Wie würde die Kollision hier aussehen?

    Die Kollisionsabfrage kann ich im ja Prinzip über die Pixel machen. Aber wie berechne ich die neue Richtung?

    Es soll nur der Ball + die Kollision mit dem Objekt simuliert werden. Dinge wie Gravitation und was es noch so gibt werden außer Acht gelassen.

    Bin für Ideen sehr dankbar 🙂


  • Mod

    jjj schrieb:

    Nehmen wir aber an ich lasse die Kugel gegen ein Dreieck prallen. Wie verhält es sich hier?

    Genauso.

    Oder nehmen wir doch mal an ich zeichne eine beliebige Figur. Wie würde die Kollision hier aussehen?

    Genauso, sofern die Struktur der Oberfläche grob gegenüber der Größe der Kugel ist.

    Die Kollisionsabfrage kann ich im ja Prinzip über die Pixel machen.

    Bloß nicht! Trenne Logik und Darstellung.



  • SeppJ schrieb:

    Oder nehmen wir doch mal an ich zeichne eine beliebige Figur. Wie würde die Kollision hier aussehen?

    Genauso, sofern die Struktur der Oberfläche grob gegenüber der Größe der Kugel ist.

    Die Frage ist natürlich, wann man dies als grob bezeichnen kann und wie man vorgeht, wenn es nicht mehr grob genug ist.

    Das Problem ist halt auch, dass die Kugel ohnehin das kleinste Objekt ist. Wie sieht es also aus, wenn diese kleine Kugel gegen eine (statische) größere kugelartige Form prallt?


  • Mod

    jjj schrieb:

    Das Problem ist halt auch, dass die Kugel ohnehin das kleinste Objekt ist.

    😕 Das ist doch gut, dann musst du dich nicht um Effekte der Feinstruktur kümmern.

    Wie sieht es also aus, wenn diese kleine Kugel gegen eine (statische) größere kugelartige Form prallt?

    Genauso natürlich!



  • Du kannst immer mit "Einfallswinkel = Ausfallswinkel" rechnen, du musst dazu nur den Einfallswinkel an der Kontaktstelle der Kollision berechnen.



  • Es hilft vielleicht das Problem auf eine unendlich kleine Kugel zu reduzieren. Das meine ich so: Wenn Du Dir von Deiner Kugel Position und Geschwindigkeit merkst, dann sollten die gleichen Positionen und Geschwindigkeiten rauskommen, wenn eine unendlich kleine Kugel annimst und Deine Umwelt entsprechend "vergrößerst". Aus Ecken in der Umwelt werden Kugeln, aus Kanten werden Zylinder, Flächen bleiben Flächen, die etwas weiter "vorstehen". Man könnte sich dann zwei Welten merken: die eine, die dargestellt wird und die andere, die zur Kollisionsberechnung verwendet wird. Ich könnte mir vorstellen, dass das so einfacher wird, weil man dann nur noch Schnittpunkte zwischen einer Geraden (gegeben durch aktuelle Position + Flugrichtung der Kugel) und der Umwelt berechnen muss.

    Schnittpunkt Gerade <-> Ebene entspricht einer Lösung t von a+b*t = 0
    Schnittpunkt Gerade <-> Kugeloberfläche entspricht einer Lösung t von a+b*t+c*t^2 = 0
    Schnittpunkt Gerade <-> Zylindermantel müsste auch zu einer quadratischen Gleichung führen.

    Es sollte sich auch relativ leicht der Normalvektor der Oberfläche am Kollisionspunkt berechnen lassen. Dann muss der Geschwindigkeitsvektor nur an der Oberfläche spiegeln. Man kommt hierbei ganz ohne Winkelfunktionen aus:

    point3d normal = ...; // mit Länge 1
     point3d geschw_alt = ...;
     point3d geschw_neu = geschw_alt - normal * (2*dot_product(geschw_alt,normal));
    

    (wenn ich mich jetzt nicht verrechnet habe)

    Etwas Energieverlust könnte man je nach Material-Kombination noch durch einen Dämpfungsfaktor für die resultierende Geschwindigkeit modellieren.

    Wenn das geschafft ist, könnte man sich noch Gedanken machen, wie man die einzelnen Objekte in der Welt speichert, so dass möglichst wenige Kollisionen getestet werden müssen. Das könnte man mit einem Loose-Quadtree (2D) bzw Loose-Octree (3D) machen. Alternativ (oder zusätzlich) könnte man "bounding spheres" (oder ähnliches) für komplexere Umweltgegenstände verwenden.

    Die Zeit würde ich in Intervalle einteilen, in denen sich die Kugel linear bewegt. Innerhalb jedes Intervalls sind mögliche Kollisionen zu berechnen und durchzuführen. Zu den Zeitpunkten der Intervallgrenzen können die Geschwindigkeiten je nach aktueller Beschleunigung (zB Gravitation) angepasst werden.


Log in to reply