1 / 27

# Collisions using separating-axis tests - PowerPoint PPT Presentation

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. ?. !. Underlying theory.

Related searches for Collisions using separating-axis tests

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.

## PowerPoint Slideshow about 'Collisions using separating-axis tests' - sirius

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

Christer EricsonSony Computer EntertainmentSlides @ http://realtimecollisiondetection.net/pubs/

• Determine if two (convex) objects are intersecting.

• Possibly also obtain contact information.

?

!

• Set C is convex if and only if the line segment between any two points in C lies in C.

• Separating Hyperplane Theorem

• States: two disjoint convex sets are separable by a hyperplane.

• Nonintersecting concave sets not generally separable by hyperplane (only by hypersurfaces).

• Concave objects not covered here.

• Separation w.r.t a plane P  separation of the orthogonal projections onto any line L parallel to plane normal.

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

• Compare absolute intervals

Separated if

or

• For centrally symmetric objects: compare using projected radii

Separated if

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);

}

}

• But which axes to test?

• Potentially infinitely many!

• Simplification:

• Deal only with polytopes

• Convex hulls of finite point sets

• Planar faces

• 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.

• 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.

• Four axes for two 2D OBBs:

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.

• When objects move, projected intervals move:

• 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}

• 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}

• Spheres, capsules, cylinders, cones, etc?

• Same idea:

• Identify all ‘features’

• Test all axes that can possibly separate feature pairs!

• Sphere tests:

• Has single feature: its center

• Test axes going through center

• (Radius is accounted for during overlap test on axis.)

• Capsule tests:

• Split into three features

• Test axes that can separate features of capsule and features of second object.

• 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.

• For sphere-OBB, all tests can be subsumed by a single axis test:

Closest point on OBB to sphere center

• 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!