单击以将新球添加到该区域
这个问题有200票以上的问题,最佳答案得分不到一半。我注意到这是因为通常答案要比问题要好。
我试图将建议的代码转换为javascript。我的球 小行星具有以下特性:
vx
,vy
-在x和y轴上的速度x
和y
位置mass
以千克为单位,如果有关系的话因此,我的代码为:
function bounce(objectA, objectB) {
/** objectA and objectB have following properties:
* vx, vy - speed in x and y direction
* x, y - position
* mass - masss
* radius - diameter, calculated from mass
* using average rock density according to wikipedia
***/
// Colision point as seen from B's perspective
var collision = [objectA.x-objectB.x, objectA.y-objectB.y];
var distance = Math.sqrt(collision[0]*collision[0] + collision[1]*collision[1]);
collision[0] /= distance;
collision[1] /= distance;
var aci = objectA.vx* collision[0] + objectA.vy* collision[1];
var bci = objectB.vx* collision[0] + objectB.vy*collision[1];
var totalMass = objectA.mass + objectB.mass;
// This is what I had to add since the original answer doesn't account for mass
var acf = bci * objectB.mass/totalMass;
var bcf = aci * objectA.mass/totalMass;
// I put velocities in arrays in case I wanted to apply more changes
// I mean I need to apply some changes, but I don't know what changes exactly
// to make this crap of code work
var v1 = [(acf-aci) * collision[0], (acf-aci) * collision[1]];
var v2 = [(bcf-bci) * collision[0], (bcf-bci) * collision[1]];
// Addition sure works better than assignment, but I encourage to try it for
// the lulz
objectA.vx += v1[0];
objectA.vy += v1[1];
objectB.vx += v2[0];
objectB.vy += v2[1];
}
现在在我的场景中,我观察到奇怪的行为。如果大球击中小球,小球会飞走,但大球会完全停止。足够大的球应将小球推开而不会减慢速度。
在这种情况下:
有时候是这样的:
无论您使用什么大小,都不会发生这种情况:
我认为这是由于我在两个球之间划分速度的方式引起的。但是还有其他方法确定变化吗?
我了解仅通过查看代码就很难回答这个问题。不幸的是,上下文无法在jsfiddle中适合SSCCE。因此,我花了一些力气在github页面上创建了在线演示,可以在其中编辑上述功能以立即生效。我将尽最大努力确保将演示保存下来,以备将来参考。
阅读有关弹性碰撞的内容。您的方程式缺少重要的因素,例如质量差异,以及(因为您在二维中进行工作)碰撞角。
对于一维碰撞,您需要实现以下方程式(来自该Wikipedia页面),其中u1
和u2
是碰撞之前每个对象的速度,v1
/v2
是碰撞之后的速度。
您可以通过检查系统在碰撞过程中的总动量和动能是否相同来验证结果。
该文章中也有这两个二维方程,但是涉及的内容更多,所以我不会在这里复制它们(我只是粘贴整篇文章)。重要的是,它们需要使用三角函数(sin
,cos
)和点积,这在您当前的实现中是不存在的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句