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.