Я работал над определением времени, в которое столкнулись бы два объекта, если бы они вообще были. Я ссылаюсь эта нить, которая была очень полезен: 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 в наши дни.
Вы также хотите реализовать вращательную динамику? Или просто линейный? –
Динамика вращения была бы потрясающей, потому что я хотел бы добавить ее ... но я мог бы жить с линейным на данный момент, если бы это было вне сферы объяснения. –
Является ли ваше определение постоянной трения или некоторой простой функцией времени/скорости? –