# [Math]Determine whether two balls moving at a constant velocity collide with each other

keywords: Algorithms, Ball, Move, Collision, Velocity

Question:

There’re two balls in 3D world space, their radiuses are `r1`

and `r2`

, their center locations are `O1`

and `O2`

, and their constant velocity are `V1`

and `V2`

, please detemine whether two balls collide with each other.

Solution:

Assume that

`ball 1`

is relative static to`ball 2`

, so the relative velocity of`ball 2`

is`V0 = V2 - V1`

.Then calculate the distance(named

Function 1 (In Unity):`d`

) of`O1`

(ball 1) and`V0`

.`double ComputeDistance(vec3 O1, vec3 O2, vec3 V0) { //dot project of V0 and a vector which starting from O2 to 01. float dotProj = (O1 - O2).Dot(V0); //calculate cos value between V0 and (O1 - O2) double centerDist = O1.Distance(O2); double V0Len = V0.magnitude; double cos = dotProj / (centerDist * V0Len); //length of centerDist projected on V0. double projectLen = centerDist * cos; //perpendicular distance from O1 to V0. double d = Mathf.Sqrt(Mathf.Pow(centerDist) - Mathf.Pow(projectLen)); return d; }`

Function 2 (In Unity):

`double computeDistance(vec3 O1, vec3 O2, vec3 V0) { vec3 d = V0 / V0.magnitude; vec3 v = O1 - O2; double t = v.Dot(d); vec3 P = O2 + t * d; return P.Distance(A); }`

Two balls would collide with each other if

`d < r1 + r2`

.

Reference:

https://zhuanlan.zhihu.com/p/22614318

`There is always something left to love. ― Gabriel García Márquez, <One Hundred Years of Solitude>`