Propagate the allowed penetration through convex cast against a triangle mesh.

Thanks for the report and patch to Paul Dubois, Issue 451
This commit is contained in:
erwin.coumans
2010-11-18 00:25:04 +00:00
parent c49927b4ed
commit 98d902b7c1
3 changed files with 8 additions and 3 deletions

View File

@@ -576,6 +576,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
BridgeTriangleConvexcastCallback tccb(castShape, convexFromTrans,convexToTrans,&resultCallback,collisionObject,triangleMesh, colObjWorldTransform); BridgeTriangleConvexcastCallback tccb(castShape, convexFromTrans,convexToTrans,&resultCallback,collisionObject,triangleMesh, colObjWorldTransform);
tccb.m_hitFraction = resultCallback.m_closestHitFraction; tccb.m_hitFraction = resultCallback.m_closestHitFraction;
tccb.m_allowedPenetration = allowedPenetration;
btVector3 boxMinLocal, boxMaxLocal; btVector3 boxMinLocal, boxMaxLocal;
castShape->getAabb(rotationXform, boxMinLocal, boxMaxLocal); castShape->getAabb(rotationXform, boxMinLocal, boxMaxLocal);
triangleMesh->performConvexcast(&tccb,convexFromLocal,convexToLocal,boxMinLocal, boxMaxLocal); triangleMesh->performConvexcast(&tccb,convexFromLocal,convexToLocal,boxMinLocal, boxMaxLocal);
@@ -632,6 +633,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
BridgeTriangleConvexcastCallback tccb(castShape, convexFromTrans,convexToTrans,&resultCallback,collisionObject,concaveShape, colObjWorldTransform); BridgeTriangleConvexcastCallback tccb(castShape, convexFromTrans,convexToTrans,&resultCallback,collisionObject,concaveShape, colObjWorldTransform);
tccb.m_hitFraction = resultCallback.m_closestHitFraction; tccb.m_hitFraction = resultCallback.m_closestHitFraction;
tccb.m_allowedPenetration = allowedPenetration;
btVector3 boxMinLocal, boxMaxLocal; btVector3 boxMinLocal, boxMaxLocal;
castShape->getAabb(rotationXform, boxMinLocal, boxMaxLocal); castShape->getAabb(rotationXform, boxMinLocal, boxMaxLocal);

View File

@@ -124,8 +124,9 @@ btTriangleConvexcastCallback::btTriangleConvexcastCallback (const btConvexShape*
m_convexShapeFrom = convexShapeFrom; m_convexShapeFrom = convexShapeFrom;
m_convexShapeTo = convexShapeTo; m_convexShapeTo = convexShapeTo;
m_triangleToWorld = triangleToWorld; m_triangleToWorld = triangleToWorld;
m_hitFraction = 1.0; m_hitFraction = 1.0f;
m_triangleCollisionMargin = triangleCollisionMargin; m_triangleCollisionMargin = triangleCollisionMargin;
m_allowedPenetration = 0.f;
} }
void void
@@ -148,6 +149,7 @@ btTriangleConvexcastCallback::processTriangle (btVector3* triangle, int partId,
btConvexCast::CastResult castResult; btConvexCast::CastResult castResult;
castResult.m_fraction = btScalar(1.); castResult.m_fraction = btScalar(1.);
castResult.m_allowedPenetration = m_allowedPenetration;
if (convexCaster.calcTimeOfImpact(m_convexShapeFrom,m_convexShapeTo,m_triangleToWorld, m_triangleToWorld, castResult)) if (convexCaster.calcTimeOfImpact(m_convexShapeFrom,m_convexShapeTo,m_triangleToWorld, m_triangleToWorld, castResult))
{ {
//add hit //add hit

View File

@@ -58,7 +58,8 @@ public:
btTransform m_convexShapeTo; btTransform m_convexShapeTo;
btTransform m_triangleToWorld; btTransform m_triangleToWorld;
btScalar m_hitFraction; btScalar m_hitFraction;
btScalar m_triangleCollisionMargin; btScalar m_triangleCollisionMargin;
btScalar m_allowedPenetration;
btTriangleConvexcastCallback (const btConvexShape* convexShape, const btTransform& convexShapeFrom, const btTransform& convexShapeTo, const btTransform& triangleToWorld, const btScalar triangleCollisionMargin); btTriangleConvexcastCallback (const btConvexShape* convexShape, const btTransform& convexShapeFrom, const btTransform& convexShapeTo, const btTransform& triangleToWorld, const btScalar triangleCollisionMargin);