ray hitnormal is already in worldspace for convex objects, but not for trianglemeshes (ray is transformed in local space)

This commit is contained in:
ejcoumans
2007-07-27 23:52:33 +00:00
parent c57c863112
commit a1fabc4b91
2 changed files with 14 additions and 5 deletions

View File

@@ -233,7 +233,8 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
castResult.m_fraction castResult.m_fraction
); );
resultCallback.AddSingleResult(localRayResult); bool normalInWorldSpace = true;
resultCallback.AddSingleResult(localRayResult, normalInWorldSpace);
} }
} }
@@ -282,7 +283,8 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
hitNormalLocal, hitNormalLocal,
hitFraction); hitFraction);
return m_resultCallback->AddSingleResult(rayResult); bool normalInWorldSpace = false;
return m_resultCallback->AddSingleResult(rayResult,normalInWorldSpace);
} }

View File

@@ -166,7 +166,7 @@ public:
:m_closestHitFraction(btScalar(1.)) :m_closestHitFraction(btScalar(1.))
{ {
} }
virtual btScalar AddSingleResult(LocalRayResult& rayResult) = 0; virtual btScalar AddSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace) = 0;
}; };
struct ClosestRayResultCallback : public RayResultCallback struct ClosestRayResultCallback : public RayResultCallback
@@ -185,7 +185,7 @@ public:
btVector3 m_hitPointWorld; btVector3 m_hitPointWorld;
btCollisionObject* m_collisionObject; btCollisionObject* m_collisionObject;
virtual btScalar AddSingleResult(LocalRayResult& rayResult) virtual btScalar AddSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace)
{ {
//caller already does the filter on the m_closestHitFraction //caller already does the filter on the m_closestHitFraction
@@ -193,7 +193,14 @@ public:
m_closestHitFraction = rayResult.m_hitFraction; m_closestHitFraction = rayResult.m_hitFraction;
m_collisionObject = rayResult.m_collisionObject; m_collisionObject = rayResult.m_collisionObject;
m_hitNormalWorld = m_collisionObject->getWorldTransform().getBasis()*rayResult.m_hitNormalLocal; if (normalInWorldSpace)
{
m_hitNormalWorld = rayResult.m_hitNormalLocal;
} else
{
///need to transform normal into worldspace
m_hitNormalWorld = m_collisionObject->getWorldTransform().getBasis()*rayResult.m_hitNormalLocal;
}
m_hitPointWorld.setInterpolate3(m_rayFromWorld,m_rayToWorld,rayResult.m_hitFraction); m_hitPointWorld.setInterpolate3(m_rayFromWorld,m_rayToWorld,rayResult.m_hitFraction);
return rayResult.m_hitFraction; return rayResult.m_hitFraction;
} }