具有不同球质量的逼真的球碰撞-小球阻止大球

Tomas Zato-恢复莫妮卡

tl; dr演示,带有反弹功能的编辑器

单击以将新球添加到该区域

这个问题有200票以上的问题,最佳答案得分不到一半。我注意到这是因为通常答案要比问题要好。

我试图将建议的代码转换为javascript。我的 小行星具有以下特性:

  • vxvy-在x和y轴上的速度
  • xy位置
  • 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页面),其中u1u2是碰撞之前每个对象的速度,v1/v2碰撞之后的速度。

一维弹性碰撞,对象1

一维弹性碰撞,对象1

您可以通过检查系统在碰撞过程中的总动量和动能是否相同来验证结果。

该文章中也有这两个二维方程,但是涉及的内容更多,所以我不会在这里复制它们(我只是粘贴整篇文章)。重要的是,它们需要使用三角函数(sincos)和点积,这在您当前的实现中是不存在的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有不同球质量的逼真的球碰撞-小球阻止大球

来自分类Dev

如何阻止球从球拍“定相”?

来自分类Dev

加工| 如何阻止球改变颜色

来自分类Dev

球相互碰撞

来自分类Dev

球碰撞粘在静态球上

来自分类Dev

如何在python中制作这9个具有不同颜色和大小的不同球

来自分类Dev

具有数字顺序的球

来自分类Dev

如何使球忽略彼此的碰撞

来自分类Dev

与球碰撞时移除物体

来自分类Dev

如何使球忽略彼此的碰撞

来自分类Dev

弧线球的碰撞检测

来自分类Dev

为什么块不与球碰撞

来自分类Dev

如何使多个球不断产生碰撞代码

来自分类Dev

球和曲线作为图形对象的碰撞

来自分类Dev

球与天花板碰撞时间

来自分类Dev

没有初始速度的两个加速球之间的碰撞检测?

来自分类Dev

如何在libgdx中创建带有碰撞和球的随机和无限墙?

来自分类Dev

打砖块克隆,球砖碰撞和砖碰撞时的球行为

来自分类Dev

Tkinter 球没有动画?

来自分类Dev

如何随机分配我的球与桨碰撞的位置?乒乓球比赛

来自分类Dev

运行乒乓球游戏时,球动画真的很垃圾

来自分类Dev

当我按下按钮时,为什么小球没有在我的小程序中移动?

来自分类Dev

如何实现简单的二维球碰撞?

来自分类Dev

精灵正在碰撞,但球不会向相反方向反弹

来自分类Dev

快速检查每帧多个球之间的碰撞的方法

来自分类Dev

如何在Pygame中修复球与矩形物体的碰撞

来自分类Dev

计算碰撞时球的位置最简单的方法是什么?

来自分类Dev

如何改善/修复球和桨之间的碰撞检测?

来自分类Dev

更改球的位置时,与墙的碰撞不适用