【问题标题】:2D Collision response - rotating, moving polygon hitting a wall2D 碰撞响应 - 旋转、移动的多边形撞到墙上
【发布时间】:2015-06-15 17:31:48
【问题描述】:

当一个顶点与它发生碰撞时,我试图将一个同时具有速度和角速度的多边形从(不可移动的)墙上弹开。我可以检测到碰撞,并且我已经弄清楚了如何计算输入并知道我需要什么输出,但是无法找到或制定响应的实现。任何帮助将不胜感激。

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;
}

【问题讨论】:

    标签: math game-physics


    【解决方案1】:

    虽然并非完全微不足道,但计算可以简化为高中水平的数学。我会走大部分(但不是全部)的路:我留给你写下和求解的最后一个二次方程。 There is no LateX on SO,所以请耐心等待。

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

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

    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 和 A​​f 进入:

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

    现在我们要求最终动能是初始动能的 α 倍(这是碰撞弹性的定义)。如果您将这两个表达式等同起来,您将在 J 中得到一个二次方程 - 记下解决方案,您将获得所需的 Vf 和 A​​f。

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

    Theta 已签名,必须注意其符号!简而言之,如果你的 a(角动量)对于逆时针旋转是正的 - 那么 J 和 cp 之间的角度 theta 应该是从 J 到 cp 的逆时针角度。例如+45 当 cp 从 J 逆时针旋转 45 度时。(当然是弧度)

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

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

    (2) 这是一个没有 LateX 的图形尝试:

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

    (4) 澄清:moment of inertiaI 不是从方程中推导出来的变量,它是问题的一个参数。就像质量 M——本质上是加速物体的难度——它描述了旋转物体的难度。详细(不复杂)的积分计算在 wikipedia 链接上,对于简单的对象 - 球、圆柱体、立方体 - 您可以轻松地在线找到预设结果。

    【讨论】:

    • 非常感谢 mich Ofek,今晚我会努力解决这个问题。
    • 对不起,差异是什么意思?差异(a),差异(v)
    • 区别。 diff(v) = Vf - Vi
    • 对不起,我的数学能力很弱。我仍然不明白如何使用这些方程,因为它们需要 J,但我们需要得到的速度和角速度来计算 J……这就是我想要得到的结果。另一件事……我们需要物体的质量吗?任何质量都不是一样的吗?
    • 感谢您的所有时间。我想我很困惑,我确实有 J,它是我的向量 rv。是我,我不知道它的价值。所以我的功能是:result.v = v + rv; result.a = a + cross(rv, cp) / i; 但我还是没有我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2015-07-24
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多