Monday, November 12, 2012

2D/3D Ball Collision

I used on 1D collission problem where, in case of elastic collision, the ball is changing velocity each other. In 2D/3D case however, the collision is not always head-on collision (which is basically 1 dimension collision).

Head-on
The system above's easy too solve, as simple as interchanging velocity (in elastic case).




Not head-on

When two balls are in non-head-on collision we could always using transposed new coordinate where both of ball center are on the new x-axis like below



On the new coordinate, we can treat the velocities along x-axis as one dimensional collision case and let go on other component (y, z) intact.

Below's snippet from python code of balls collision detection; the whole code is code of moving many ball on a box.

###deteksi tumbukan antar bola
for i in arange(jumlah):
  for j in arange(i+1,jumlah):
    jarak=mag(lbola[i].pos-lbola[j].pos)
    if jarak<(lbola[i].radius+lbola[j].radius):
      arah=norm(lbola[j].pos-lbola[i].pos)
      vi=dot(lbola[i].v,arah)
      vj=dot(lbola[j].v,arah)
      tukar=vj-vi
      lbola[i].v=lbola[i].v+tukar*arah
      lbola[j].v=lbola[j].v-tukar*arah
      pantul=lbola[i].radius+lbola[j].radius-jarak
      lbola[i].pos=lbola[i].pos-pantul*arah
      lbola[j].pos=lbola[j].pos+pantul*arah