Table of Contents

Preface

1 Introduction
	1.1 Contents Overview
	1.2 About The Code

2 Collision Detection Design Issues
	2.1 Collision Algorithm Design Factors
	2.2 Application Domain Representation
		2.2.1 Object Representations
		2.2.2 Collision Versus Rendering Geometry
		2.2.3 Collision Algorithm Specialization
	2.3 Different Types of Queries
	2.4 Environment Simulation Parameters
		2.4.1 Number of Objects
		2.4.2 Sequential Versus Simultaneous Motion
		2.4.3 Discrete Versus Continuous Motion
	2.5 Performance
		2.5.1 Optimization Overview
	2.6 Robustness
	2.7 Ease of Implementation and Use
		2.7.1 Debugging a Collision Detection System
	2.8 Summary

3 A Math and Geometry Primer
	3.1 Matrices
		3.1.1 Matrix Arithmetic
		3.1.2 Algebraic Identities Involving Matrices
		3.1.3 Determinants
		3.1.4 Solving Small Systems of Linear Equation using Cramer’s Rule
		3.1.5 Matrix Inverses for 2x2 and 3x3 Matrices
		3.1.6 Determinant Predicates
		3.1.6.1 ORIENT2D(A, B, C)
		3.1.6.2 ORIENT3D(A, B, C, D)
		3.1.6.3 INCIRCLE2D(A, B, C, D)
		3.1.6.4 INSPHERE(A, B, C, D, E)
	3.2 Coordinate Systems and Points
	3.3 Vectors
		3.3.1 Vector Arithmetic
		3.3.2 Algebraic Identities Involving Vectors
		3.3.3 The Dot Product
		3.3.4 Algebraic Identities Involving Dot Products
		3.3.5 The Cross Product
		3.3.6 Algebraic Identities Involving Cross Products
		3.3.7 The Scalar Triple Product
		3.3.8 Algebraic Identities Involving Scalar Triple Products
	3.4 Barycentric Coordinates
	3.5 Lines, Rays and Segments
	3.6 Planes and Halfspaces
	3.7 Polygons
		3.7.1 Testing Polygonal Convexity
	3.8 Polyhedra
		3.8.1 Testing Polyhedral Convexity
	3.9 Computing Convex Hulls
		3.9.1 Andrew’s Algorithm
		3.9.2 The Quickhull Algorithm
	3.10 Voronoi Regions
	3.11 Minkowski Sum and Difference
	3.12 Summary

4 Bounding Volumes
	4.1 Desired BV Characteristics
	4.2 Axis-Aligned Bounding Boxes (AABBs)
		4.2.1 AABB-AABB Intersection
		4.2.2 Computing and Updating AABBs
		4.2.3 AABB from the Object Bounding Sphere
		4.2.4 AABB Reconstructed from Original Point Set
		4.2.5 AABB from Hill-Climbing Vertices of the Object Representation
		4.2.6 AABB Recomputed from Rotated AABB
	4.3 Spheres
		4.3.1 Sphere-Sphere Intersection
		4.3.2 Computing a Bounding Sphere
		4.3.3 Bounding Sphere from Direction of Maximum Spread
		4.3.4 Bounding Sphere Through Iterative Refinement
		4.3.5 The Minimum Bounding Sphere
	4.4 Oriented Bounding Boxes (OBBs)
		4.4.1 OBB-OBB Intersection
		4.4.2 Making the Separating-Axis Test Robust
		4.4.3 Computing a Tight OBB
		4.4.4 Optimizing PCA-Based OBBs
		4.4.5 Brute-Force OBB Fitting
	4.5 Sphere-Swept Volumes
		4.5.1 Sphere-Swept Volume Intersection
		4.5.2 Computing Sphere-Swept Bounding Volumes
	4.6 Halfspace Intersection Volumes
		4.6.1 Kay-Kajiya Slab-Based Volumes
		4.6.2 Discrete-Orientation Polytopes (k-DOPs)
		4.6.3 k-DOP-k-DOP Overlap Test
		4.6.4 Computing and Realigning k-DOPs
		4.6.5 Approximate Convex Hull Intersection Tests
	4.7 Other Bounding Volumes
	4.8 Summary

5 Basic Primitive Tests
	5.1 Closest Point Computations
		5.1.1 Closest Point on Plane to Point
		5.1.2 Closest Point on Line Segment to Point
		5.1.2.1 Distance of Point to Segment
		5.1.3 Closest Point on AABB to Point
		5.1.3.1 Distance of Point to AABB
		5.1.4 Closest Point on OBB to Point
		5.1.4.1 Distance of Point to OBB
		5.1.4.2 Closest Point on 3D Rectangle to Point
		5.1.5 Closest Point on Triangle to Point
		5.1.6 Closest Point on Tetrahedron to Point
		5.1.7 Closest Point on Convex Polyhedron to Point
		5.1.8 Closest Points of Two Lines
		5.1.9 Closest Points of Two Line Segments
		5.1.9.1 2D Segment Intersection
		5.1.10 Closest Points of a Line Segment and a Triangle
		5.1.11 Closest Points of Two Triangles
	5.2 Testing primitives
		5.2.1 Separating Axis Test
		5.2.1.1 Robustness of the Separating Axis Test
		5.2.2 Testing Sphere against Plane
		5.2.3 Testing Box against Plane
		5.2.4 Testing Cone against Plane
		5.2.5 Testing Sphere against AABB
		5.2.6 Testing Sphere against OBB
		5.2.7 Testing Sphere against Triangle
		5.2.8 Testing Sphere against Polygon
		5.2.9 Testing AABB against Triangle
		5.2.10 Testing Triangle against Triangle
	5.3 Intersecting Lines, Rays, and (Directed) Segments
		5.3.1 Intersecting Segment against Plane
		5.3.2 Intersecting Ray or Segment against Sphere
		5.3.3 Intersecting Ray or Segment against Box
		5.3.4 Intersecting Line against Triangle
		5.3.5 Intersecting Line against Quadrilateral
		5.3.6 Intersecting Ray or Segment against Triangle
		5.3.7 Intersecting Ray or Segment against Cylinder
		5.3.8 Intersecting Ray or Segment against Convex Polyhedron
	5.4 Additional Tests
		5.4.1 Testing Point in Polygon
		5.4.2 Testing Point in Triangle
		5.4.3 Testing Point in Polyhedron
		5.4.4 Intersection of Two Planes
		5.4.5 Intersection of Three Planes
	5.5 Dynamic Intersection Tests
		5.5.1 Interval Halving for Intersecting Moving Objects
		5.5.2 Separating Axis Test for Moving Convex Objects
		5.5.3 Intersecting Moving Sphere against Plane
		5.5.4 Intersecting Moving AABB against Plane
		5.5.5 Intersecting Moving Sphere against Sphere
		5.5.6 Intersecting Moving Sphere against Triangle (and Polygon)
		5.5.7 Intersecting Moving Sphere against AABB
		5.5.8 Intersecting Moving AABB against AABB
	5.6 Summary


6 Bounding Volume Hierarchies
	6.1 Hierarchy Design Issues
		6.1.1 Desired BVH Characteristics
		6.1.2 Cost Functions
		6.1.3 Tree Degree
	6.2 Building Strategies for Hierarchy Construction
		6.2.1 Top-Down Construction
		6.2.1.1 Partitioning Strategies
		6.2.1.2 Choice of Partitioning Axis
		6.2.1.3 Choice of Split Point
		6.2.2 Bottom-Up Construction
		6.2.2.1 Improved Bottom-Up Construction
		6.2.2.2 Other Bottom-Up Construction Strategies
		6.2.2.3 Bottom-Up N-Ary Clustering Trees
		6.2.3 Incremental (Insertion) Construction
		6.2.3.1 The Goldsmith-Salmon Incremental Construction Method
	6.3 Hierarchy Traversal
		6.3.1 Descent Rules
		6.3.2 Generic Informed Depth-First Traversal
		6.3.3 Simultaneous Depth-First Traversal
		6.3.4 Optimized Leaf-Direct Depth-First Traversal
	6.4 Example Bounding Volume Hierarchies
		6.4.1 OBB-Trees
		6.4.2 AABB-Trees and BoxTrees
		6.4.3 Sphere-Tree through Octree Subdivision 
		6.4.4 Sphere-Tree from Sphere-Covered Surfaces
		6.4.5 Generate-and-Prune Sphere Covering
		6.4.6 k-DOP Trees
	6.5 Merging Bounding Volumes
		6.5.1 Merging Two AABBs
		6.5.2 Merging Two Spheres
		6.5.3 Merging Two OBBs
		6.5.4 Merging Two k-DOPs
	6.6 Efficient Tree Representation and Traversal
		6.6.1 Array Representation
		6.6.2 Preorder Traversal Order
		6.6.3 Offsets Instead of Pointers
		6.6.4 Cache-Friendlier Structures (Non-Binary Trees)
		6.6.5 Tree Node and Primitive Ordering
		6.6.6 On Recursion
		6.6.7 Grouping Queries
	6.7 Improved Queries through Caching
		6.7.1 Surface Caching: Caching Intersecting Primitives
		6.7.2 Front Tracking
	6.8 Summary

7 Spatial Partitioning
	7.1 Uniform Grids
		7.1.1 Cell Size Issues
		7.1.2 Grids as Arrays of Linked Lists
		7.1.3 Hashed Storage and Infinite Grids
		7.1.4 Storing Static Data
		7.1.5 Implicit Grids
		7.1.6 Uniform Grid Object-Object Test
		7.1.6.1 One Test at a Time
		7.1.6.2 All Tests at a Time
		7.1.7 Additional Grid Considerations
	7.2 Hierarchical Grids
		7.2.1 Basic Hgrid Implementation
		7.2.2 Alternative Hierarchical Grid Representations
		7.2.3 Other Hierarchical Grids
	7.3 Trees
		7.3.1 Octrees (and Quadtrees)
		7.3.2 Octree Object Assignment
		7.3.3 Locational Codes and Finding the Octant for a Point
		7.3.4 Linear Octrees (Hash-Based)
		7.3.5 Computing the Morton Key
		7.3.6 Loose Octrees
		7.3.7 k-d Trees
		7.3.8 Hybrid Schemes
	7.4 Ray and Directed Line Segment Traversals
		7.4.1 k-d Tree Intersection Test
		7.4.2 Uniform Grid Intersection Test
	7.5 Sort and Sweep Methods
		7.5.1 Sorted Linked List Implementation
		7.5.2 Array-Based Sorting
	7.6 Cells and Portals
	7.7 Avoiding Retesting
		7.7.1 Bit Flags
		7.7.2 Time Stamping
		7.7.3 Amortized Time Stamp Clearing
	7.8 Summary

8 BSP Tree Hierarchies
	8.1 BSP Trees
	8.2 Types of BSP Trees
		8.2.1 Node-Storing BSP Trees
		8.2.2 Leaf-Storing BSP Trees
		8.2.3 Solid-Leaf BSP Trees
	8.3 Building the BSP Tree
		8.3.1 Selecting Dividing Planes
		8.3.2 Evaluating Dividing Planes
		8.3.3 Classifying Polygons with Respect to a Plane
		8.3.4 Splitting Polygons against a Plane
		8.3.5 More on Polygon splitting Robustness
		8.3.6 Tuning BSP Tree Performance
	8.4 Using the BSP Tree
		8.4.1 Testing Point against a Solid-Leaf BSP Tree
		8.4.2 Intersecting Ray against a Solid-Leaf BSP Tree
		8.4.3 Polytope Queries on Solid-Leaf BSP Trees
	8.5 Summary

9 Convexity-Based Methods
	9.1 Boundary-Based Collision Detection
	9.2 Closest Features Algorithms
		9.2.1 The V-Clip Algorithm
	9.3 Hierarchical Polyhedron Representations
		9.3.1 The Dobkin-Kirkpatrick Hierarchy
	9.4 Linear and Quadratic Programming
		9.4.1 Linear Programming
		9.4.1.1 Fourier-Motzkin Elimination
		9.4.1.2 Seidel's Algorithm
		9.4.2 Quadratic Programming
	9.5 The Gilbert-Johnson-Keerthi Algorithm
		9.5.1 The Gilbert-Johnson-Keerthi Algorithm
		9.5.2 Finding the Point of Minimum Norm in a Simplex
		9.5.3 GJK, Closest Points and Contact Manifolds
		9.5.4 Hill-Climbing for Extreme Vertices
		9.5.5 Exploiting Coherence by Vertex Caching
		9.5.6 Rotated Objects Optimization
		9.5.7 GJK for Moving Objects
	9.6 The Chung-Wang Separating Vector Algorithm
	9.7 Summary

10 GPU-Assisted Collision Detection
	10.1 Interfacing with the GPU
		10.1.1 Buffer Readbacks
		10.1.2 Occlusion Queries
	10.2 Testing Convex Objects
	10.3 Testing Concave Objects
	10.4 GPU-Based Collision Filtering
	10.5 Summary

11 Numerical Robustness
	11.1 Robustness Problem Types
	11.2 Representing Real Numbers
		11.2.1 The IEEE-754 Floating-Point Formats
		11.2.2 Infinity Arithmetic
		11.2.3 Floating-Point Error Sources
	11.3 Robust Floating-Point Usage
		11.3.1 Tolerances Comparisons for Floating-Point Values
		11.3.2 Robustness through Thick Planes
		11.3.3 Robustness through Sharing of Calculations
		11.3.4 Robustness of Fat Objects
	11.4 Interval Arithmetic
		11.4.1 Interval Arithmetic Examples
		11.4.2 Interval Arithmetic in Collision Detection
	11.5 Exact and Semi-Exact Computation
		11.5.1 Exact Arithmetic using Integers
		11.5.2 On Integer Division
		11.5.3 Segment Intersection using Integer Arithmetic
	11.6 Further Suggestions for Improving Robustness
	11.7 Summary

12 Geometrical Robustness
	12.1 Vertex Welding
	12.2 Computing Adjacency Information
		12.2.1 Computing a Vertex-to-Face Table
		12.2.2 Computing an Edge-to-Face Table
		12.2.3 Testing Connectedness
	12.3 Holes, Cracks, Gaps and T-Junctions
	12.4 Merging Coplanar Faces
		12.4.1 Testing Coplanarity of Two Polygons
		12.4.2 Testing Polygon Planarity
	12.5 Triangulation and Convex Partitioning
		12.5.1 Triangulation by Ear Cutting
		12.5.1.1 Triangulating Polygons with Holes
		12.5.2 Convex Decomposition of Polygons
		12.5.3 Convex Decomposition of Polyhedra
		12.5.4 Dealing with "Nondecomposable" Concave Geometry
	12.6 Consistency Testing using Euler's Formula
	12.7 Summary

13 Optimization
	13.1 CPU Caches
	13.2 Instruction Cache Optimizations
	13.3 Data Cache Optimizations
		13.3.1 Structure Optimizations
		13.3.2 Quantized and Compressed Vertex Data
		13.3.3 Prefetching and Preloading
	13.4 Cache-Aware Data Structures and Algorithms
		13.4.1 A Compact Static k-d Tree
		13.4.2 A Compact AABB Tree
		13.4.3 Cache-Obliviousness
	13.5 Software Caching
		13.5.1 Cached Linearization Example
		13.5.2 Amortized Predictive Linearization Caching
	13.6 Aliasing
		13.6.1 Type-Based Alias Analysis
		13.6.2 Restricted Pointers
		13.6.3 Avoiding Aliasing
	13.7 Parallelism through SIMD Optimizations
		13.7.1 4 Spheres Versus 4 Spheres SIMD Test
		13.7.2 4 Spheres Versus 4 AABBs SIMD Test
		13.7.3 4 AABBs Versus 4 AABBs SIMD Test
	13.8 Branching
	13.9 Summary

References
Index