2D碰撞响应 - 旋转,移动多边形撞击墙壁

时间:2015-06-15 17:31:49

标签: math game-physics

当其中一个顶点与它碰撞时,我试图将一个具有速度和角速度的多边形从一个(不可移动的)墙上弹开。我可以检测到碰撞,并且我已经研究了如何计算输入并知道我需要什么输出,但是我们还没有能够找到或计算出响应的实现。任何帮助将不胜感激。

function collisionResponse(
    c, // object center of mass position
    v, // velocity of object
    a, // the angular velocity of the object
    p, // point of contact with line
    n  // normalized normal of line
) {
    //  Make a vector from center mass to contact point
    cp = p - c;

    //  Total velocity at contact point (add angular effect)
    pv.x = v.x - cp.y * a;
    pv.y = v.y + cp.x * a;

    //  Reflect point of contact velocity off the line (wall)
    rv = reflect( pv, n );

    // ..magic happens.. ??

    result.v = ?? // resulting object velocity
    result.a = ?? // resulting object angular velocity
    return result;
}

1 个答案:

答案 0 :(得分:5)

虽然不是完全无关紧要,但计算可以降低到高中数学水平。我走的最多 - 但不是全部 - 我最后的二次方程式给你写下来并解决。 There is no LateX on SO,请耐心等待。

答案取决于几个额外的参数:(1)物体M的质量,(2)物体的moment of inertia,表示为I,(3)一个elasticity coefficient for the collision,比如说alpha - 意思是,碰撞中保存了多少动能:0表示完全失去能量(塑性碰撞),1表示完全保持动能(完全弹性碰撞)。

根据牛顿力学规则,墙在物体上运行一些未知的impulse J(基本上为F dt),沿着rv(在你的符号中),导致直线和角动量的变化:< / p>

  

J x cp = I * diff(a)(这是交叉产品,更多信息如下)

     

J = M * diff(v)

假设初始速度为Vi且最终速度为Vf,并且类似于初始角速度Ai和最终Af。所以:

  

Vf = Vi + J / m

     

Af = Ai +(J x cp)/ I

初始和最终动能为:

  

Ei = 0.5 * M * Vi ^ 2 + 0.5 * I * Ai ^ 2   Ef = 0.5 * M * Vf ^ 2 + 0.5 * I * Af ^ 2

让Vf和Af进入:

  

= 0.5 * M *(Vi + J / m)^ 2 + 0.5 * I *(Ai +(J x cp)/ I)^ 2

现在我们要求最终的动能是初始动能的α倍(这是碰撞弹性的定义)。如果你把这两个表达式等同起来,你就得到J中的二次方程式 - 记下解决方案,并按要求得到Vf和Af。

关于交叉乘积的注意事项:在2D中,乘积J x cp可以缩减为以J*cp*sin(theta)获得的标量,其中theta是cp和rv之间的角度。

Theta已经签署,必须带着它的标志!简而言之,如果你的a(角动量)对于逆时针旋转是正的 - 那么theta,J和cp之间的角度应该是从J到cp的逆时针角度。例如 +45 当cp从J逆时针旋转45度时(当然是弧度)

关于我在这次降价中能做的最好的事情。如果需要更多说明,请随时询问。

[编辑:] (1)我修复了-cp回到cp。这个乘法顺序(Jxcp)已经翻转了符号,不需要额外的翻转。

(2)这是一个LateX-less图形尝试: J cp

(3)只有当假定质量密度均匀时,m和I才与恒定的乘法系数相关。如果您确实假设您可以删除其中一个输入 - 但它们通常保持为两个,因为它们形成了描述对象的更直接的方式。

(4)澄清:moment of inertia我不是从等式中推导出的变量,它是问题的参数。就像质量M一样 - 本质上,加速物体有多难 - 它描述了旋转物体的难度。详细的(不复杂的)积分计算在维基百科链接上,对于简单的对象 - 球,圆柱,立方体 - 您可以在线轻松找到固定结果。