Frage

Ich implementieren ein kleines Spiel und habe Probleme, die Physik richtig zum Laufen zu bringen.In diesem Spiel gibt es eine Kugel (ein Kreis, der sich von Rahmen zu Rahmen bewegt und seinen Radius ändern kann) und mehrere Wände (Liniensegmente, die sich ebenfalls ändern und von Rahmen zu Rahmen bewegen).Ich kann Kollisionen richtig erkennen und es ist kein Problem, den Ball in die richtige Richtung abprallen zu lassen.

Schwierigkeiten ergeben sich in Situationen, in denen der Ball in einem Frame eine Linie schneidet und diese dann im darauffolgenden Frame erneut kreuzt, was zu einem Doppelsprung führt.Ich könnte den Ball entlang der Normalen der Linie zurückbewegen, bis er sich in einer gültigen Position befindet, aber das führt zu wirklich seltsamem Verhalten, wenn die betreffende Linie entlang ihrer Achse geschlagen wird (stellen Sie sich einen Tischtennisball vor, der auf einen aufrecht stehenden Zahnstocher fällt usw.) plötzlich zur Seite verschieben, so dass es sich auf einer Seite des Zahnstochers befindet...).Es gibt auch ein paar Probleme, wenn der Ball mehr als eine Linie in einem bestimmten Rahmen schneidet (stellen Sie sich vor, dass vier Linien zusammen ein Rechteck bilden und der Ball die Ecke dieses Rechtecks ​​schneidet) – in welche Richtung soll er abprallen?In welche Richtung soll es sich verschieben?

Ich habe eigentlich keine konkrete Frage, suche aber nach Tipps oder nützlichen Tutorials.Alle 2D-Modelle, die ich bisher gefunden habe, decken nur Rechteckschnittpunkte ab.

Ich verwende XNA, wenn es einen Unterschied macht.

Danke,
Cameron

War es hilfreich?

Lösung

Dies ist ein universelles Problem bei den meisten Physikbibliotheken.Wenn Sie nach „Eindringtiefe“ googeln (zusammen mit „Physik“, schlage ich vor, oder Sie finden vielleicht etwas ganz anderes :D), werden Sie feststellen, dass sogar diese Bibliotheken Tricks wie Ihre verwenden.

Hierfür gibt es zwei Lösungen:

Am günstigsten ist es, die Aktualisierungshäufigkeit zu erhöhen.Bewegen Sie Objekte in 10 kleineren Schritten statt in einem einzigen großen Schritt, und Sie haben weniger Durchdringung, so dass die Befestigung durch Versetzen der Kugel von der Wand weg weniger sichtbar ist.

Das teuerste ist die kontinuierliche Kollisionserkennung.Es gibt Algorithmen, die Ihnen bei einem sich bewegenden und einem stationären Objekt den genauen Zeitpunkt sagen können, zu dem sich beide überschneiden.Google „Swept Sphere-Rechteck-Schnittpunkt“, um einige davon zu finden.

Sie können dann wie folgt aktualisieren:Der Ball muss sich um 1,0 Einheiten bewegen.Auf Kollision prüfen.Die Kollision erfolgt nach 0,25 Einheiten. Bewegen Sie den Ball also um 0,25 Einheiten, berechnen Sie den Reflexionsvektor (damit der Ball von der Wand abprallt), wiederholen Sie die Kollisionsprüfung mit den verbleibenden 0,75 Einheiten (bis Sie die endgültige Position des Balls kennen).Dadurch werden Durchdringungen vollständig vermieden, und selbst wenn sich Ihr Ball so schnell bewegt, dass er normalerweise in einem einzigen Update über die Wand springen würde, wird die Kollision erkannt.

Andere Tipps

Es wird allgemein angenommen, dass sich Ihre Kollisionen aufgrund des Zeitschritts zwischen den Aktualisierungen über einen akzeptablen Punkt hinaus überschneiden.

Grundsätzlich müssen Sie zu dem Punkt zwischen dem letzten und dem aktuellen Bild zurückinterpolieren, an dem die Kollision tatsächlich stattgefunden hat, das Objekt zu diesem Punkt zurückbewegen und dann die Kräfte usw. berechnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top