[Math]Determine whether two balls moving at a constant velocity collide with each other
keywords: Math, 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 toball 2
, so the relative velocity ofball 2
isV0 = V2 - V1
. -
Then calculate the distance(named
d
) ofO1
(ball 1) andV0
. Function 1 (In Unity):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>