16#ifndef BT_GJK_EPA_PENETATION_CONVEX_COLLISION_H
17#define BT_GJK_EPA_PENETATION_CONVEX_COLLISION_H
24template <
typename btConvexTemplate>
60template <
typename btConvexTemplate,
typename btGjkDistanceTemplate>
63 bool m_catchDegeneracies =
true;
64 btScalar m_cachedSeparatingDistance = 0.f;
83 int m_degenerateSimplex = 0;
85 int m_lastUsedMethod = -1;
108 delta = m_cachedSeparatingAxis.
dot(w);
113 m_degenerateSimplex = 10;
122 m_degenerateSimplex = 1;
134 m_degenerateSimplex = 2;
138 m_degenerateSimplex = 11;
151 m_degenerateSimplex = 3;
159 m_degenerateSimplex = 6;
170 m_degenerateSimplex = 7;
184 m_degenerateSimplex = 12;
194#if defined(DEBUG) || defined(_DEBUG)
196 printf(
"btGjkPairDetector maxIter exceeded:%i\n", m_curIter);
197 printf(
"sepAxis=(%f,%f,%f), squaredDistance = %f\n",
198 m_cachedSeparatingAxis.
getX(),
199 m_cachedSeparatingAxis.
getY(),
200 m_cachedSeparatingAxis.
getZ(),
214 m_degenerateSimplex = 13;
229 m_degenerateSimplex = 5;
244 m_lastUsedMethod = 1;
248 m_lastUsedMethod = 2;
253 (m_catchDegeneracies && m_degenerateSimplex && ((distance + margin) < 0.01));
265 m_cachedSeparatingAxis.
setZero();
286 if (!isValid || (distance2 < distance))
288 distance = distance2;
294 m_lastUsedMethod = 3;
298 m_lastUsedMethod = 8;
303 m_lastUsedMethod = 9;
319 if (!isValid || (distance2 < distance))
321 distance = distance2;
330 m_lastUsedMethod = 6;
334 m_lastUsedMethod = 5;
341 if (isValid && ((distance < 0) || (distance * distance <
colDesc.m_maximumDistanceSquared)))
344 m_cachedSeparatingDistance = distance;
351 return -m_lastUsedMethod;
bool btGjkEpaCalcPenDepth(const btConvexTemplate &a, const btConvexTemplate &b, const btGjkCollisionDescription &colDesc, btVector3 &v, btVector3 &wWitnessOnA, btVector3 &wWitnessOnB)
int btComputeGjkEpaPenetration(const btConvexTemplate &a, const btConvexTemplate &b, const btGjkCollisionDescription &colDesc, btVoronoiSimplexSolver &simplexSolver, btGjkDistanceTemplate *distInfo)
bool btGjkEpaSolver3_Penetration(const btConvexTemplate &a, const btConvexTemplate &b, const btVector3 &guess, btGjkEpaSolver3::sResults &results)
bool btGjkEpaSolver3_Distance(const btConvexTemplate &a, const btConvexTemplate &b, const btVector3 &guess, btGjkEpaSolver3::sResults &results)
const T & btMax(const T &a, const T &b)
btScalar length(const btQuaternion &q)
Return the length of a quaternion.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScalar btSqrt(btScalar y)
btVector3 can be used to represent 3D points and vectors.
const btScalar & getZ() const
Return the z value.
btScalar dot(const btVector3 &v) const
Return the dot product.
btScalar length2() const
Return the length of the vector squared.
const btScalar & getY() const
Return the y value.
btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
const btScalar & getX() const
Return the x value.
btVoronoiSimplexSolver is an implementation of the closest point distance algorithm from a 1-4 points...