如何将 friction/damping 添加到圈到圈预测公式?
How to add friction/damping to circle to circle prediction formula?
我一直在努力确定两个物体发生碰撞的时间,如果它们发生碰撞的话。我参考了这个非常有帮助的帖子:Circle-Circle Collision Prediction
(Oax + t*Dax - Obx - t*Dbx)^2 + (Oay + t*Day - Oby - t*Dby)^2 = (ra + rb)^2
我能够为 t
解决这个问题,但现在我想知道如何最好地将 drag/friction 应用于它。
如果球 1 以 9 的固定速度行进,而球 2 以 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²
。想知道结合起来是否是诀窍,但不确定 where/how 它是否会被应用。我考虑了以下...
(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 的 post)
在使用它之后,这里有一个快速的 Javascript 工作示例。您可以在线找到对矢量 类 和四次求解器的参考。
// 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 的 quartic/cubic/quadratic 求解器。您需要对源代码进行大量修改才能使其与您的应用程序一起使用或将其翻译成其他语言。 http://www.freewebs.com/brianjs/ultimateequationsolver.htm
我打算 post C++,但认为这对很多人来说很容易,而且现在很多人使用 JS。
您想模拟表面摩擦力/重力,该比例的大多数模型都假定它是恒定的。
每个球位置的 SUVAT 方程式:
需要中心之间的距离 < 半径之和 - 取平方大小(自点积):
让
然后你需要做的就是解这个四次方程,找到最小的正实根。简单!
好的。这里有两个网站可以帮助您:
- https://en.wikipedia.org/wiki/Quartic_function
- https://math.stackexchange.com/questions/785/is-there-a-general-formula-for-solving-4th-degree-equations
如果你不想这样做,那么像Newton-Raphson这样的快速迭代方法就可以了;与基于时间步长的方法相反,这些不会限制答案的准确性。
我一直在努力确定两个物体发生碰撞的时间,如果它们发生碰撞的话。我参考了这个非常有帮助的帖子:Circle-Circle Collision Prediction
(Oax + t*Dax - Obx - t*Dbx)^2 + (Oay + t*Day - Oby - t*Dby)^2 = (ra + rb)^2
我能够为 t
解决这个问题,但现在我想知道如何最好地将 drag/friction 应用于它。
如果球 1 以 9 的固定速度行进,而球 2 以 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²
。想知道结合起来是否是诀窍,但不确定 where/how 它是否会被应用。我考虑了以下...
(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 的 post)
在使用它之后,这里有一个快速的 Javascript 工作示例。您可以在线找到对矢量 类 和四次求解器的参考。
// 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 的 quartic/cubic/quadratic 求解器。您需要对源代码进行大量修改才能使其与您的应用程序一起使用或将其翻译成其他语言。 http://www.freewebs.com/brianjs/ultimateequationsolver.htm
我打算 post C++,但认为这对很多人来说很容易,而且现在很多人使用 JS。
您想模拟表面摩擦力/重力,该比例的大多数模型都假定它是恒定的。
每个球位置的 SUVAT 方程式:
需要中心之间的距离 < 半径之和 - 取平方大小(自点积):
让
然后你需要做的就是解这个四次方程,找到最小的正实根。简单!
好的。这里有两个网站可以帮助您:
- https://en.wikipedia.org/wiki/Quartic_function
- https://math.stackexchange.com/questions/785/is-there-a-general-formula-for-solving-4th-degree-equations
如果你不想这样做,那么像Newton-Raphson这样的快速迭代方法就可以了;与基于时间步长的方法相反,这些不会限制答案的准确性。