#include <GJKClosestPoint.h>
|
template<typename A , typename B > |
bool | Intersects (const A &inA, const B &inB, float inTolerance, Vec3 &ioV) |
|
template<typename A , typename B > |
float | GetClosestPoints (const A &inA, const B &inB, float inTolerance, float inMaxDistSq, Vec3 &ioV, Vec3 &outPointA, Vec3 &outPointB) |
|
void | GetClosestPointsSimplex (Vec3 *outY, Vec3 *outP, Vec3 *outQ, uint &outNumPoints) const |
|
template<typename A > |
bool | CastRay (Vec3Arg inRayOrigin, Vec3Arg inRayDirection, float inTolerance, const A &inA, float &ioLambda) |
|
template<typename A , typename B > |
bool | CastShape (Mat44Arg inStart, Vec3Arg inDirection, float inTolerance, const A &inA, const B &inB, float &ioLambda) |
|
template<typename A , typename B > |
bool | CastShape (Mat44Arg inStart, Vec3Arg inDirection, float inTolerance, const A &inA, const B &inB, float inConvexRadiusA, float inConvexRadiusB, float &ioLambda, Vec3 &outPointA, Vec3 &outPointB, Vec3 &outSeparatingAxis) |
|
| NonCopyable ()=default |
|
| NonCopyable (const NonCopyable &)=delete |
|
void | operator= (const NonCopyable &)=delete |
|
Convex vs convex collision detection Based on: A Fast and Robust GJK Implementation for Collision Detection of Convex Objects - Gino van den Bergen
◆ CastRay()
template<typename A >
bool GJKClosestPoint::CastRay |
( |
Vec3Arg |
inRayOrigin, |
|
|
Vec3Arg |
inRayDirection, |
|
|
float |
inTolerance, |
|
|
const A & |
inA, |
|
|
float & |
ioLambda |
|
) |
| |
|
inline |
Test if a ray inRayOrigin + lambda * inRayDirection for lambda e [0, ioLambda> intersects inA
Code based upon: Ray Casting against General Convex Objects with Application to Continuous Collision Detection - Gino van den Bergen
- Parameters
-
inRayOrigin | Origin of the ray |
inRayDirection | Direction of the ray (ioLambda * inDirection determines length) |
inTolerance | The minimal distance between the ray and A before it is considered colliding |
inA | A convex object that has the GetSupport(Vec3) function |
ioLambda | The max fraction along the ray, on output updated with the actual collision fraction. |
- Returns
- true if a hit was found, ioLambda is the solution for lambda.
◆ CastShape() [1/2]
template<typename A , typename B >
bool GJKClosestPoint::CastShape |
( |
Mat44Arg |
inStart, |
|
|
Vec3Arg |
inDirection, |
|
|
float |
inTolerance, |
|
|
const A & |
inA, |
|
|
const B & |
inB, |
|
|
float & |
ioLambda |
|
) |
| |
|
inline |
Test if a cast shape inA moving from inStart to lambda * inStart.GetTranslation() + inDirection where lambda e [0, ioLambda> intersects inB
- Parameters
-
inStart | Start position and orientation of the convex object |
inDirection | Direction of the sweep (ioLambda * inDirection determines length) |
inTolerance | The minimal distance between A and B before they are considered colliding |
inA | The convex object A, must support the GetSupport(Vec3) function. |
inB | The convex object B, must support the GetSupport(Vec3) function. |
ioLambda | The max fraction along the sweep, on output updated with the actual collision fraction. |
- Returns
- true if a hit was found, ioLambda is the solution for lambda.
◆ CastShape() [2/2]
template<typename A , typename B >
bool GJKClosestPoint::CastShape |
( |
Mat44Arg |
inStart, |
|
|
Vec3Arg |
inDirection, |
|
|
float |
inTolerance, |
|
|
const A & |
inA, |
|
|
const B & |
inB, |
|
|
float |
inConvexRadiusA, |
|
|
float |
inConvexRadiusB, |
|
|
float & |
ioLambda, |
|
|
Vec3 & |
outPointA, |
|
|
Vec3 & |
outPointB, |
|
|
Vec3 & |
outSeparatingAxis |
|
) |
| |
|
inline |
Test if a cast shape inA moving from inStart to lambda * inStart.GetTranslation() + inDirection where lambda e [0, ioLambda> intersects inB
- Parameters
-
inStart | Start position and orientation of the convex object |
inDirection | Direction of the sweep (ioLambda * inDirection determines length) |
inTolerance | The minimal distance between A and B before they are considered colliding |
inA | The convex object A, must support the GetSupport(Vec3) function. |
inB | The convex object B, must support the GetSupport(Vec3) function. |
inConvexRadiusA | The convex radius of A, this will be added on all sides to pad A. |
inConvexRadiusB | The convex radius of B, this will be added on all sides to pad B. |
ioLambda | The max fraction along the sweep, on output updated with the actual collision fraction. |
outPointA | is the contact point on A (if outSeparatingAxis is near zero, this may not be not the deepest point) |
outPointB | is the contact point on B (if outSeparatingAxis is near zero, this may not be not the deepest point) |
outSeparatingAxis | On return this will contain a vector that points from A to B along the smallest distance of separation. The length of this vector indicates the separation of A and B without their convex radius. If it is near zero, the direction may not be accurate as the bodies may overlap when lambda = 0. |
- Returns
- true if a hit was found, ioLambda is the solution for lambda and outPoint and outSeparatingAxis are valid.
◆ GetClosestPoints()
template<typename A , typename B >
float GJKClosestPoint::GetClosestPoints |
( |
const A & |
inA, |
|
|
const B & |
inB, |
|
|
float |
inTolerance, |
|
|
float |
inMaxDistSq, |
|
|
Vec3 & |
ioV, |
|
|
Vec3 & |
outPointA, |
|
|
Vec3 & |
outPointB |
|
) |
| |
|
inline |
Get closest points between inA and inB
- Parameters
-
inA | The convex object A, must support the GetSupport(Vec3) function. |
inB | The convex object B, must support the GetSupport(Vec3) function. |
inTolerance | The minimal distance between A and B before the objects are considered colliding and processing is terminated. |
inMaxDistSq | The maximum squared distance between A and B before the objects are considered infinitely far away and processing is terminated. |
ioV | Initial guess for the separating axis. Start with any non-zero vector if you don't know. If return value is 0, ioV = (0, 0, 0). If the return value is bigger than 0 but smaller than FLT_MAX, ioV will be the separating axis in the direction from A to B and its length the squared distance between A and B. If the return value is FLT_MAX, ioV will be the separating axis in the direction from A to B and the magnitude of the vector is meaningless. |
outPointA,outPointB | If the return value is 0 the points are invalid. If the return value is bigger than 0 but smaller than FLT_MAX these will contain the closest point on A and B. If the return value is FLT_MAX the points are invalid. |
- Returns
- The squared distance between A and B or FLT_MAX when they are further away than inMaxDistSq.
◆ GetClosestPointsSimplex()
void GJKClosestPoint::GetClosestPointsSimplex |
( |
Vec3 * |
outY, |
|
|
Vec3 * |
outP, |
|
|
Vec3 * |
outQ, |
|
|
uint & |
outNumPoints |
|
) |
| const |
|
inline |
Get the resulting simplex after the GetClosestPoints algorithm finishes. If it returned a squared distance of 0, the origin will be contained in the simplex.
◆ Intersects()
template<typename A , typename B >
bool GJKClosestPoint::Intersects |
( |
const A & |
inA, |
|
|
const B & |
inB, |
|
|
float |
inTolerance, |
|
|
Vec3 & |
ioV |
|
) |
| |
|
inline |
Test if inA and inB intersect
- Parameters
-
inA | The convex object A, must support the GetSupport(Vec3) function. |
inB | The convex object B, must support the GetSupport(Vec3) function. |
inTolerance | Minimal distance between objects when the objects are considered to be colliding |
ioV | is used as initial separating axis (provide a zero vector if you don't know yet) |
- Returns
- True if they intersect (in which case ioV = (0, 0, 0)). False if they don't intersect in which case ioV is a separating axis in the direction from A to B (magnitude is meaningless)
The documentation for this class was generated from the following file: