Wie berechne ich die Rotation, die durch Abprallreibung verursacht wird?

15

In Anlehnung an meine vorherige Frage : Ich habe den Ball ziemlich realistisch von Oberflächen abprallen lassen, auf die er trifft. Jetzt möchte ich es aus der Reibung des Treffers heraus drehen lassen .

Dies zu zeigen ist einfach genug: Ich drehe den Ball bei jedem Tick um seine Winkelgeschwindigkeit und wende dieselbe Drehung an, wenn er gerendert wird.

Wenn ein Ball auf eine Wand trifft, weiß ich, dass die Rotationsgeschwindigkeit von ...

  • die Anfangsgeschwindigkeit des Balls beim Auftreffen auf die Oberfläche
  • die Reibungskoeffizienten der Kugel und der Oberfläche (physikalische Konstanten)
  • der Einfallswinkel (der Winkel zwischen dem ankommenden Geschwindigkeitsvektor des Balls und der Flächennormalen).

Der Einfallswinkel wird durch das Skalarprodukt der Aufprall- und Austrittsgeschwindigkeitsvektoren des Balls approximiert. (1 bedeutet high spin, -1 bedeutet no spin und alles andere relativ dazwischen)

Multiplizieren Sie alle oben genannten Werte und stellen Sie sicher, dass sie in den Bereich 0 - 1 transformiert und mit der maximalen Rotationsgeschwindigkeit multipliziert wurden. Der Ball schien erwartungsgemäß mit der Rotationsgeschwindigkeit zu reagieren. Abgesehen von einer Sache: Es würde sich immer im Uhrzeigersinn drehen (wegen positiver Werte).


Ist das eine gute Methode? Können Sie sich einen einfacheren Weg vorstellen?

Wenn diese Methode in Ordnung zu sein scheint, was fehle ich? Woher weiß ich, wann sich der Ball gegen den Uhrzeigersinn drehen soll?

Codemonkey
quelle

Antworten:

2

Ihre Methode ist schön, weil es sehr einfach ist. Eine Sache, die Sie möglicherweise benötigen, ist die Abhängigkeit vom vorherigen Spin des Balls, den Sie nicht berücksichtigen. Die sich drehende Kugel repräsentiert Rotationsenergie, daher müsste eine realistische Simulation sie wahrscheinlich zusammen mit den anderen Energien speichern.

Wenn sich der Ball jedoch beim Aufprall nicht dreht, kann ich mir keine Situation vorstellen, in der er sich gegen die Richtung des Einfallswinkels dreht. Das heißt, "im Uhrzeigersinn" oder "gegen den Uhrzeigersinn" sollte relativ zu der Seite der Normalen sein, auf der der Einfallswinkel liegt.

Ich denke, einfach das Ergebnis mit dem ursprünglichen x-Richtungsvektor zu multiplizieren (+1, wenn von links nach rechts, -1, wenn von rechts nach links) sollte es tun.

Bearbeiten: Sie können das Kreuzprodukt dafür verwenden. Incident cross normalLiefert einen Vektor nur in Z-Richtung (wenn wir uns in der 2D-xy-Ebene befinden). Schauen Sie sich das Z-Element an: Wenn es positiv ist, sollte sich der Ball bei seiner Annäherung im Uhrzeigersinn drehen. Wenn es negativ ist, sollte der Ball gegen den Uhrzeigersinn drehen.

eli
quelle
Hey eli Erstens berücksichtige ich den ursprünglichen Spin des Balls, habe nur vergessen, ihn in meinem Post zu erwähnen. Zweitens glaube ich nicht, dass das X-Direction-System funktionieren würde. Ich habe versucht , das, aber wenn der Ball auf die Oberfläche trifft von unten links gehend, würde der x - Vektor -1, würde es bedeuten , Drehung gegen den Uhrzeigersinn, während in Wirklichkeit sollte es im Uhrzeigersinn drehen werden
codemonkey
Wie berücksichtigen Sie den ursprünglichen Spin des Balls? Wenn es sich sehr schnell dreht, kann es sich in eine ganz andere Richtung bewegen. Das Problem mit dem Punktprodukt in Ihrem Fall ist, dass es den Kosinus verwendet (eine gerade Funktion). Sie benötigen etwas anderes, um das Vorzeichen der Beziehung zwischen Ihren Vektoren (Vorfall und Normal) festzulegen. Zu diesem Zweck können Sie ein Kreuzprodukt (Vektorprodukt) verwenden. Ich habe meine Antwort so bearbeitet, dass sie eine produktübergreifende Methode enthält.
Eli
Lies die Antwort nach der Bearbeitung noch einmal Ich mag es. Versuchte es und es hat ganz gut funktioniert. In Bezug auf die ursprüngliche Drehung habe ich nur darüber gesprochen, die Rotationsänderung allmählich zu machen ... was die ursprüngliche Drehung betrifft, die den Ausgangsvektor betrifft, nun, das ist mein nächster Schritt :)
codemonkey
Autsch, der Schnitt war eine der drei verschiedenen Lösungen, die ich vorgeschlagen habe, und ich erklärte, warum Sie es tun mussten (Punkt gibt nur die Größe an, nicht die Richtung des Winkels). Ach, sollte präziser sein, denke ich.
Kaj
Entschuldigung für diesen Kaj, er ist mir
ausgerutscht
3

Ermitteln Sie zunächst die Flächentangente aus der Flächennormalen: t = (ny, -nx)

Dann können Sie die Geschwindigkeitskomponente entlang der Oberfläche als vt = v dot t erhalten .

Nun können Sie die Rotation der Kugel berechnen: w = | ( normal * r) cross vt |, wobei r der Radius der Kugel ist.

Hier gehe ich davon aus, dass der Ball keine Rotationsträgheit hat und sofort mit der Geschwindigkeit rotiert, die er hätte, wenn er über die Oberfläche gerollt wäre. Sie können einen Reibungskoeffizienten verwenden, um ihn realistischer zu gestalten und wenn Sie möchten, die Rotationsträgheit der Kugel zu berücksichtigen.

Danik
quelle
Danke für die Antwort Danik. Ich berücksichtige bereits die Rotationsträgheit der Kugel (indem ich sie der neuen Rotation hinzufüge) und auch die Reibung der Oberfläche als Koeffizienten, der mit der gesamten Rotationsgeschwindigkeit multipliziert wird. Je mehr Reibung, desto höher die Drehzahl, oder?
Codemonkey
2

Okay, das klingt vielleicht dumm, aber Sie verwenden nicht das Punktprodukt des Kugelvektors und der Flächennormalen und machen nur einen Bogen, um den Winkel zu berechnen, oder? Denn dann würde der Winkel positiv sein , ob es positiv war (bis zu 90 Grad) oder negativ (dito) als Kosinus 0 symmetrisch um ist
Wenn dies ist der Fall , dann stattdessen die Normale der Ebene der Verwendung Verwenden die Ebenenrichtung selbst und Subtrahieren Sie 90 Grad vom Winkel, sodass 0 bis 180 zu -90 bis +90 Grad werden (oder -halb PI bis + halb PI, wenn Sie radial geneigt sind).

Kaj
quelle
Betrachten Sie nun diesen Fall: x + ve ist richtig, y + ive ist down; Oberflächenvektor S = (1,0); Wir haben zwei Aufprallgeschwindigkeitsvektoren V1 = (3,4), die von oben treffen, die Kugel im Uhrzeigersinn drehen und V2 = (3, -4), die von unten treffen, die Kugel gegen den Uhrzeigersinn drehen. Normalen für beide Vektoren wären nun (3 / 5,4 / 5) & (3/5, -4 / 5). Jetzt wäre das Punktprodukt für beide Vektoren 3/5. Der erzeugte Winkel wäre Arccos (3/5) = 53 Grad für BEIDE Vektoren. Welches ist wahr, aber auf entgegengesetzten Seiten! Wenn ich diese Methode verwende, werden immer noch beide im Uhrzeigersinn gedreht. Siehst du mein Dilema?
Codemonkey
3 mögliche Lösungen. 1) Verwenden Sie nicht die Normale, sondern die Richtung der Seite und subtrahieren Sie 90 Grad wie oben erwähnt. 2) Simulieren Sie dasselbe, indem Sie x und y des Normalen vertauschen und eins invertieren (mit -1 multiplizieren). 3) Multiplizieren Sie den Winkel mit dem Vorzeichen des Kreuzprodukts der beiden Vektoren, da das Kreuzprodukt die Sünde des Winkels darstellt, der um 0 Grad nicht symmetrisch ist.
Kaj,
Das Skalarprodukt gibt Ihnen nicht den Winkel, sondern nur die Größe des Winkels an. Sie benötigen auch die Richtung des Winkels. Alle drei oben genannten Möglichkeiten simulieren mit dem Sinus, der Ihnen die Seite gibt. Sie können auch einen einfachen Trigger verwenden, um den Winkel zu ermitteln. Sin (alpha) = Länge der gegenüberliegenden Seite / Länge der geneigten Seite (basierend auf einem Dreieck mit einem Winkel von 90 Grad zwischen der gegenüberliegenden Seite und der geneigten Seite). Das und Pythagoras zur Berechnung der Seitenlängen reichen aus.
Kaj,
Übrigens, lesen Sie meine ursprüngliche Antwort noch einmal durch, da dies das Dilemma löst, indem Sie den Winkel mit der Ebene anstelle der Normalen nehmen und 90 Grad subtrahieren.
Kaj,
0

Das erste, was Sie tun müssen, ist, ob Sie sich drehen oder drehen, bevor Sie auf die Wand treffen. sagen wir mal Si; ist größer, gleich oder kleiner als der Wert, der benötigt wird, um den gleichen Spin nach dem Schlagen beizubehalten, sagen wir Ss. Mit dieser Funktion können Sie den tatsächlichen Wert nach dem Schlagen von Spin, z. B. Se, anhand eines Reibungswerts zwischen der Kugel und der Oberfläche ermitteln

Ermitteln Sie die Geschwindigkeitskomponente über die Prellfläche Vxi = Vi Punkt Vx, wobei Vx ein Parallelvektor zur Fläche mit der Größe 1 ist.

Der Wert, den Sie suchen, ist Ss = Vxi / r, um Vxi in Winkelgeschwindigkeit umzuwandeln. Wenn Si niedriger als Ss ist, sollte der Ball einen positiven Spin erzielen. Wenn Si gleich Ss ist, sollte der Ball ungefähr den gleichen Spin behalten, etwa später. Wenn Si größer als Ss ist, sollte der Ball den Spin verlieren

Geschwindigkeitsverlust und Geschwindigkeitsgewinn hängen vom Reibungswert Fr ab. Eigentlich ist es eine Kreuzung zwischen dem Radius und der Reibungskraft, aber Sie können diesen Wert nach Belieben einstellen.

Sie müssen auch beachten, dass der Ball neben dem Sprung-Coef aufgrund einer Reibung zwischen Ball und Oberfläche etwas Energie verliert, wodurch Vxi negativ beeinflusst wird. Ich würde sagen, Bounce Coef beeinflusst Vy und Friktion beeinflusst Vx.

Sie sollten die Verformung der Kugel berücksichtigen. Dies wirkt sich auf die Zeit oder die Frames aus, in denen der Ball an der Wand haftet. Daher wirkt sich die Reibungskraft für eine längere Zeit auf den Spin und die Austrittsgeschwindigkeit aus. Diese Verformung hängt davon ab, wie Ihr Modell aussehen soll.

Aprah
quelle