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.
Hat jemand Vorschläge, wie ich den Kollisionspunkt richtig berechnen kann? Vielleicht, indem man irgendwie die Größe der beiden Objekte berücksichtigt?
quelle
Antworten:
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
quelle
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.
quelle
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:
Sie haben einen Schnittpunkt zwischen Kugel und Kugel. Das ist ziemlich einfach, mal sehen, wie es im Code aussieht!
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.
quelle
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.
quelle