slides ppt - Real-Time Collision Detection

advertisement
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
Bmin
Bmax
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.
Download