[code]                float[] center1=p1.getCenter();
        float[] center2=p2.getCenter();
        float[] velocity1=p1.getVelocity();
        float[] velocity2=p2.getVelocity();
        short r1=p1.getRadius();
        short r2=p2.getRadius();
        float modVelocity1=p1.getVelocityModule();
        float modVelocity2=p2.getVelocityModule();
       
       
            float dx21 = (center2[0]-center1[0]);
            float dy21 = (center2[1]-center1[1]);
            float dz21 = (center2[2]-center1[2]);
       
            float distance = (float) Math.sqrt(dx21*dx21+dy21*dy21+dz21*dz21);
           
            if (distance<((r1+r2))){
                       
                // Unit vector in the direction of the collision
                float ax=((dx21/distance)), ay=((dy21/distance)), az=((dz21/distance));

                float alfa=0;
               
               
                        BigDecimal bg = new BigDecimal((velocity1[0]*dx21+velocity1[1]*dy21+velocity1[2]*dz21)/(modVelocity1*distance));
                        bg = bg.setScale(3, BigDecimal.ROUND_HALF_UP);
                        alfa=(float) Math.acos(bg.doubleValue()); // angle between velocity vector and distance vector
                   
               
   
               
                float alfaX1=(float) Math.acos((dx21)/(distance));
                float alfaY1=(float) Math.acos((dy21)/(distance));
                float alfaZ1=(float) Math.acos((dz21)/(distance));
               
                float modVa1=(float) (Math.abs(modVelocity1)*Math.cos(alfa));
                float vax1=(float) (Math.abs(modVa1)*Math.cos(alfaX1));
                float vay1=(float) (Math.abs(modVa1)*Math.cos(alfaY1));
                float vaz1=(float) (Math.abs(modVa1)*Math.cos(alfaZ1));
                           
               
                float vbx1=velocity1[0]-vax1;
                float vby1=velocity1[1]-vay1;
                float vbz1=velocity1[2]-vaz1;
               
                float beta=0;
               
                        BigDecimal bg = new BigDecimal((velocity2[0]*dx12+velocity2[1]*dy12+velocity2[2]*dz12)/(modVelocity2*distance));
                        bg = bg.setScale(3, BigDecimal.ROUND_HALF_UP);
                        beta=(float) Math.acos(bg.doubleValue()); // angle between velocity vector and distance vector
                   
               
                float alfaX2=(float) Math.acos((dx12)/(distance));
                float alfaY2=(float) Math.acos((dy12)/(distance));
                float alfaZ2=(float) Math.acos((dz12)/(distance));
               
                //Velocity component along the distance vector between the 2 balls
                float modVa2= (float) (Math.abs(modVelocity2)*Math.cos(beta));
                float vax2=(float) (Math.abs(modVa2)*Math.cos(alfaX2));
                float vay2=(float) (Math.abs(modVa2)*Math.cos(alfaY2));
                float vaz2=(float) (Math.abs(modVa2)*Math.cos(alfaZ2));
               
                float vbx2=velocity2[0]-vax2;
                float vby2=velocity2[1]-vay2;
                float vbz2=velocity2[2]-vaz2;

                float vxx21 =(vax2-vax1);
                float vyy21 =(vay2-vay1);
                float vzz21 =(vaz2-vaz1);
                float modDiffVelocity=(float) Math.sqrt(vxx21*vxx21+vyy21*vyy21+vzz21*vzz21);
               
                float va1t=(velocity1[0]*ax+velocity1[1]*ay+velocity1[2]*az);
                float va2t=(velocity2[0]*ax+velocity2[1]*ay+velocity2[2]*az);

                dt = ((r1+r2-distance)/modDiffVelocity);[/code]


I tryed to use the polar coordinates to manage this problem in 3D.
Any ideas?