add option for slightly more accurate, and slightly slower algorithm for ray versus convex, used in btCollisionWorld::rayTest.
rayResult.m_flags |= btTriangleRaycastCallback::kF_UseGjkConvexRaytest; See Demos/RaytestDemo/RaytestDemo.cpp for usage This fixes issue 146, longest outstanding from 2008.
This commit is contained in:
@@ -68,6 +68,9 @@ void RaytestDemo::castRays()
|
|||||||
sDebugDraw.drawLine(from,to,btVector4(0,0,0,1));
|
sDebugDraw.drawLine(from,to,btVector4(0,0,0,1));
|
||||||
btCollisionWorld::AllHitsRayResultCallback allResults(from,to);
|
btCollisionWorld::AllHitsRayResultCallback allResults(from,to);
|
||||||
allResults.m_flags |= btTriangleRaycastCallback::kF_KeepUnflippedNormal;
|
allResults.m_flags |= btTriangleRaycastCallback::kF_KeepUnflippedNormal;
|
||||||
|
//optional kF_UseGjkConvexRaytest flag enabled a slightly more accurate and slightly slower algorithm
|
||||||
|
allResults.m_flags |= btTriangleRaycastCallback::kF_UseGjkConvexRaytest;
|
||||||
|
|
||||||
m_dynamicsWorld->rayTest(from,to,allResults);
|
m_dynamicsWorld->rayTest(from,to,allResults);
|
||||||
|
|
||||||
for (int i=0;i<allResults.m_hitFractions.size();i++)
|
for (int i=0;i<allResults.m_hitFractions.size();i++)
|
||||||
|
|||||||
@@ -287,13 +287,19 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
|
|||||||
|
|
||||||
btConvexShape* convexShape = (btConvexShape*) collisionShape;
|
btConvexShape* convexShape = (btConvexShape*) collisionShape;
|
||||||
btVoronoiSimplexSolver simplexSolver;
|
btVoronoiSimplexSolver simplexSolver;
|
||||||
#define USE_SUBSIMPLEX_CONVEX_CAST 1
|
btSubsimplexConvexCast subSimplexConvexCaster(castShape,convexShape,&simplexSolver);
|
||||||
#ifdef USE_SUBSIMPLEX_CONVEX_CAST
|
|
||||||
btSubsimplexConvexCast convexCaster(castShape,convexShape,&simplexSolver);
|
btGjkConvexCast gjkConvexCaster(castShape,convexShape,&simplexSolver);
|
||||||
#else
|
|
||||||
//btGjkConvexCast convexCaster(castShape,convexShape,&simplexSolver);
|
|
||||||
//btContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,0);
|
//btContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,0);
|
||||||
#endif //#USE_SUBSIMPLEX_CONVEX_CAST
|
bool condition = true;
|
||||||
|
btConvexCast* convexCasterPtr = 0;
|
||||||
|
if (resultCallback.m_flags & btTriangleRaycastCallback::kF_UseGjkConvexRaytest)
|
||||||
|
convexCasterPtr = &gjkConvexCaster;
|
||||||
|
else
|
||||||
|
convexCasterPtr = &subSimplexConvexCaster;
|
||||||
|
|
||||||
|
btConvexCast& convexCaster = *convexCasterPtr;
|
||||||
|
|
||||||
if (convexCaster.calcTimeOfImpact(rayFromTrans,rayToTrans,colObjWorldTransform,colObjWorldTransform,castResult))
|
if (convexCaster.calcTimeOfImpact(rayFromTrans,rayToTrans,colObjWorldTransform,colObjWorldTransform,castResult))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public:
|
|||||||
kF_None = 0,
|
kF_None = 0,
|
||||||
kF_FilterBackfaces = 1 << 0,
|
kF_FilterBackfaces = 1 << 0,
|
||||||
kF_KeepUnflippedNormal = 1 << 1, // Prevents returned face normal getting flipped when a ray hits a back-facing triangle
|
kF_KeepUnflippedNormal = 1 << 1, // Prevents returned face normal getting flipped when a ray hits a back-facing triangle
|
||||||
|
kF_UseGjkConvexRaytest = 1 << 2, // Uses a more accurate but slightly slower ray versus convex algorithm
|
||||||
kF_Terminator = 0xFFFFFFFF
|
kF_Terminator = 0xFFFFFFFF
|
||||||
};
|
};
|
||||||
unsigned int m_flags;
|
unsigned int m_flags;
|
||||||
|
|||||||
Reference in New Issue
Block a user