GDC 2005 - Real-Time Collision Detection

Download Report

Transcript GDC 2005 - Real-Time Collision Detection

Collisions using
separating-axis tests
Christer Ericson
Sony 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.
P
A
B
L
Underlying theory

A line for which the projection
intervals do not overlap we call a
separating axis.
P
A
B
L
Testing separation

Compare absolute intervals
Separated if
Amax  Bmin
A
or
Bmax  Amin
B
a
Amin
Amax
B min
B max
Testing separation

For centrally symmetric objects:
compare using projected radii
Separated if
ˆ  rA  rB
ta
t
A
B
t aˆ
rA
a
rB
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 edgeedge 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
3D Objects
Face dirs Face dirs
(A)
(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
Code fragment
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);
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 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:
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


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 thorugh
both points.
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 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.