Reibungssimulation bei Körperbewegung mit konstanter Geschwindigkeit und ohne äußere Kraft

Ich versuche, eine einfache Physiksimulation zu schreiben, habe aber Probleme mit der Funktionsweise von Reibung.

Nehmen wir einen Massekörper an M bewegt sich horizontal auf einer Ebene mit Anfangsgeschwindigkeit v 0 . Kann mir bitte jemand erklären, wie Reibung in diesem Fall funktioniert?

Gibt es eine konstante Reibungskraft entgegen der Bewegungsrichtung, die plötzlich Null wird, wenn die Körpergeschwindigkeit Null wird? In einer Simulation würde es nie exakt Null werden und somit würde die Körperposition oszillieren. Wäre es sinnvoll, bei niedrigen Geschwindigkeiten die kinematische Reibung in die Haftreibung zu überführen? Wie funktioniert das in der Realität?

Antworten (4)

Am einfachsten und einfachsten ist es, einen Schwellwert für die Geschwindigkeit zu wählen. Wenn die Geschwindigkeit unter diesen Wert fällt, erzwingen Sie die Geschwindigkeit auf Null und implementieren Sie Ihr Schema für den Ruhezustand des Körpers. Wenn Sie sich auf einer ebenen Fläche ohne horizontale Kraftkomponenten befinden, wird die Reibung null.

Wie Sie bereits erwähnt haben, können Sie sich nicht darauf verlassen, dass die Simulation perfekt auf Null kommt, aber an der Grenze ist nichts falsch daran, die Null zu erzwingen.

Wenn Sie nur die Oberflächenreibung (dh keinen Luftwiderstand) berücksichtigen, ist die Reibungskraft konstant, entgegengesetzt zur Bewegungsrichtung, bis sich das Objekt nicht mehr bewegt.

Wenn sich das Objekt nicht mehr bewegt, hält es die Haftreibung an Ort und Stelle. Wenn Leute von der "Kraft der Haftreibung" sprechen, F F S ", das ist eigentlich eine maximale Haftreibungskraft. Das heißt, wenn eine äußere Kraft angreift | F e | < | F F S | , die Haftreibung passt sich an und verhindert eine Beschleunigung. Übersteigt die äußere Kraft die Haftreibung ( | F e | > | F F S | ) dann beginnt das Objekt mit einer Nettokraft zu beschleunigen ( | F e | | F F S | ).

In einer Simulation sollte die Geschwindigkeit und damit die Gleitreibung eigentlich irgendwann genau Null werden, denn Sie sollten Ihre Gleichungen so implementieren, dass die Reibungskraft niemals eine Gegengeschwindigkeit erzeugen kann (dh Sie sollten manuell ein Schwingen verhindern). Eine mögliche Implementierung wäre so etwas wie:

Berechnen Sie die Position, an der das Objekt anhalten soll, nennen Sie das X S . Da Sie einen endlichen Zeitschritt verwenden, werden Sie dazu neigen, irgendwann eine Position über diesen Wert hinaus zu erreichen, X ich > X S . In Ihrem Code können Sie dies überprüfen und einfach festlegen X ich = X S Und v ich = 0,0 anstatt die Bewegungsgleichungen zu integrieren, also statt v ich = v ich 1 + A Δ T Und X ich = X ich 1 + v ich Δ T (wenn Sie eine einfache Euler-Integration verwendet haben).

Gibt es eine konstante Reibungskraft entgegen der Bewegungsrichtung, die plötzlich Null wird, wenn die Körpergeschwindigkeit Null wird? In einer Simulation würde es nie exakt Null werden und somit würde die Körperposition oszillieren.

In Wirklichkeit gibt es einen Unterschied zwischen kinetischer und statischer Reibung. Ihre Simulation der Realität muss diese Unterscheidung widerspiegeln.

Simulationen haben typischerweise feste Zeitschritte. Dies ist problematisch im Hinblick auf Kollisionen, aber auch im Hinblick auf Dinge wie Gleitreibung/Haftung. Sie müssen einen Mechanismus entwickeln, der die festen Simulationszeitschritte in Ihrer Simulation in kleinere Teile aufteilt, um diese offensichtlichen Diskontinuitäten zu erfassen. Technisch gesehen benötigt Ihre Simulation einen Propagator (etwas, das den Zustand im Laufe der Zeit vorantreibt) und einen Löser (etwas, das dem Propagator sagt, dass er langsamer werden soll). Der Solver zerlegt im Wesentlichen die festen Zeitschritte der Simulation in kleinere Teile.

Der Löser ist im Fall der einfachen Simulation, die Sie erstellen möchten, recht einfach. Projizieren Sie die Geschwindigkeit vorwärts über den Simulationszeitschritt, indem Sie nur kinetische Reibung verwenden. Sie müssen berechnen, wann die Geschwindigkeit Null erreicht, wenn dies dazu führen würde, dass das Objekt die Richtung ändert. Wann das passieren würde, ist ziemlich einfach, wenn man von einem einfachen Modell der kinetischen Reibung ausgeht, bei dem sich die Geschwindigkeit linear mit der Zeit ändert. (Im Allgemeinen ist es nicht so einfach. Es gibt jede Menge Papiere darüber, wie man am besten einen Lösungsweg schreibt.) Wenn die Geschwindigkeit des gleitenden Objekts unter eine bestimmte Grenze fällt, stoppt das Objekt. Jetzt wird eine äußere Kraft benötigt, um das Objekt wieder in Bewegung zu setzen.

Kennen Sie ein gutes Nachschlagewerk?
Es gibt hier ein wirklich umfangreiches Übersichtspapier über Kontaktalgorithmen (ich kann nicht für seine Richtigkeit bürgen, aber es scheint ein guter Anfang zu sein, wenn man nach einer bestimmten Klasse von Algorithmen sucht): ipmnet.ru/~burago/papers/cont- e.pdf
@ Danvil - Ich würde ein Buch über Physik-Engines (oder Spielphysik) anstelle eines Papiers empfehlen. Es gibt viele von ihnen.
@neocpp: Danke! Das war genau das, wonach ich gesucht hatte.
@DavidHammen Das ist eine gute Idee, aber ich wäre vorsichtig bei der Unterscheidung zwischen Methoden, die genaue Ergebnisse liefern, und nur "visuell korrekten". Meiner Erfahrung nach lösen die meisten spielbezogenen Engines physikalische Systeme nicht mit einem hohen Maß an Genauigkeit (aus gutem Grund, da hohe Wiedergabetreue und Geschwindigkeit oft im Widerspruch stehen). Ich würde hoffen, dass ein Buch darüber sprechen würde, aber je nach Anwendung, die OP im Sinn hat, könnte es wichtig sein.

Dies ist im Allgemeinen eine schwer zu lösende Frage, aber ich habe die folgende Art von Ansatz gesehen, der mit einigen expliziten Zeitschritt-„Kontaktalgorithmen“ zwischen zwei Körpern in der Literatur zum Typ der finiten Elemente verfolgt wurde, wenn keine Unterscheidung zwischen ihnen getroffen werden muss die statischen und dynamischen Reibungskoeffizienten.

Es kann als eine Möglichkeit angesehen werden, das zu tun, was von DilithiumMatrix und David Hammen erwähnt wurde .

Erstens projizieren wir Momentum P vorwärts für jeden Körper, als ob es keine Reibung gäbe, so

P = P N + Δ T F N .

Wenn es einen rutschfesten Kontakt gibt, bedeutet dies, dass sich der Körper am Ende des Schrittes mit der Geschwindigkeit des kombinierten Massenschwerpunkts bewegt (in diesem Fall gehe ich davon aus, dass sich der Boden aufgrund des Körpers nicht bewegen wird, also wir kann nur 0 verwenden). Dann wissen wir es

P N + 1 = P + Δ T F C N .

Daher ist die erforderliche Kraft am Körper für einen rutschfesten Kontakt F C = P Δ T seit P N + 1 = 0 .

Nun, ich nehme an, Sie kennen die Normalkraft (z. B. aufgrund des Körpergewichts), in diesem Fall können Sie sehen, ob | μ F N Ö R M A l N | > | F C | , in diesem Fall muss das Objekt zum Stillstand kommen. Andernfalls berechnen Sie die Kontaktkraft als

F C Ö N T A C T = S ich G N ( P N ) μ F N Ö R M A l

Und der letzte Schwung wird durch gegeben P N + 1 = P + Δ T F C Ö N T A C T . Oder überhaupt

P N + 1 = { 0  Wenn  | μ F N Ö R M A l | | P N Δ T F N | P N + Δ T ( F N S ich G N ( P N ) μ F N Ö R M A l ) ansonsten .

Bitte beachten Sie, dass ich es in 1D belassen habe und dies nur die tangentiale Bewegung berücksichtigt. Möglicherweise können Sie die Schwellenwerte für festlegen μ wo es als zwei verschiedene Werte angezeigt wird, um die statischen und dynamischen Reibungskoeffizienten zu erhalten, aber das habe ich nicht versucht. ZB da der Haftreibungskoeffizient größer ist als der dynamische, glaube ich

P N + 1 = { 0  Wenn  | μ S T A T ich C F N Ö R M A l | | P N Δ T F N | P N + Δ T ( F N S ich G N ( P N ) μ D j N A M ich C F N Ö R M A l ) ansonsten

funktioniert ohne Überschwingen, stoppt aber immer noch "zu früh", wenn das Objekt in Bewegung war, aber die Rutschfestigkeit zwischen der statischen und der dynamischen Schwelle lag.