Ich habe daran gearbeitet, die Zeit zu bestimmen, zu der zwei Objekte kollidieren würden, wenn sie überhaupt würden. Ich hatte diesen Thread verwiesen, was sehr hilfreich war: Circle-Circle Collision PredictionWie fügt man Reibung/Dämpfung hinzu, um die Vorhersageformel zu kreisen?
(Oax + t*Dax - Obx - t*Dbx)^2 + (Oay + t*Day - Oby - t*Dby)^2 = (ra + rb)^2
konnte ich das für t
lösen, aber jetzt frage ich mich, wie ich am besten per Drag/Reibung es gelten würde.
Wenn Ball1 mit einer festen Rate von 9 und Ball2 mit 7 fährt, funktioniert das großartig. Problem ist, dass wenn ihre Geschwindigkeiten mit der Zeit abnehmen werden. Wenn wir also viel Boden bedecken, wird ball1 am Ende um 4 fahren und das Kollisionsergebnis könnte sich ändern.
Zum Beispiel: Ball1 fährt eine leichte Steigung hinunter, gewinnt an Geschwindigkeit. Ball2 geht geradeaus und verliert an Geschwindigkeit.
Ich gehe davon aus, dass der Teil dieser Formel Einstellung benötigt die t*Dax
, t*Dbx
, t*Day
und t*Dby
wäre. Diese scheinen linear zu sein, oder? Also würde ich diese durch etwas ersetzen wollen, das meine Dämpfung repräsentiert. Oberflächenreibung und Schwerkraft .. oder könnte Referenz Lockerung Gleichungen wie Robert Penner Gleichungen in dieser Datei http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js
Danke:
würde es wahrscheinlich mehr Dinge zu bestimmen meine Dämpfung wie sein!
Edit:
Sah einige Wurfbewegung Formeln und spielte herum mit d = V₀t - ½ at²
. Ich frage mich, ob das Kombinieren der Trick ist, aber nicht sicher wo/wie es angewendet werden würde. Da ich aber die folgende ...
(O₁x + (t·D₁x - a₁t²) - O₂x - (t·D₂x + a₂t²))² + (O₁y + (t·D₁y - a₁t²) - O₂y - (t·D₂y + a₂t²))² = (r₁ + r₂)²
aktualisieren (dank der Beitrag von willywonkadailyblah)
Nachdem sie mit ihm ein bisschen arbeiten, ist hier ein schneller Javascript Beispiel dafür arbeiten. Referenzen zu Vector-Klassen und Quartz-Solvern finden Sie online.
// p1 = c1 + (v1 * t) + 0.5 * a1 * (t^2)
// p2 = c2 + (v2 * t) + 0.5 * a2 * (t^2)
var p1c = new Vector(10, 50),
p1v = new Vector(10, -10),
p1a = new Vector(5, 2),
p2c = new Vector(50, 10),
p2v = new Vector(-10, 10),
p2a = new Vector(-9, 0),
r1 = r2 = 15,
p1, p2,
oc, ov, oa,
A, B, C, D, E,
q, r, s, t, u;
var quadraticAnswers = solveQuadratic(p1c, p1v, p2c, p2v, r1);
var quarticAnswers = solveQuartic(p1c, p1v, p1a, p2c, p2v, p2a, r1, r2);
console.log("Quartic", quarticAnswers);
console.log("Quadratic", quadraticAnswers);
console.log("Best Quartic", quarticAnswers.bestAnswer);
function solveQuartic(p1c, p1v, p1a, p2c, p2v, p2a, r1, r2) {
// delta p
oc = p1c.subtract(p2c);
// delta v
ov = p1v.subtract(p2v);
// delta a
oa = p1a.subtract(p2a);
//
A = oa.magnitude().pow(2).multiply(0.25);
B = ov.multiply(oa);
C = oc.multiply(oa).add(ov.magnitude().pow(2))
D = ov.multiply(oc).multiply(2);
E = oc.magnitude().pow(2);
q = A.x + A.y;
r = B.x + B.y;
s = C.x + C.y;
t = D.x + D.y;
u = E.x + E.y - Math.pow(r1 + r2, 2); // hidden because of the issue with radius not adding up
// the quartic/cubic/quadratic solver
var ret = solveEquations(q, r, s, t, u);
if (oa.x + oa.y < 0) {
ret.bestAnswer = ret.x4 || ret.x3 || ret.x2 || ret.x1;
}
else {
ret.bestAnswer = ret.x2 || ret.x1 || ret.x4 || ret.x3;
}
return ret;
}
VectorJS funktioniert gut mit diesem, aber Sie müssen manuell eine pow
Methode hinzufügen. https://evanw.github.io/lightgl.js/docs/vector.html
Hier ist ein quartic/kubische/quadratische Löser für JS. Sie müssen einige Änderungen an der Quelle vornehmen, um sie mit Ihrer App zu kombinieren oder in andere Sprachen zu übersetzen. http://www.freewebs.com/brianjs/ultimateequationsolver.htm
Ich wollte ein C++ posten, aber ich dachte, das wäre für viele Leute einfach und viele Leute benutzen JS heutzutage.
Sie möchten auch die Rotationsdynamik implementieren? Oder einfach nur linear? –
Rotationsdynamik wäre genial, weil ich es gerne hinzufügen würde ... aber ich könnte mit linear für den Moment leben, wenn es außerhalb des Bereichs der Erklärung liegt. –
Ist Ihre Definition von Reibung konstant oder eine einfache Funktion von Zeit/Geschwindigkeit? –