Math 如何将摩擦/阻尼添加到循环预测公式中?

Math 如何将摩擦/阻尼添加到循环预测公式中?,math,geometry,collision-detection,physics,easing,Math,Geometry,Collision Detection,Physics,Easing,我一直在努力确定两个物体碰撞的时间,如果它们真的发生碰撞的话。我引用了这条非常有用的线索: (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

我一直在努力确定两个物体碰撞的时间,如果它们真的发生碰撞的话。我引用了这条非常有用的线索:

(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
。这些似乎是线性的,对吗?所以我想用一些代表我阻尼的东西来代替它们

可能有多种因素决定我的阻尼,比如:表面摩擦和重力。。或者可以在本文件中引用诸如罗伯特·彭纳方程之类的缓和方程

谢谢

编辑:

查了一些弹丸运动公式,正在玩
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示例,您可以在网上找到对向量类和四次解算器的引用

// 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;
    }
//p1=c1+(v1*t)+0.5*a1*(t^2)
//p2=c2+(v2*t)+0.5*a2*(t^2)
变量p1c=新向量(10,50),
p1v=新向量(10,-10),
p1a=新向量(5,2),
p2c=新向量(50,10),
p2v=新向量(-10,10),
p2a=新向量(-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=四分之一(p1c、p1v、p1a、p2c、p2v、p2a、r1、r2);
控制台日志(“四次”,四次应答器);
console.log(“二次型”,平方型);
console.log(“最佳四分位数”,quarticAnswers.bestAnswer);
四次函数(p1c、p1v、p1a、p2c、p2v、p2a、r1、r2){
//δp
oc=p1c减去(p2c);
//三角洲v
ov=p1v减去(p2v);
//δa
oa=p1a.减去(p2a);
//
A=oa.magnity().pow(2)乘以(0.25);
B=ov.乘法(oa);
C=摄氏度乘(oa)加(ov.magnity().pow(2))
D=ov.乘法(oc).乘法(2);
E=摄氏度()功率(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);//由于半径不相加的问题而隐藏
//四次/三次/二次解算器
var ret=方程组(q、r、s、t、u);
if(oa.x+oa.y<0){
ret.bestAnswer=ret.x4 | | ret.x3 | | ret.x2 | | ret.x1;
}
否则{
ret.bestAnswer=ret.x2 | | ret.x1 | | ret.x4 | ret.x3;
}
返回ret;
}
VectorJS可以很好地处理这个问题,但是您必须手动添加
pow
方法

这是一个用于JS的四次/三次/二次解算器。你需要对源代码进行大量修改,以使其与你的应用程序一起工作或将其翻译成其他语言


我打算发布C++,但这对很多人来说都是容易的,现在很多人都使用JS。

< P>你想模拟表面摩擦力/重力,大多数模型在这个尺度上假设是常数。 每个球位置的SUVAT方程:

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

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

好的。这里有两个网站可以帮助您:


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

你是想实现旋转动力学呢?还是仅仅是线性动力学?旋转动力学会很棒,因为我很想添加它……但我可以用线性动力学来解决问题那一刻,如果它超出了解释的范围。你对摩擦常数的定义是什么,还是时间/速度的简单函数?它是一个常数摩擦。它是一个任意的阻力,使运动速度减慢…0.32或任何东西。最终物体应该减速到停止。这可能就是我要找的!让我读更多thor当然…但是谢谢你的帖子!奖励分数,因为这绝对是我一直在寻找的方向,即使我还没有细分/应用它。我会在完成后标记正确答案…(只是为了彻底)。谢谢你的贡献。@MattKenefick np man,祝你好运,实现四次废话:Dapologies,因为迟来的回复-它们分别是delta v和delta c,我在复制一些粗略的注释:S上一行是正确的though@MattKenefick:D对不起,打字太无聊了,你的大脑都快晕过去了我走过去,盲目地跟随你在面前的一张废纸上写的东西