Bewegen von Objekten, die bei Verwendung einer nicht ausgerichteten Kollisionsvermeidung kollidieren (Lenkung)

9

Ich habe Probleme mit der Vermeidung nicht ausgerichteter Kollisionen, was meiner Meinung nach ein seltener Fall ist. Ich habe zwei Objekte so eingestellt, dass sie sich aufeinander zu bewegen, jedoch mit einem leichten Versatz, sodass sich eines der Objekte leicht nach oben und eines der Objekte leicht nach unten bewegt.

In meinem nicht ausgerichteten Algorithmus zur Steuerung der Kollisionsvermeidung finde ich die Punkte auf der Vorwärtslinie des Objekts und der Vorwärtslinie des anderen Objekts, an denen diese beiden Linien am nächsten liegen. Wenn sich diese nächstgelegenen Punkte innerhalb eines Kollisionsvermeidungsabstands befinden und der Abstand zwischen ihnen kleiner als die beiden Radien der Begrenzungskugeln der beiden Objekte ist, sollten die Objekte in die entsprechende Richtung weglenken.

Das Problem ist, dass für meinen Fall die nächsten Punkte auf den Linien so berechnet werden, dass sie wirklich weit vom tatsächlichen Kollisionspunkt entfernt sind. Dies liegt daran, dass sich die beiden Vorwärtslinien für jedes Objekt beim Passieren der Objekte voneinander entfernen. Das Problem ist, dass aus diesem Grund keine Lenkung stattfindet und die beiden Objekte teilweise kollidieren.

Screenshot der Objektvorwärtslinien.

Hat jemand Vorschläge, wie ich den Kollisionspunkt richtig berechnen kann? Vielleicht, indem man irgendwie die Größe der beiden Objekte berücksichtigt?

James Bedford
quelle
Beachten Sie, dass im Screenshot die grünen, roten und blauen Linien nur die Achsen der 3D-Welt sind.
James Bedford

Antworten:

6

Dies ist bei weitem der beste Artikel zur Erkennung von Ball-zu-Ball-Kollisionen, den ich je gesehen habe.

Pool Hall Lektionen: Schnelle, genaue Kollisionserkennung zwischen Kreisen oder Kugeln

Adam Harte
quelle
Ich weiß, wie man einen Kugel-Kugel-Kollisionstest durchführt. Mein Problem ist es, die Position zu finden, an der diese Kollision in Zukunft stattfinden wird. Vielen Dank.
James Bedford
@ James dieser Artikel wird Ihre Probleme lösen. Schauen Sie auf Seite 2 und Sie können eine beliebig hohe Zahl für die "Geschwindigkeit" auf einer Ihrer Kugeln verwenden, um den Kollisionspunkt "in der Zukunft" zu bestimmen.
Tetrad
Ok - Entschuldigung, dass Sie es nicht überprüft haben, es sieht ziemlich gut aus! Ich muss mich bei Ihnen melden, sobald ich es gelesen habe. Danke :)
James Bedford
1
Könnte ich nur klarstellen, dass auf Seite 2 unter dem Abschnitt "Bank Shot: Kollision zwischen zwei sich bewegenden Kreisen" die Differenz zwischen der Geschwindigkeit der beiden Kreise im Algorithmus anstelle der Geschwindigkeit des ersten Kreises verwendet werden sollte? (Die Geschwindigkeit des zweiten Kreises wird in der stationären Version des Algorithmus nicht verwendet.) Dieses Bit war mir nicht so klar. Vielen Dank.
James Bedford
0

Sie möchten nicht den nächstgelegenen Punkt finden.

Sie möchten den Punkt auf den Linien finden, an dem der Abstand den kombinierten Radien beider Kugeln entspricht.

AttackingHobo
quelle
Ah ... ok! Wissen Sie, wie ich das mathematisch herausfinden kann?
James Bedford
0

Wenn ich Ihre Frage richtig verstehe, können Sie einfach einen Sphere-vs-Sphere-Schnittpunkttest verwenden, wie AttackingHobo vorgeschlagen hat.

Die Mathematik für einen solchen Test lautet wie folgt (korrigieren Sie mich, wenn ich falsch liege, es ist eine Weile her). Dies berücksichtigt auch, dass Ihre Kugeln jeweils einen Mittelpunkt und eine Radiusvariable haben.

Die Formel für die Überprüfung lautet ungefähr so:

distanceOfSpheres <= sumOfRadii^2

Sie haben einen Schnittpunkt zwischen Kugel und Kugel. Das ist ziemlich einfach, mal sehen, wie es im Code aussieht!

bool sphereIntersectTest(BoundingSphere* s1, BoundingSphere* s2)
{
   Vector3 distance;

   // Get the distance between each sphere, center is a Vector3 type
   distance = (s1->center - s2-> center);

   // Determine the sum of both radii
   float radii = (s1->radius + s2->radius);

   // Determine if we have an intersection
   if (distance.length <= (radii * radii))
      return true;
   else
      return false;
}

Auch hier denke ich, dass dies die richtige Antwort ist, nach der Sie vielleicht suchen. Wenn jemand weiß, dass dies falsch ist, korrigieren Sie mich bitte, da es eine Weile her ist, seit ich diese Mathematik durchgeführt habe.

joelretdev
quelle
Ich weiß, wie man einen Kugel-Kugel-Kollisionstest durchführt. Mein Problem ist es, die Position zu finden, an der diese Kollision in Zukunft stattfinden wird. Vielen Dank.
James Bedford
0

Ok, hoffentlich macht das Sinn ... Holen Sie sich die Vektoren der Kugeln und berechnen Sie ihren Kollisionspunkt, nennen Sie dies p1. Finden Sie den Winkel zwischen den beiden Vektoren und nennen Sie dies a1. Bei a1 / 2 zeichnen Sie eine Linie, diese liegt genau in der Mitte in Grad zwischen den beiden Vektoren. Sie benötigen die Stelle auf dieser Linie, an der sin (a1 / 2) = (Radius1 + Radius2) / 2 ist. Wenn dieses Bild in meinem Kopf rechts abgebildet ist, tritt hier die Kollision auf. Entschuldigung, wenn das falsch ist ... es ist spät.

Sam
quelle