当其中一个顶点与它碰撞时,我试图将一个具有速度和角速度的多边形从一个(不可移动的)墙上弹开。我可以检测到碰撞,并且我已经研究了如何计算输入并知道我需要什么输出,但是我们还没有能够找到或计算出响应的实现。任何帮助将不胜感激。
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;
}
答案 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图形尝试:
(3)只有当假定质量密度均匀时,m和I才与恒定的乘法系数相关。如果您确实假设您可以删除其中一个输入 - 但它们通常保持为两个,因为它们形成了描述对象的更直接的方式。
(4)澄清:moment of inertia我不是从等式中推导出的变量,它是问题的参数。就像质量M一样 - 本质上,加速物体有多难 - 它描述了旋转物体的难度。详细的(不复杂的)积分计算在维基百科链接上,对于简单的对象 - 球,圆柱,立方体 - 您可以在线轻松找到固定结果。