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:
@@ -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);
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user