So implementieren Sie Reibung in einer Physik-Engine, die auf „Advanced Character Physics“ basiert

8

Ich habe eine Physik-Engine implementiert, die auf den Konzepten des klassischen Textes Advanced Character Physics von Thomas Jakobsen basiert . Reibung wird im Artikel nur sehr kurz diskutiert und Jakobsen selbst stellt fest, wie "andere und bessere Reibungsmodelle als diese implementiert werden könnten und sollten".

Wie kann man generell ein glaubwürdiges Reibungsmodell zusätzlich zu den Konzepten aus dem genannten Artikel implementieren? Und wie könnte die gefundene Reibung in Rotation auf einem Kreis übersetzt werden?


Ich möchte nicht, dass es bei dieser Frage um meine spezifische Implementierung geht, sondern darum, wie Jakobsens Ideen allgemeiner mit einem großartigen Reibungssystem kombiniert werden können. Aber hier ist eine Live-Demo, die den aktuellen Zustand meines Motors zeigt, der in keiner Weise mit Reibung umgeht : http://jsfiddle.net/Z7ECB/embedded/result/


Unten sehen Sie ein Bild und ein Beispiel dafür, wie die Kollisionserkennung in einem Motor funktionieren könnte. In der Verlet-Integration werden immer die aktuelle und die vorherige Position gespeichert. Basierend darauf wird eine neue Position berechnet. In jedem Frame berechne ich den Abstand zwischen den Kreisen und den Linien. Wenn dieser Abstand kleiner als ein Kreisradius ist, ist eine Kollision aufgetreten, und der Kreis wird entsprechend der Größe der Überlappung (Versatz auf dem Bild) senkrecht aus der betreffenden Linie heraus projiziert.

Die Geschwindigkeit ist aufgrund der Verlet-Integration implizit, sodass sich durch Ändern der Position auch die Geschwindigkeit ändert. Was ich wissen muss, ist, irgendwie die Reibung auf dem Kreis zu bestimmen und ihn parallel zur Linie rückwärts zu bewegen, um seine Geschwindigkeit zu verringern. Bild zeigt, wie Kollision auftritt

Paldepind
quelle
Sehr schöner Artikel! Wie ist deine Reibung im Moment?
Mikael Högström
Ja. Es ist ein großartiger Artikel. Es ist sehr einfach, aber ich habe einen ganzen Motor, der für meinen Zweck geeignet ist und darauf basiert. Außer Reibung;)
Paldepind
Und schönes Video auch. Sieht vielversprechend aus!
Mikael Högström

Antworten:

4

Sie sollten sich das Papier "Positionsbasierte Dynamik" von Mathias Mueller et al. Anschauen. Es ist im Grunde das gleiche wie Jacobsons 'Papier und er könnte Ihnen mehr Informationen über Reibung geben.

http://www.matthiasmueller.info/publications/posBasedDyn.pdf

Sie geben an, dass Reibung die Geschwindigkeit des Partikels in der Kollisionsebene im Wesentlichen um einen Skalarwert dämpft.

Beachten Sie, dass Sie dadurch keine Coulomb-Reibungseffekte erhalten (der Impuls in die Kollision wirkt sich nicht auf die Größe der Reibungskraft aus). Möglicherweise können Sie dies jedoch erreichen, indem Sie die Geschwindigkeit des Partikels in der Kollisionsebene berücksichtigen.

Cholesky
quelle
1
Was ist, wenn Sie beim Anlegen eines Impulses an einen ansonsten stationären Körper nach einer bestimmten Schwelle suchen? Wenn die Komponente des Impulses auf der Kontaktfläche unter diesem Schwellenwert liegt, können Sie ihn auf Null setzen, um die Auswirkungen der Haftreibung nachzuahmen . Von da an ist dynamische Reibung genau so, wie Sie es beschrieben haben. +1
Teodron
0

In einem "normalen" Starrkörpermotor würden Sie Reibung als Impulse senkrecht zur Normalen modellieren. Ich würde vermuten, dass dies in diesem Zusammenhang bedeuten würde, anstelle von Impulsen die Position des betroffenen Partikels angemessen einzustellen. Mit den vorhandenen Einschränkungen sollte dies, wenn ich den Artikel richtig verstehe, iterativ einen Zustand erreichen, in dem die Reibung auch die Rotation beeinflusst hat. Ich vermute, dass der Autor mit "besserem Modell" eine bessere Methode zur Bestimmung des Reibungsbetrags meint als eine lineare Projektion der gegenseitigen Durchdringung. Dies ist jedoch eine Vermutung auf meiner Seite, da ich die Physik mit diesem Ansatz selbst nie implementiert habe.

BEARBEITEN:

Um die Größe der Reibungskräfte zu berechnen, haben Sie den Versatzwert in Ihrem Bild. Da Sie verlet mit festem Zeitschritt verwenden, wissen wir, dass dieser Versatz tatsächlich die Geschwindigkeit ist, die der Kontakt in Richtung der Kontaktnormalen hatte (nun ja nicht genau, und ich denke, das meint der Autor mit einer besseren Annäherung an die Reibung ). Es ist wichtig, die Geschwindigkeit entlang der Kontaktnormalen zu kennen, da wir damit den Impuls bestimmen können. Der beste Weg ist, Reibung in Form von Impulsen in jedem Rahmen anzuwenden, in dem ein Kontakt besteht. Die Größe der Reibung in den Achsen parallel zur Kontaktebene wird durch den Reibungskoeffizienten bestimmt (bestimmt durch die Materialien, zum Beispiel 0,7 für ziemlich hohe Reibung). Die maximale Reibung, die Sie haben könnten, ist der Reibungskoeffizient multipliziert mit dem Versatz. Beachten Sie, dass dieser Wert größer sein kann als die tatsächliche Geschwindigkeit entlang einer der Achsen. In diesem Fall haben Sie Haftreibung und das Partikel sollte sich in dieser Achse überhaupt nicht bewegen. Wenn der Wert kleiner als dieser Wert ist, bewegt sich das Partikel ein wenig, wird jedoch verlangsamt, dh dynamische Reibung.

Mikael Högström
quelle
Du hast Recht. Zumindest für mich ist es schwierig zu bestimmen, wie "die Position des betroffenen Partikels angemessen eingestellt werden soll".
Paldepind
Ahh ok, dann sehe ich wo du bist. Ich habe eine Idee für eine Lösung, ich werde die Antwort bearbeiten
Mikael Högström
Das ist genau die im Papier beschriebene Technik;). Ich denke, ich werde versuchen, es zu implementieren und zu sehen, ob es für mein Projekt gut genug ist.
Paldepind
Ahh, ich denke schon ... Die Methode scheint fast die gleiche zu sein wie bei einem Starrkörpermotor. Berücksichtigen Sie einfach die Verlet-Integration und wenden Sie stattdessen Impulse an, wenn sich die Position ändert.
Mikael Högström