Ich bin ein Physik-Engine/Simulator zu schreiben, die 3D-Raumflug, Planeten-/Stern Gravitation, Schiff Schub- und relativistische Effekte beinhaltet. Bisher geht es sehr gut, aber eine Sache, die ich brauche Hilfe bei der Mathematik der Kollisionserkennung algorithmus.Kollisionserkennung zwischen Accelerating Spheres
Die iterative Simulation von Bewegung, die ich im Grunde bin mit wie folgt:
. (Anmerkung: 3D-Vektoren sind alle CAPS)
For each obj
obj.ACC = Sum(all acceleration influences)
obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2 (*EQ.2*)
obj.VEL = obj.VEL + (obj.ACC * dT)
Next
Wo:
obj.ACC is the acceleration vector of the object
obj.POS is the position or location vector of the object
obj.VEL is the velocity vector of the object
obj.Radius is the radius (scalar) of the object
dT is the time delta or increment
Was ich im Grunde tun müssen, ist eine effiziente Formel finden, die für zwei Objekte aus (EQ.2) oben leitet (obj1, obj2) und sagen, ob sie jemals kollidieren, ein Und wenn ja, zu welcher Zeit. Ich brauche die genaue Zeit so beide, dass ich feststellen kann, ob es in diesem Zeitschritt ist (weil accelleratons zu verschiedenen Zeitschritten anders sein wird) und so auch, dass ich die genaue Position finden kann (was ich weiß, wie zu tun, angesichts der Zeit)
Für diesen Motor, ich alle Objekte als Kugeln bin Modellierung, all diese Formel/algortithim braucht, ist zu tun, um herauszufinden, welche Punkte:
(obj1.POS - obj2.POS).Distance = (obj1.Radius + obj2.Radius)
wo .Distance einen positiven Skalar ist. (Sie können auch beide Seiten quadrieren, wenn dies einfacher ist, um die in der .Distance-Berechnung implizite Quadratwurzelfunktion zu vermeiden).
(Ja, mir sind viele, viele andere Kollisionsdetektionsfragen bekannt, jedoch scheinen ihre Lösungen für ihren Motor und ihre Annahmen sehr spezifisch zu sein, und keiner scheint meinen Bedingungen zu entsprechen: 3D, Kugeln und Beschleunigung . innerhalb der Simulation Schritten Lassen Sie mich wissen, wenn ich falsch bin)
einige Klärungen.
1) Es genügt nicht, für mich für * Überschneidung * der beiden Sphären zu prüfen, vor und nach dem Zeitinkrement. In vielen Fällen werden ihre Geschwindigkeiten und Positionsänderungen ihre Radien weit überschreiten.
2) RE: Effizienz, ich brauche keine Hilfe (an dieser Stelle sowieso) in Bezug wahrscheinliche Kandidaten für Kollisionen zu bestimmen, denke ich, dass ich die überdachten habe.
Eine weitere Klärung, die viel kommen zu sein scheint:
3) Meine Gleichung (EQ.2) inkrementeller Bewegung ist eine quadratische Gleichung, die sowohl Geschwindigkeit und Beschleunigung gilt:
obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2
den Physik-Engines, die ich gesehen habe (und sicherlich jeden Spiel-Engine, die ich je gehört habe) nur lineare Gleichungen der inkrementellen Bewegung, die nur Geschwindigkeit gelten:
obj.POS = obj.POS + (obj.VEL * dT)
dieser Grund habe ich nicht die allgemein veröffentlichten Lösungen zur Kollisionserkennung auf dem Stack gefunden verwenden kann Überlauf, auf Wikipedia und im gesamten Web, z. B. zum Auffinden der Kreuzung/engsten Annäherung von zwei Liniensegmenten. Meine Simulation beschäftigt sich mit variablen Beschleunigungen, die für die Ergebnisse von grundlegender Bedeutung sind. Was ich also brauche, ist die Kreuzung/engste Annäherung von zwei parabolischen Segmenten.
danke tcovo, das ist ein guter Anfang auf genau das, was ich brauche. Irgendeine Idee, wie man die kubische Gleichungslösung bei Wikipedia auf Vektorkoeffizienten ausdehnt? – RBarryYoung
Die kubische Gleichung, die ich geschrieben habe, hat skalare Koeffizienten: das Skalarprodukt zweier Vektoren ist ein Skalar, und das Quadrat der Magnitude ist ebenfalls ein Skalar. Ich habe meine Antwort bearbeitet, um auf diese näher einzugehen. – tcovo
Ah, großartig! Danke ... – RBarryYoung