Collisions using separating-axis tests Christer Ericson Sony Computer Entertainment Slides @

Post on 27-Mar-2015

217 views 2 download

Tags:

Transcript of Collisions using separating-axis tests Christer Ericson Sony Computer Entertainment Slides @

Collisions using Collisions using separating-axis testsseparating-axis tests

Christer EricsonSony Computer Entertainment

Slides @ http://realtimecollisiondetection.net/pubs/

Problem statement

Determine if two (convex) objects are intersecting.

Possibly also obtain contact information.

?A B

!A B

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.

A B

L

P

Underlying theory

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

A B

L

P

Separated if

or

Testing separation

Compare absolute intervals

minA

a

maxA minB maxB

A

B

max minA B

max minB A

Testing separation

For centrally symmetric objects: compare using projected radii

A

B

BrAr

t

aˆt a

Separated ifˆ

A Br r t a

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? 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:

3D ObjectsFace dirs

(A)Face dirs

(B)Edge dirs

(AxB)Total

Segment–Tri 0 1 1x3 4

Segment–OBB 0 3 1x3 6

AABB–AABB 3 0(3) 0(3x0) 3

OBB–OBB 3 3 3x3 15

Tri–Tri 1 1 3x3 11

Tri–OBB 1 3 3x3 13

Axes to test

Code fragmentbool 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); if (max1 < min2 || max2 < min1) return false; } 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); if (max1 < min2 || max2 < min1) return false; } 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 ti

last are time of first and last contact on axis i, then objects are in contact over the interval [maxi { ti

first}, mini { ti

last}].

No contact if maxi { tifirst} > mini { ti

last}

Moving objects

Optimization 1: 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 { ti

last}

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.

if (Dot(foo, axis) > Dot(bar, axis)) return false;

if (epsilon1 > epsilon2) return false;

Typical test:

Becomes, due to floating-point errors:

Results in: Chaos!

(Address using means discussed earlier.)

Contact determination

Covered by Erin Catto (later)

References

Ericson, Christer. Real-Time Collision Detection. Morgan Kaufmann 2005. http://realtimecollisiondetection.net/

Levine, Ron. “Collisions of moving objects.” gdalgorithms-list mailing list article, November 14, 2000. http://realtimecollisiondetection.net/files/levine_swept_sat.txt

Boyd, Stephen. Lieven Vandenberghe. Convex Optimization. Cambridge University Press, 2004. http://www.stanford.edu/~boyd/cvxbook/

Rockafellar, R. Tyrrell. Convex Analysis. Princeton University Press, 1996.