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
);
resultCallback.AddSingleResult(localRayResult);
bool normalInWorldSpace = true;
resultCallback.AddSingleResult(localRayResult, normalInWorldSpace);
}
}
@@ -282,7 +283,8 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
hitNormalLocal,
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.))
{
}
virtual btScalar AddSingleResult(LocalRayResult& rayResult) = 0;
virtual btScalar AddSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace) = 0;
};
struct ClosestRayResultCallback : public RayResultCallback
@@ -185,7 +185,7 @@ public:
btVector3 m_hitPointWorld;
btCollisionObject* m_collisionObject;
virtual btScalar AddSingleResult(LocalRayResult& rayResult)
virtual btScalar AddSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace)
{
//caller already does the filter on the m_closestHitFraction
@@ -193,7 +193,14 @@ public:
m_closestHitFraction = rayResult.m_hitFraction;
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);
return rayResult.m_hitFraction;
}