我一直致力于确定两个物体碰撞的时间,如果它们完全碰撞的话。我引用了这个非常有帮助的帖子:Circle-Circle Collision Prediction
(Oax + t*Dax - Obx - t*Dbx)^2 + (Oay + t*Day - Oby - t*Dby)^2 = (ra + rb)^2
我能够为t
解决这个问题,但现在我想知道如何最好地应用阻力/摩擦力。
如果ball1以9的固定速率行进,而ball2正以7的速度行进......这很有效。问题是如果它们的速度会随着时间的推移而减小..所以如果我们覆盖了很多地面,那么ball1最终会以4的速度行进,因此碰撞结果可能会发生变化。
例如:Ball1沿着一个小斜坡向下行进,获得了速度。 Ball2正在直线而且失去速度。
我假设需要调整的公式部分是t*Dax
,t*Dbx
,t*Day
和t*Dby
。这些似乎是线性的,对吧?所以我想用代表我阻尼的东西来代替它们。
可能有多种因素决定我的阻尼,例如:表面摩擦力和重力......或者可以参考缓和方程式,例如此文件中的Robert Penner方程式http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js
谢谢!
编辑:
查看了一些弹丸运动公式并且正在玩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₂)²
更新(感谢willywonkadailyblah的帖子)
使用它之后,这里有一个快速的Javascript示例。您可以在线找到对Vector类和Quartic求解器的引用。
// 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。
答案 0 :(得分:1)
你想要模拟表面摩擦/重力,这个尺度的大多数模型都假设是恒定的。
每个球位置的SUVAT方程式:
中心之间需要距离<半径之和 - 取平方幅度(自点积):
然后你需要做的就是解决这个四次方程,找到最小的正实根。简单!
好的,好的。以下是两个可以帮助您的网站:如果你不想这样做,那么像Newton-Raphson这样的快速迭代方法就可以了。与基于时间步骤的方法相反,这些不限制了答案的准确性。