2016-06-24 23 views
1

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.

+1

Sie möchten auch die Rotationsdynamik implementieren? Oder einfach nur linear? –

+0

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. –

+1

Ist Ihre Definition von Reibung konstant oder eine einfache Funktion von Zeit/Geschwindigkeit? –

Antwort

1

Sie wollten Oberflächenreibung/Schwerkraft simulieren, die die meisten Modelle auf dieser Skala als konstant annehmen.

Suvat Gleichungen für die Positionen jeder Kugel:

enter image description here

Need Weite < Summe der Radien - nimm quadratische Größe (self Punktprodukt):

enter image description here

Lassen Sie enter image description here

enter image description here

enter image description here

Und dann alles, was Sie tun müssen, ist diese quartic Gleichung zu lösen, um die kleinste positive reelle Wurzel zu finden. Einfach!

Nun OK. Hier sind zwei Websites, um Ihnen zu helfen:

Wenn Sie nicht wollen, dies zu tun, dann ein schnelles iterativen Verfahren wie Newton-Raphson tun; im Gegensatz zu zeitschrittbasierten Methoden beschränken diese nicht die Genauigkeit der Antworten.

+0

Das könnte sein, was ich suche! Lass mich das genauer durchlesen .. aber danke für die Post! –

+0

Punkte vergeben, weil dies definitiv die Richtung ist, nach der ich gesucht habe, auch wenn ich sie noch nicht gebrochen/angewendet habe. Wird die Antwort richtig markieren, sobald ich es durchlaufe ... (nur um gründlich zu sein). Danke für den Beitrag. –

+1

@MattKenefick np man, viel Glück bei der Umsetzung dieses quartären Mists: D –