Properly set normalInWorldSpace and don't doubly rotate normal for convex vs. convex cast.

Fixes this issue: http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1784
This commit is contained in:
johnmccutchan
2008-02-11 19:16:04 +00:00
parent fe4e81ebff
commit 1ac223ca2a
2 changed files with 6 additions and 8 deletions

View File

@@ -227,7 +227,7 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
btVoronoiSimplexSolver simplexSolver; btVoronoiSimplexSolver simplexSolver;
#define USE_SUBSIMPLEX_CONVEX_CAST 1 #define USE_SUBSIMPLEX_CONVEX_CAST 1
#ifdef USE_SUBSIMPLEX_CONVEX_CAST #ifdef USE_SUBSIMPLEX_CONVEX_CAST
btSubsimplexConvexCast convexCaster(castShape,convexShape,&simplexSolver); btSubsimplexConvexCast convexCaster(castShape,convexShape,&simplexSolver);
#else #else
//btGjkConvexCast convexCaster(castShape,convexShape,&simplexSolver); //btGjkConvexCast convexCaster(castShape,convexShape,&simplexSolver);
//btContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,0); //btContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,0);
@@ -412,11 +412,6 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
{ {
if (castResult.m_fraction < resultCallback.m_closestHitFraction) if (castResult.m_fraction < resultCallback.m_closestHitFraction)
{ {
#ifdef USE_SUBSIMPLEX_CONVEX_CAST
//rotate normal into worldspace
castResult.m_normal = convexFromTrans.getBasis() * castResult.m_normal;
#endif //USE_SUBSIMPLEX_CONVEX_CAST
castResult.m_normal.normalize(); castResult.m_normal.normalize();
btCollisionWorld::LocalConvexResult localConvexResult btCollisionWorld::LocalConvexResult localConvexResult
( (
@@ -477,7 +472,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
hitPointLocal, hitPointLocal,
hitFraction); hitFraction);
bool normalInWorldSpace = false; bool normalInWorldSpace = true;
return m_resultCallback->AddSingleResult(convexResult,normalInWorldSpace); return m_resultCallback->AddSingleResult(convexResult,normalInWorldSpace);

View File

@@ -123,6 +123,7 @@ btTriangleConvexcastCallback::processTriangle (btVector3* triangle, int partId,
//#define USE_SUBSIMPLEX_CONVEX_CAST 1 //#define USE_SUBSIMPLEX_CONVEX_CAST 1
//if you reenable USE_SUBSIMPLEX_CONVEX_CAST see commented out code below
#ifdef USE_SUBSIMPLEX_CONVEX_CAST #ifdef USE_SUBSIMPLEX_CONVEX_CAST
btSubsimplexConvexCast convexCaster(m_convexShape, &triangleShape, &simplexSolver); btSubsimplexConvexCast convexCaster(m_convexShape, &triangleShape, &simplexSolver);
#else #else
@@ -139,11 +140,13 @@ btTriangleConvexcastCallback::processTriangle (btVector3* triangle, int partId,
{ {
if (castResult.m_fraction < m_hitFraction) if (castResult.m_fraction < m_hitFraction)
{ {
/* btContinuousConvexCast's normal is already in world space */
/*
#ifdef USE_SUBSIMPLEX_CONVEX_CAST #ifdef USE_SUBSIMPLEX_CONVEX_CAST
//rotate normal into worldspace //rotate normal into worldspace
castResult.m_normal = m_convexShapeFrom.getBasis() * castResult.m_normal; castResult.m_normal = m_convexShapeFrom.getBasis() * castResult.m_normal;
#endif //USE_SUBSIMPLEX_CONVEX_CAST #endif //USE_SUBSIMPLEX_CONVEX_CAST
*/
castResult.m_normal.normalize(); castResult.m_normal.normalize();
reportHit (castResult.m_normal, reportHit (castResult.m_normal,