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

Labels

Picture (491) diary (109) computer (97) Python (39) programming (30) Physicist (25) coding (24) mac (19) os x (19) linux (15) music (15) lion (14) S2 (13) internet (11) HTML5 (10) crazyness (10) delphi (10) flash (6) fortran (5) iPad (5) blackberry (3) Math (2) mountain lion (2) apple (1) iOS (1) iPhone (1) javascript (1) mathematica (1) php (1)