bullet3
bullet3 copied to clipboard
Assertion on normalizing orgNormalInB that is zero
prog\3rdPartyLibs\phys\bullet-3\src\LinearMath/btVector3.h,309: assert failed in prog\3rdPartyLibs\phys\bullet-3\src\LinearMath/btVector3.h:309,btVector3::normalize() : "!fuzzyZero()"
Call stack (21 frames): btGjkPairDetector::getClosestPointsNonVirtual +4155/5487 prog\3rdPartyLibs\phys\bullet-3\src\BulletCollision\NarrowPhaseCollision\btGjkPairDetector.cpp(1121) +0 btConvexConvexAlgorithm::processCollision +9914/12018 prog\3rdPartyLibs\phys\bullet-3\src\BulletCollision\CollisionDispatch\btConvexConvexAlgorithm.cpp(704) +0 btConvexTriangleCallback::processTriangle +592/727 prog\3rdPartyLibs\phys\bullet-3\src\BulletCollision\CollisionDispatch\btConvexConcaveCollisionAlgorithm.cpp(177) +0 btDagorHeightfieldTerrainShape::processAllTriangles +1382/1535 prog\engine2\phys\physBullet\btDagorHeightfieldTerrainShape.cpp(153) +17 btConvexConcaveCollisionAlgorithm::processCollision +1568/1730 prog\3rdPartyLibs\phys\bullet-3\src\BulletCollision\CollisionDispatch\btConvexConcaveCollisionAlgorithm.cpp(306) +0
orgNormalInB is inited to non-zero in only one place but two more places set isValid = true so execution gets to btVector3 separatingAxisInA = (-orgNormalInB) * localTransA.getBasis(); btVector3 separatingAxisInB = orgNormalInB * localTransB.getBasis(); both computed to zero and next asserts on normalization in btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(separatingAxisInA); btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(separatingAxisInB);
proposed solution is +++ b/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp @@ -1116,4 +1116,5 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput &inpu
btScalar d2 = 0.f;
-
if (orgNormalInB.length2()) { btVector3 separatingAxisInA = (-orgNormalInB) * localTransA.getBasis();