270 likes | 364 Views
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.
E N D
Collisions using separating-axis tests Christer EricsonSony Computer EntertainmentSlides @ http://realtimecollisiondetection.net/pubs/
Problem statement • Determine if two (convex) objects are intersecting. • Possibly also obtain contact information. ? !
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.
Underlying theory • A line for which the projection intervals do not overlap we call a separating axis.
Testing separation • Compare absolute intervals Separated if or
Testing separation • For centrally symmetric objects: compare using projected radii Separated if
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 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.
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:
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 • 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.
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.