691 m_cachedSeparatingDistance = 0.f;
699 btVector3 positionOffset = (localTransA.getOrigin() + localTransB.getOrigin()) *
btScalar(0.5);
700 localTransA.getOrigin() -= positionOffset;
701 localTransB.getOrigin() -= positionOffset;
703 bool check2d = m_minkowskiA->isConvex2d() && m_minkowskiB->isConvex2d();
717 int gGjkMaxIter = 1000;
718 m_cachedSeparatingAxis.setValue(0, 1, 0);
720 bool isValid =
false;
721 bool checkSimplex =
false;
722 bool checkPenetration =
true;
728 btScalar margin = marginA + marginB;
750 btComputeSupport(m_minkowskiA, localTransA, m_minkowskiB, localTransB, dir, check2d, supAworld, supBworld, lastSupV);
762 for (
int iterations = 0; iterations < gGjkMaxIter; iterations++)
765 btComputeSupport(m_minkowskiA, localTransA, m_minkowskiB, localTransB, dir, check2d, supAworld, supBworld, lastSupV);
791 if (do_simplex_res == 1)
796 else if (do_simplex_res == -1)
825 m_simplexSolver->reset();
842 btVector3 separatingAxisInA = (-m_cachedSeparatingAxis) * localTransA.getBasis();
843 btVector3 separatingAxisInB = m_cachedSeparatingAxis * localTransB.getBasis();
845 btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(separatingAxisInA);
846 btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(separatingAxisInB);
858 delta = m_cachedSeparatingAxis.dot(
w);
861 if ((delta >
btScalar(0.0)) && (delta * delta > squaredDistance *
input.m_maximumDistanceSquared))
870 if (m_simplexSolver->inSimplex(
w))
877 btScalar f0 = squaredDistance - delta;
895 m_simplexSolver->addVertex(
w, pWorld, qWorld);
899 if (!m_simplexSolver->closest(newCachedSeparatingAxis))
906 if (newCachedSeparatingAxis.length2() <
REL_ERROR2)
908 m_cachedSeparatingAxis = newCachedSeparatingAxis;
914 btScalar previousSquaredDistance = squaredDistance;
915 squaredDistance = newCachedSeparatingAxis.length2();
918 if (squaredDistance > previousSquaredDistance)
921 squaredDistance = previousSquaredDistance;
922 checkSimplex =
false;
930 if (previousSquaredDistance - squaredDistance <=
SIMD_EPSILON * previousSquaredDistance)
939 m_cachedSeparatingAxis = newCachedSeparatingAxis;
944#if defined(DEBUG) || defined(_DEBUG)
947 printf(
"sepAxis=(%f,%f,%f), squaredDistance = %f, shapeTypeA=%i,shapeTypeB=%i\n",
948 m_cachedSeparatingAxis.getX(),
949 m_cachedSeparatingAxis.getY(),
950 m_cachedSeparatingAxis.getZ(),
952 m_minkowskiA->getShapeType(),
953 m_minkowskiB->getShapeType());
959 bool check = (!m_simplexSolver->fullSimplex());
973 m_simplexSolver->compute_points(pointOnA, pointOnB);
974 normalInB = m_cachedSeparatingAxis;
976 btScalar lenSqr = m_cachedSeparatingAxis.length2();
991 pointOnA -= m_cachedSeparatingAxis * (marginA / s);
992 pointOnB += m_cachedSeparatingAxis * (marginB / s);
995 orgNormalInB = normalInB;
1006 bool catchDegeneratePenetrationCase =
1010 if ((checkPenetration && (!isValid || catchDegeneratePenetrationCase)) || (
status == 0))
1015 if (m_penetrationDepthSolver)
1020 m_cachedSeparatingAxis.setZero();
1022 bool isValid2 = m_penetrationDepthSolver->calcPenDepth(
1024 m_minkowskiA, m_minkowskiB,
1025 localTransA, localTransB,
1026 m_cachedSeparatingAxis, tmpPointOnA, tmpPointOnB,
1029 if (m_cachedSeparatingAxis.length2())
1033 btVector3 tmpNormalInB = tmpPointOnB - tmpPointOnA;
1034 btScalar lenSqr = tmpNormalInB.length2();
1037 tmpNormalInB = m_cachedSeparatingAxis;
1038 lenSqr = m_cachedSeparatingAxis.length2();
1043 tmpNormalInB /=
btSqrt(lenSqr);
1050 pointOnA = tmpPointOnA;
1051 pointOnB = tmpPointOnB;
1052 normalInB = tmpNormalInB;
1074 if (m_cachedSeparatingAxis.length2() >
btScalar(0.))
1081 pointOnA = tmpPointOnA;
1082 pointOnB = tmpPointOnB;
1083 pointOnA -= m_cachedSeparatingAxis * marginA;
1084 pointOnB += m_cachedSeparatingAxis * marginB;
1085 normalInB = m_cachedSeparatingAxis;
1086 normalInB.normalize();
1108 m_cachedSeparatingAxis = normalInB;
1109 m_cachedSeparatingDistance =
distance;
1119 btVector3 separatingAxisInA = (-orgNormalInB) * localTransA.getBasis();
1120 btVector3 separatingAxisInB = orgNormalInB * localTransB.getBasis();
1122 btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(separatingAxisInA);
1123 btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(separatingAxisInB);
1128 d2 = orgNormalInB.dot(
w) - margin;
1133 btVector3 separatingAxisInA = (normalInB)*localTransA.getBasis();
1134 btVector3 separatingAxisInB = -normalInB * localTransB.getBasis();
1136 btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(separatingAxisInA);
1137 btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(separatingAxisInB);
1142 d1 = (-normalInB).
dot(
w) - margin;
1146 btVector3 separatingAxisInA = (-normalInB) *
input.m_transformA.getBasis();
1147 btVector3 separatingAxisInB = normalInB *
input.m_transformB.getBasis();
1149 btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(separatingAxisInA);
1150 btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(separatingAxisInB);
1155 d0 = normalInB.dot(
w) - margin;
1164 if (orgNormalInB.length2())
1166 if (d2 > d0 && d2 > d1 && d2 >
distance)
1168 normalInB = orgNormalInB;
1176 pointOnB + positionOffset,