# Collisions using separating-axis tests

## Presentation on theme: "Collisions using separating-axis tests"— Presentation transcript:

Collisions using separating-axis tests
Christer Ericson Sony Computer Entertainment

Problem statement Determine if two (convex) objects are intersecting. Possibly also obtain contact information. ? !

Underlying theory Set C is convex if and only if the line segment between any two points in C lies in C.

Underlying theory Separating Hyperplane Theorem
States: two disjoint convex sets are separable by a hyperplane.

Underlying theory Nonintersecting concave sets not generally separable by hyperplane (only by hypersurfaces). Concave objects not covered here.

Underlying theory Separation w.r.t a plane P  separation of the orthogonal projections onto any line L parallel to plane normal.

Underlying theory A line for which the projection intervals do not overlap we call a separating axis.

Testing separation Compare absolute intervals Separated if or

Testing separation For centrally symmetric objects: compare using projected radii Separated if

Code fragment void GetInterval(Object o, Vector axis,
float &min, float &max) { min = max = Dot(axis, o.getVertex(0)); for (int i = 1, n = o.NumVertices(); i < n; i++) { float value = Dot(axis, o.getVertex(i)); min = Min(min, value); max = Max(max, value); }

Axes to test But which axes to test? Simplification:
Potentially infinitely many! Simplification: Deal only with polytopes Convex hulls of finite point sets Planar faces

Axes to test Handwavingly:
Look at the ways features of A and B can come into contact. Features are vertices, edges, faces. In 3D, reduces to vertex-face and edge-edge contacts. Vertex-face: a face normal from either polytope will serve as a separating axis. Edge-edge: the cross product of an edge from each will suffice.

Axes to test Theoretically:
Consider the Minkowski difference C of A and B. When A and B disjoint, origin outside C, specifically outside some face F. Faces of C come from A, from B, or from sweeping the faces of either along the edges of the other. Therefore the face normal of F is either from A, from B, or the cross product of an edge from either.

Axes to test Four axes for two 2D OBBs:

Axes to test Segment–Tri 1 1x3 4 Segment–OBB 3 6 AABB–AABB 0(3) 0(3x0)
3D Objects Face dirs (A) Face dirs (B) Edge dirs (AxB) Total Segment–Tri 1 1x3 4 Segment–OBB 3 6 AABB–AABB 0(3) 0(3x0) OBB–OBB 3x3 15 Tri–Tri 11 Tri–OBB 13

Code fragment Note: here objects assumed to be in the same space.
bool TestIntersection(Object o1, Object o2) { float min1, max1, min2, max2; for (int i = 0, n = o1.NumFaceDirs(), i < n; i++) { GetInterval(o1, o1.GetFaceDir(i), min1, max1); GetInterval(o2, o1.GetFaceDir(i), min2, max2); if (max1 < min2 || max2 < min1) return false; } for (int i = 0, n = o2.NumFaceDirs(), i < n; i++) { GetInterval(o1, o2.GetFaceDir(i), min1, max1); GetInterval(o2, o2.GetFaceDir(i), min2, max2); for (int i = 0, m = o1.NumEdgeDirs(), i < m; i++) for (int j = 0, n = o2.NumEdgeDirs(), j < n; j++) { Vector axis = Cross(o1.GetEdgeDir(i), o2.GetEdgeDir(j)); GetInterval(o1, axis, min1, max1); GetInterval(o2, axis, min2, max2); return true; Note: here objects assumed to be in the same space.

Moving objects When objects move, projected intervals move:

Moving objects Objects intersect when projections overlap on all axes.
If tifirst and tilast are time of first and last contact on axis i, then objects are in contact over the interval [maxi { tifirst}, mini { tilast}]. No contact if maxi { tifirst} > mini { tilast}

Moving objects Optimization 1: Optimization 2:
Consider relative movement only. Shrink interval A to point, growing interval B by original width of A. Becomes moving point vs. stationary interval. Optimization 2: Exit as soon as maxi { tifirst} > mini { tilast}

Nonpolyhedral objects
What about: Spheres, capsules, cylinders, cones, etc? Same idea: Identify all ‘features’ Test all axes that can possibly separate feature pairs!

Nonpolyhedral objects
Sphere tests: Has single feature: its center Test axes going through center (Radius is accounted for during overlap test on axis.)

Nonpolyhedral objects
Capsule tests: Split into three features Test axes that can separate features of capsule and features of second object.

Nonpolyhedral objects
Sphere vs. OBB test: sphere center vs. box vertex pick candidate axis parallel to line thorugh both points. sphere center vs. box edge pick candidate axis parallel to line perpendicular to edge and goes through sphere center sphere center vs. box face pick candidate axis parallel to line through sphere center and perpendicular to face Use logic to reduce tests where possible.

Nonpolyhedral objects
For sphere-OBB, all tests can be subsumed by a single axis test: Closest point on OBB to sphere center

Robustness warning Cross product of edges can result in zero-vector.
Typical test: if (Dot(foo, axis) > Dot(bar, axis)) return false; Becomes, due to floating-point errors: if (epsilon1 > epsilon2) return false; Results in: Chaos! (Address using means discussed earlier.)

Contact determination
Covered by Erin Catto (later)

References Ericson, Christer. Real-Time Collision Detection. Morgan Kaufmann Levine, Ron. “Collisions of moving objects.” gdalgorithms-list mailing list article, November 14, Boyd, Stephen. Lieven Vandenberghe. Convex Optimization. Cambridge University Press, Rockafellar, R. Tyrrell. Convex Analysis. Princeton University Press, 1996.