Javascript 模拟两个相互反弹的圆
我有很多粒子在四处移动,当它们接触时,我会通过检测来观察它们。如果两个粒子接触,它们将以相反方向反弹Javascript 模拟两个相互反弹的圆,javascript,physics,game-physics,paperjs,Javascript,Physics,Game Physics,Paperjs,我有很多粒子在四处移动,当它们接触时,我会通过检测来观察它们。如果两个粒子接触,它们将以相反方向反弹 particle.moveSelf = function() { var radians = this.angle * Math.PI / 180; var moveX = this.velocity * Math.sin(radians); var moveY = this.velocity *
particle.moveSelf = function() {
var radians = this.angle * Math.PI / 180;
var moveX = this.velocity * Math.sin(radians);
var moveY = this.velocity * Math.cos(radians);
for (var i = 0; i < particles.length; i++) {
var distance = this.position.getDistance(new Point(particles[i].position.x, particles[i].position.y));
//if distance < radius 1 + radius 2, bounce this circle away
if (distance < (this.radius + particles[i].radius) && this.id !== particles[i].id) {
this.velocity = -this.velocity;
}
}
this.position.x += moveX;
this.position.y += moveY;
};
particle.moveSelf=函数(){
var弧度=this.angle*Math.PI/180;
var moveX=this.velocity*Math.sin(弧度);
var moveY=this.velocity*Math.cos(弧度);
对于(var i=0;i
当我运行这段代码时,这些圆彼此卡住,每帧以1*的速度来回移动
关于如何计算弹跳的速度或角度有很多问题,但我的问题是它会陷入无限振荡。我以前做过这件事,所以这里有一些见解:
- 在第一个过程中,您只需检测碰撞
- 并使用相互碰撞的所有粒子的索引清除/填充碰撞列表
for (i=0;i<particles;i++) particle[i].collide.clear(); for (i=0;i<particles;i++) for (j=i+1;j<particles;j++) if (colide(particle[i],particle[j])) { particle[i].collide.add(j); particle[j].collide.add(i); }
for(i=0;我无法提供答案,因为我们无法测试它,但是,这里有一些建议。首先执行for,然后计算位置。在for中,首先检查您的id(现在您最后检查),如果(this.id==particles[i].id)继续,请使用
for (i=0;i<particles;i++) for (j=0;j<particle[i].collides;j++) { // here compute reflected direction ,speed whatever of the bounce to vector dir particle[ i].reflect+=dir; particle[particle[i].collide[j]].reflect+=dir; }
for (i=0;i<particles;i++) { particle[i].speed=compute_speed_from(particle[i].reflect); }