如何在圆形预测公式中添加摩擦/阻尼?

时间:2016-06-24 03:15:51

标签: math geometry collision-detection physics easing

我一直致力于确定两个物体碰撞的时间,如果它们完全碰撞的话。我引用了这个非常有帮助的帖子: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*Daxt*Dbxt*Dayt*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。

1 个答案:

答案 0 :(得分:1)

你想要模拟表面摩擦/重力,这个尺度的大多数模型都假设是恒定的。

每个球位置的SUVAT方程式:

enter image description here

中心之间需要距离<半径之和 - 取平方幅度(自点积):

enter image description here

enter image description here

enter image description here

enter image description here

然后你需要做的就是解决这个四次方程,找到最小的正实根。简单!

好的,好的。以下是两个可以帮助您的网站:

如果你不想这样做,那么像Newton-Raphson这样的快速迭代方法就可以了。与基于时间步骤的方法相反,这些限制了答案的准确性。