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?
Simplification:
Deal only with polytopes
Convex hulls of finite point sets
Planar faces
Axes to test
Handwavingly:
Look at the ways A and B can come
into contact.
Vertex-face:
In 3D, reduces to vertex-face and edgeedge contacts.
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;
}
Moving objects
When objects move, projected
intervals move:
Moving objects
Objects intersect when
projections overlap on all axes.
Objects are in contact over the
interval [maxi { tifirst}, mini { tilast}], where
tifirst and tilast are time of first and
last contact on axis i.
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
Spheres, capsules, cylinders,
cones, etc.
E.g. sphere vs. OBB:
Closest point on OBB
to sphere center
Nonpolyhedral objects
Capsule tests:
Split into three features
Test axes that can separate features
of capsule and features of second
object.
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!
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.