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