2016-06-24 7 views
1

Я работал над определением времени, в которое столкнулись бы два объекта, если бы они вообще были. Я ссылаюсь эта нить, которая была очень полезен: Circle-Circle Collision PredictionКак добавить трение/демпфирование по кругу в формулу прогнозирования круга?

(Oax + t*Dax - Obx - t*Dbx)^2 + (Oay + t*Day - Oby - t*Dby)^2 = (ra + rb)^2

я был в состоянии решить, что для t, но теперь мне интересно, как я бы лучше применить сопротивления/трение к нему.

Если мяч1 перемещается с фиксированной скоростью 9, а ball2 путешествует на 7 ... это отлично работает. Проблема в том, что если их скорости будут уменьшаться с течением времени. Поэтому, если мы покрываем много земли, ball1 будет перемещаться на 4, и поэтому результат столкновения может измениться.

Например: Ball1 движется вниз по небольшому склону, набирает скорость. Ball2 идет прямо и проигрывает скорость.

Я предполагаю, что часть этой формулы нуждающейся корректировка будет вполне t*Dax, t*Dbx, t*Day и t*Dby. Они кажутся линейными, верно? Поэтому я хотел бы заменить их чем-то, представляющим мое затухание.

Там, вероятно, будет несколько вещей, определения моего затухания, таких как: поверхностное трение и гравитации .. или может ссылаться на ослабление уравнений, такие как уравнения Роберта Пеннер в этой файле http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js

спасибо!

Edit:

Посмотрел некоторые формулы движения снаряда и играл с d = V₀t - ½ at². Интересно, сочетает ли это это трюк, но не уверен, где/как он будет применяться. Я рассмотрел следующие ...

(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₂)²

Update (благодаря сообщению от willywonkadailyblah)

После работы с ним немного, вот быстрый пример Javascript этого работает. Вы можете найти ссылки на классы Vector и Quartic solvers онлайн.

// 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 хорошо работает с этим, но вы должны вручную добавить метод pow. https://evanw.github.io/lightgl.js/docs/vector.html

Вот квадратный/кубический/квадратичный решатель для JS. Вам нужно будет внести немало изменений в источник, чтобы заставить его работать с вашим приложением или перевести его на другие языки. http://www.freewebs.com/brianjs/ultimateequationsolver.htm

Я собирался опубликовать C++, но понял, что это будет легко для многих людей, и многие люди используют JS в наши дни.

+1

Вы также хотите реализовать вращательную динамику? Или просто линейный? –

+0

Динамика вращения была бы потрясающей, потому что я хотел бы добавить ее ... но я мог бы жить с линейным на данный момент, если бы это было вне сферы объяснения. –

+1

Является ли ваше определение постоянной трения или некоторой простой функцией времени/скорости? –

ответ

1

Вы хотели смоделировать поверхностное трение/гравитацию, которое большинство моделей в этом масштабе считают постоянными.

SUVAT уравнение для позиций каждого шара:

enter image description here

Потребности расстояние между центрами < сумма радиусов - взять квадрат величины (само скалярное произведение):

enter image description here

Пусть enter image description here

enter image description here

enter image description here

И тогда все, что вам нужно сделать, это решить эту квартику уравнение, чтобы найти наименьший положительный действительный корень. Легко!

Хорошо. Вот два сайта, которые помогут вам:

Если вы не хотите, чтобы это сделать, то быстрый итерационный метод, такой как Ньютон-Рафсона будет делать; вопреки временным методам, эти не ограничивают точность ответов.

+0

Возможно, это то, что я ищу! Позвольте мне прочитать его более подробно .. но спасибо за сообщение! –

+0

Присвоение очков, потому что это определенно направление, которое я искал, хотя я его еще не сломал/применил. Пометьте ответ правильно, как только я пройду через него ... (просто чтобы быть тщательным). Спасибо за вклад. –

+1

@MattKenefick np man, удачи с реализацией этого квартирного дерьма: D –