63 bool m_catchDegeneracies =
true;
64 btScalar m_cachedSeparatingDistance = 0.f;
69 btVector3 pointOnA, pointOnB;
78 btVector3 m_cachedSeparatingAxis = colDesc.
m_firstDir;
81 bool checkSimplex =
false;
82 bool checkPenetration =
true;
83 int m_degenerateSimplex = 0;
85 int m_lastUsedMethod = -1;
93 simplexSolver.reset();
98 btVector3 separatingAxisInA = (-m_cachedSeparatingAxis) * localTransA.getBasis();
99 btVector3 separatingAxisInB = m_cachedSeparatingAxis * localTransB.getBasis();
101 btVector3 pInA = a.getLocalSupportWithoutMargin(separatingAxisInA);
102 btVector3 qInB =
b.getLocalSupportWithoutMargin(separatingAxisInB);
104 btVector3 pWorld = localTransA(pInA);
105 btVector3 qWorld = localTransB(qInB);
107 btVector3
w = pWorld - qWorld;
108 delta = m_cachedSeparatingAxis.dot(
w);
113 m_degenerateSimplex = 10;
120 if (simplexSolver.inSimplex(
w))
122 m_degenerateSimplex = 1;
127 btScalar f0 = squaredDistance - delta;
134 m_degenerateSimplex = 2;
138 m_degenerateSimplex = 11;
145 simplexSolver.addVertex(
w, pWorld, qWorld);
146 btVector3 newCachedSeparatingAxis;
149 if (!simplexSolver.closest(newCachedSeparatingAxis))
151 m_degenerateSimplex = 3;
158 m_cachedSeparatingAxis = newCachedSeparatingAxis;
159 m_degenerateSimplex = 6;
164 btScalar previousSquaredDistance = squaredDistance;
165 squaredDistance = newCachedSeparatingAxis.length2();
168 if (squaredDistance>previousSquaredDistance)
170 m_degenerateSimplex = 7;
171 squaredDistance = previousSquaredDistance;
172 checkSimplex =
false;
180 if (previousSquaredDistance - squaredDistance <=
SIMD_EPSILON * previousSquaredDistance)
184 m_degenerateSimplex = 12;
189 m_cachedSeparatingAxis = newCachedSeparatingAxis;
192 if (m_curIter++ > gGjkMaxIter)
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(),
207 bool check = (!simplexSolver.fullSimplex());
214 m_degenerateSimplex = 13;
221 simplexSolver.compute_points(pointOnA, pointOnB);
222 normalInB = m_cachedSeparatingAxis;
224 btScalar lenSqr = m_cachedSeparatingAxis.length2();
229 m_degenerateSimplex = 5;
239 pointOnA -= m_cachedSeparatingAxis * (marginA / s);
240 pointOnB += m_cachedSeparatingAxis * (marginB / s);
241 distance = ((
btScalar(1.) / rlen) - margin);
244 m_lastUsedMethod = 1;
248 m_lastUsedMethod = 2;
252 bool catchDegeneratePenetrationCase =
253 (m_catchDegeneracies && m_degenerateSimplex && ((distance + margin) < 0.01));
256 if (checkPenetration && (!isValid || catchDegeneratePenetrationCase))
263 btVector3 tmpPointOnA, tmpPointOnB;
265 m_cachedSeparatingAxis.setZero();
269 m_cachedSeparatingAxis, tmpPointOnA, tmpPointOnB);
273 btVector3 tmpNormalInB = tmpPointOnB - tmpPointOnA;
274 btScalar lenSqr = tmpNormalInB.length2();
277 tmpNormalInB = m_cachedSeparatingAxis;
278 lenSqr = m_cachedSeparatingAxis.length2();
283 tmpNormalInB /=
btSqrt(lenSqr);
289 pointOnA = tmpPointOnA;
290 pointOnB = tmpPointOnB;
291 normalInB = tmpNormalInB;
294 m_lastUsedMethod = 3;
298 m_lastUsedMethod = 8;
303 m_lastUsedMethod = 9;
315 if (m_cachedSeparatingAxis.length2() >
btScalar(0.))
322 pointOnA = tmpPointOnA;
323 pointOnB = tmpPointOnB;
324 pointOnA -= m_cachedSeparatingAxis * marginA;
325 pointOnB += m_cachedSeparatingAxis * marginB;
326 normalInB = m_cachedSeparatingAxis;
327 normalInB.normalize();
330 m_lastUsedMethod = 6;
334 m_lastUsedMethod = 5;
343 m_cachedSeparatingAxis = normalInB;
344 m_cachedSeparatingDistance =
distance;
346 distInfo->m_normalBtoA = normalInB;
347 distInfo->m_pointOnB = pointOnB;
348 distInfo->m_pointOnA = pointOnB + normalInB *
distance;
351 return -m_lastUsedMethod;