如何通过碰撞检测使多个圆形对象彼此不相交?

时间:2019-05-17 12:32:01

标签: javascript vector collision-detection game-physics

我总共有1到64个Blob,它们都移到我的鼠标位置。但是我希望他们不要彼此碰到对方,换句话说就是撞圈检测。但是我似乎无法使其平滑并在它们第一次移动后也推动新对象?

尝试检查每个斑点是否与其他斑点冲突。如果碰撞正确,则将斑点之间的距离设置为其累积半径。

这就是我编写碰撞函数的方式,但是这种方式会使位置重置太快。我希望它是一个平稳但快速的过渡。就像现在不是1帧,可以说10帧。还有一个问题是,当两个对象的半径相距一定距离时,它们可能会碰撞成新的半径,这将导致此代码再次运行,然后所有斑点变得发疯。

this.collide = function() {
   var length = this.blobs.length; // How many blobs?

   this.blobs.forEach(function(item, index) {
      for (var i = 0; i < length; i++) {

         // Get absolute distance between two vectors
         var v0 = vectorFromTo(blob.blobs[i].pos.x, blob.blobs[i].pos.y, //[x2, y2]
                               item.pos.x, item.pos.y); //[x1, y1]

         // if colliding, set distance between to their accumulated radiuses
         if (magnitude(v0) < blob.blobs[i].r + item.r) {
         item.pos.add(v0.setMag(magnitude(v0) - (blob.blobs[i].r + item.r))); 
         }
      }
   });
}

我还没有尝试编写另一种方式来实现此目的,因为我还没有在学校里学习矢量,但是我对它们有相当的了解。但是我认为,如果我检查了碰撞,并且它们碰撞,它们会沿赤字距离的50%相反的方向前进,然后检查它们是否撞到了新的斑点,那么它们会起作用。但这需要物理对吗?原因是,它还必须对Blob的质量和速度做一些事情,才能知道它撞到的新Blob将会发生什么?

编辑:

我正在寻找的是:https://youtu.be/QvlhRGtlcsw

这是当前的样子:https://youtu.be/QEpHnCgomqY

0 个答案:

没有答案