Andrew Aye - Talina Gaming System
Collision System


Intersection \ Distance Tests

 PointParticleLineRaySegmentCircleDiskEllipseParallelogramPlaneRectangleTriangleBox AABoxCapsuleCylinderMeshSphereTorusTube 
   X X X X X  X X X X X X X   X   PT
                     PC
PT   X X X X   X X X X  X X   X   LN
PC    X X X   X X X X  X X   X   RY
LN     X X   X X X X  X X   X   SG
RY                     CI
SG                     DK
CI                     EL
DK         X  X          PM
EL             X X X   X   PN
PM           X X         RT
PN   X X X          X   X   XT
RT             X     X   BA
XT   X X X             X   BX
BA               X      CA
BX                     CY
CA   X X X                MH
CY   X X X             X   SP
MH                     TR
SP   X X X                TU
TR                      
TU   X X X                 


Sweep \ Penetration Tests

 PointParticleLineRaySegmentCircleDiskEllipseParallelogramPlaneRectangleTriangleBox AABoxCapsuleCylinderMeshSphereTorusTube 
               X   X   PT
                     PC
PT               X   X   LN
PC               X   X   RY
LN               X   X   SG
RY                     CI
SG                     DK
CI                     EL
DK                     PM
EL              X X X  X   PN
PM                     RT
PN              X X X  X   XT
RT                     BA
XT  X          X    X  X   BX
BA               X      CA
BX            X      X   CY
CA                     MH
CY                  X   SP
MH                     TR
SP X  X X X     X  X      X   TU
TR                      
TU                      


Each source file (.cpp) contains the mathematical development for the corresponding collision routine, as time permitted.  This should help in understanding the implementation as well as allow for verification of the results.

The nomenclature for the functions can be daunting at first but I promise you that it is fairly simple and logical once the core syntax is understood. For reasons that would bore you, I tend to use a short naming convention using an abbreviated Hungarian notation.

(1) Templates: Functions and Parameters.
I felt that the required word-noise that is needed when using templates was causing ambiguity in the function definitions. I use a pre-processor definition sequence to generate the required type definitions while keeping the function declaration/definition compact and thus, making it clear to understand. Specifically, the definitions are used with template<typename TYPE, int DIM> and are as follows:

•(CLASS)TTg[CLASS]<TYPE,DIM>C•(CLASS)const TTg[CLASS]<TYPE,DIM>
P•(CLASS)TTg[CLASS]<TYPE,DIM> *PC•(CLASS)TTg[CLASS]<TYPE,DIM> * const
PCU•(CLASS)TTg[CLASS]<TYPE,DIM> * const __restrictPU•(CLASS)TTg[CLASS]<TYPE,DIM> * __restrict
CP•(CLASS)const TTg[CLASS]<TYPE,DIM> *CPC•(CLASS)const TTg[CLASS]<TYPE,DIM> * const
CPCU•(CLASS)const TTg[CLASS]<TYPE,DIM> * const __restrictCPU•(CLASS)const TTg[CLASS]<TYPE,DIM> * __restrict
R•(CLASS)TTg[CLASS]<TYPE,DIM> &CR•(CLASS)const TTg[CLASS]<TYPE,DIM> &
PR•(CLASS)TTg[CLASS]<TYPE,DIM>*&CPR•(CLASS)const TTg[CLASS]<TYPE,DIM>*&
PP•(CLASS)TTg[CLASS]<TYPE,DIM>**

P: Pointer, C: Const, U: Restrict, R: Reference - Prefix is in order. Thus, for instance, CR•(VECTOR) is just a const reference template vector.

(2) Function naming system:
  • tgDistSq: Returns the distance square between two primitives. Will return negative type max is they are interesting/penetrating.
  • tgClosestSq: Returns the distance square between two primitives. Will return negative type max is they are interesting/penetrating. There are two version of this function. The outputs are always listed first, and they will be either floats or vectors. If they're vectors they represent the points of closest proximity on each of the two primitives. If they’re floats they represent the parametric values required to generate to point given the definition of the primitive. For instance for a line, it will be the scalar multiple along the direction vector from the origin; in the case of a triangle it will be the barycentric values.
  • tgClip: Like tgClosestSq this function often has two possible definitions. One takes a clip structure in which it returns the legal points, and the second returns back the two float values for a line. In the case of an open primitive its assumed that the object is scaled to infinity along its primary axis (for instance along the long axis of a tube).
  • tgContact_Penetrate: This is the first function where parameter order has an impact on the resolution. The values returned will be points on the second primitive describing the penetration of the first primitive.
  • tgContact_Sweep: Its assumed that the first primitive is static and the second primitive is moving along the sweep path.

(3) Parameter Nomenclature:
Each primitive type is assigned a simple two letter short form. The exception are points/vectors which sometimes has more definitions based on usage (point vs directions). Hungarian notation is tv: vector, tg: structure/class. # represents an arbitrary number for multiple usages of the same type in the same context. An underscore used as a prefix represents a return (output) value and is used when I felt that its was not self-evident by the context or name of the variable. An underscore used in the middle of a variable often describes a dot product.

tyT#: Parametric ValuetvS#: PointtvD#: DirectiontgPC#: ParticletgLN#: Line
tgRY#: RaytgSG#: SegmenttgCI#: CircletgDK#: DisktgEL#: Ellipse
tgPE#: ParallelogramtgPN#: PlanetgRT#: RectangletgPT#: Point TriangletgET#: Edge Triangle
tgCY#: CylindertgMS#: Mesh SimpletgMA#: Mesh AABBtgMB#: Mesh BVTtgSP#: Sphere
tgTR#: TorustgTU#: Tube

A point triangle is one described using only the three vertices and a normal to the plane. An edge triangle adds a clockwise edge definition. A collision triangle augments an edge triangle with feature reduction information (for instance if a particular edge should be considered during collision). Finally, a space triangle adds edge plane definition to a collision triangle.


Main
TgS Collision - External [Main].h TgS Collision - External [TYPE] [Axis Separation].h
TgS Collision - External [TYPE] [Result].h TgS Collision - External [TYPE] [Utility].h
TgS Collision - External [TYPE].h TgS Collision - External.h
TgS Collision - Tools [Debug].h
TgS Collision - Algorithm [GJK].inl TgS Collision - Axis Projection.inl
TgS Collision - Clip [Containment].inl TgS Collision - External [Main].inl
TgS Collision - External [TYPE] [Result].inl TgS Collision - External [TYPE].inl
TgS Collision - External.inl TgS Collision - Tools [Debug].inl
TgS Collision - Axis Projection.cpp TgS Collision - Clip [Containment].cpp
TgS Collision - External [Main].cpp TgS Collision - External [TYPE] [Result].cpp
TgS Collision - External.cpp TgS Collision - Tools [Debug].cpp
  
  



WARNING: I have not had time yet to verify the accuracy of these routines. Please report any issues - and I will quickly remedy the issue.


Linear
TgS Collision - Linear.h
TgS Collision - Line.inl TgS Collision - Linear-Linear.inl
TgS Collision - Linear-Point.inl TgS Collision - Ray.inl
TgS Collision - Segment.inl
TgS Collision - Linear-Linear.cpp TgS Collision - Linear-Point.cpp
TgS Collision - Linear.cpp
  
  
Circle
TgS Collision - Circle.h
TgS Collision - Circle-Circle.inl TgS Collision - Circle-Line.inl
TgS Collision - Circle-Linear.inl TgS Collision - Circle-Point.inl
TgS Collision - Circle-Ray.inl TgS Collision - Circle-Segment.inl
TgS Collision - Circle-Circle.cpp TgS Collision - Circle-Linear.cpp
TgS Collision - Circle-Point.cpp TgS Collision - Circle-Triangle.cpp
TgS Collision - Circle.cpp
  
  
Disk
TgS Collision - Disk.h
TgS Collision - Disk-Point.inl
TgS Collision - Disk-Point.cpp TgS Collision - Disk.cpp
  
  
Parallelogram
TgS Collision - Parallelogram.h
TgS Collision - Parallelogram-Line.inl TgS Collision - Parallelogram-Linear.inl
TgS Collision - Parallelogram-Parallelogram.inl TgS Collision - Parallelogram-Point.inl
TgS Collision - Parallelogram-Ray.inl TgS Collision - Parallelogram-Rectangle.inl
TgS Collision - Parallelogram-Segment.inl TgS Collision - Parallelogram-Triangle.inl
TgS Collision - Parallelogram [Util].cpp TgS Collision - Parallelogram-Linear.cpp
TgS Collision - Parallelogram-Parallelogram.cpp TgS Collision - Parallelogram-Point.cpp
TgS Collision - Parallelogram-Rectangle.cpp TgS Collision - Parallelogram-Triangle.cpp
TgS Collision - Parallelogram.cpp
  
  
Plane
TgS Collision - Plane.h
TgS Collision - Plane [Util].inl TgS Collision - Plane-Line.inl
TgS Collision - Plane-Linear.inl TgS Collision - Plane-Point.inl
TgS Collision - Plane-Ray.inl TgS Collision - Plane-Segment.inl
TgS Collision - Plane.cpp
  
  
Rectangle
TgS Collision - Rectangle.h
TgS Collision - Rectangle-Line.inl TgS Collision - Rectangle-Linear.inl
TgS Collision - Rectangle-Point.inl TgS Collision - Rectangle-Ray.inl
TgS Collision - Rectangle-Rectangle.inl TgS Collision - Rectangle-Segment.inl
TgS Collision - Rectangle-Triangle.inl
TgS Collision - Rectangle [Util].cpp TgS Collision - Rectangle-Linear.cpp
TgS Collision - Rectangle-Point.cpp TgS Collision - Rectangle-Rectangle.cpp
TgS Collision - Rectangle-Triangle.cpp TgS Collision - Rectangle.cpp
  
  
Triangle
TgS Collision - Triangle.h
TgS Collision - Triangle [Util].inl TgS Collision - Triangle-Line.inl
TgS Collision - Triangle-Linear.inl TgS Collision - Triangle-Point.inl
TgS Collision - Triangle-Ray.inl TgS Collision - Triangle-Segment.inl
TgS Collision - Triangle-Triangle.inl
TgS Collision - Triangle [Axis Separation].cpp TgS Collision - Triangle [Util].cpp
TgS Collision - Triangle-Linear.cpp TgS Collision - Triangle-Particle.cpp
TgS Collision - Triangle-Point.cpp TgS Collision - Triangle-Triangle.cpp
TgS Collision - Triangle.cpp
  
  
Convex
TgS Collision - Convex.h
TgS Collision - Convex-Box.cpp TgS Collision - Convex-Capsule.cpp
TgS Collision - Convex-Cylinder.cpp TgS Collision - Convex-Plane.cpp
TgS Collision - Convex-Sphere.cpp TgS Collision - Convex-Triangle.cpp
TgS Collision - Convex.cpp
  
  
Box
TgS Collision - Box.h
TgS Collision - Box [Util].inl TgS Collision - Box-Line.inl
TgS Collision - Box-Linear.inl TgS Collision - Box-Plane.inl
TgS Collision - Box-Point.inl TgS Collision - Box-Ray.inl
TgS Collision - Box-Segment.inl TgS Collision - Box-Sphere.inl
TgS Collision - Box-Triangle.inl
TgS Collision - Box [Axis Separation].cpp TgS Collision - Box-Box.cpp
TgS Collision - Box-Linear.cpp TgS Collision - Box-Particle.cpp
TgS Collision - Box-Plane.cpp TgS Collision - Box-Point.cpp
TgS Collision - Box-Sphere.cpp TgS Collision - Box-Triangle.cpp
TgS Collision - Box.cpp
  
  
Box - Axis Aligned
TgS Collision - Box - AA.h
TgS Collision - Box AA-Box AA.inl TgS Collision - Box AA-Line.inl
TgS Collision - Box AA-Plane.inl TgS Collision - Box AA-Point.inl
TgS Collision - Box AA-Ray.inl TgS Collision - Box AA-Segment.inl
TgS Collision - Box AA-Sphere.inl TgS Collision - Box AA-Triangle.inl
TgS Collision - Box AA-Box AA.cpp TgS Collision - Box AA-Box.cpp
TgS Collision - Box AA-Capsule.cpp TgS Collision - Box AA-Cylinder.cpp
TgS Collision - Box AA-Linear.cpp TgS Collision - Box AA-Particle.cpp
TgS Collision - Box AA-Plane.cpp TgS Collision - Box AA-Point.cpp
TgS Collision - Box AA-Sphere.cpp TgS Collision - Box AA.cpp
  
  
Capsule
TgS Collision - Circle.h
TgS Collision - Capsule-Capsule.inl TgS Collision - Capsule-Line.inl
TgS Collision - Capsule-Linear.inl TgS Collision - Capsule-Plane.inl
TgS Collision - Capsule-Point.inl TgS Collision - Capsule-Ray.inl
TgS Collision - Capsule-Segment.inl TgS Collision - Capsule-Sphere.inl
TgS Collision - Capsule-Triangle.inl
TgS Collision - Capsule-Box.cpp TgS Collision - Capsule-Capsule.cpp
TgS Collision - Capsule-Linear.cpp TgS Collision - Capsule-Plane.cpp
TgS Collision - Capsule-Point.cpp TgS Collision - Capsule-Sphere.cpp
TgS Collision - Capsule-Triangle.cpp TgS Collision - Capsule.cpp
  
  
Cylinder
TgS Collision - Cylinder.h
TgS Collision - Cylinder [Util].inl TgS Collision - Cylinder-Line.inl
TgS Collision - Cylinder-Linear.inl TgS Collision - Cylinder-Plane.inl
TgS Collision - Cylinder-Ray.inl TgS Collision - Cylinder-Segment.inl
TgS Collision - Cylinder-Box.cpp TgS Collision - Cylinder-Capsule.cpp
TgS Collision - Cylinder-Cylinder.cpp TgS Collision - Cylinder-Linear.cpp
TgS Collision - Cylinder-Plane.cpp TgS Collision - Cylinder-Sphere.cpp
TgS Collision - Cylinder-Triangle.cpp TgS Collision - Cylinder.cpp
  
  
Sphere
TgS Collision - Sphere.h
TgS Collision - Sphere-Line.inl TgS Collision - Sphere-Linear.inl
TgS Collision - Sphere-Plane.inl TgS Collision - Sphere-Point.inl
TgS Collision - Sphere-Ray.inl TgS Collision - Sphere-Segment.inl
TgS Collision - Sphere-Sphere.inl TgS Collision - Sphere-Triangle.inl
TgS Collision - Sphere-Linear.cpp TgS Collision - Sphere-Plane.cpp
TgS Collision - Sphere-Point.cpp TgS Collision - Sphere-Sphere.cpp
TgS Collision - Sphere-Triangle.cpp TgS Collision - Sphere.cpp
  
  
Tube
TgS Collision - Tube.h
TgS Collision - Tube-Line.inl TgS Collision - Tube-Linear.inl
TgS Collision - Tube-Ray.inl TgS Collision - Tube-Segment.inl
TgS Collision - Tube-Linear.cpp TgS Collision - Tube-Sphere.cpp
TgS Collision - Tube-Tube.cpp TgS Collision - Tube.cpp
  
  


  I came to collision with a very solid mathematical background but with little actual experience in the field. The following are some of the books and web sites I used to help educate myself and to pick up methods and systems to approach a collision problem. They are all useful – however, in looking at actual implementation care must be taken since many of them are either inaccurate or simply faulty.

  Real-Time Rendering: ISBN 1568811829. This is one of the “bibles” I use when working. It is a very complete and thorough discussion on rendering and associated technologies. They keep an active page on intersection tests at www.realtimerendering.com/int

  Geometric Tools: ISBN 1558605940. David Eberly has written a few works on collision and game engine technology. I find this work to be the best since it its both exhaustive in regards to most regular geometric forms – and most importantly – discusses the solution methods from a mathematical point of view. Thus, it is a great text book to teach yourself how to solve similar problems – and the different solution techniques available. I found the strictly mathematically solutions to be correct –however, the short cuts taken sometimes proved to be wrong. Look at it as a teaching aid – not the absolute truth to finding a solution to a problem. Current source – the current implementation of his own engine project – and a list of his other books can all be found at: www.geometrictools.com