This commit is contained in:
ejcoumans 2006-09-08 02:28:26 +00:00
parent 37c920db63
commit 3a9c5dcc35

View File

@ -41,34 +41,36 @@ SphereSphereCollisionAlgorithm::~SphereSphereCollisionAlgorithm()
void SphereSphereCollisionAlgorithm::ProcessCollision (BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,const DispatcherInfo& dispatchInfo) void SphereSphereCollisionAlgorithm::ProcessCollision (BroadphaseProxy* proxy0,BroadphaseProxy* proxy1,const DispatcherInfo& dispatchInfo)
{ {
if (!m_manifoldPtr) if (!m_manifoldPtr)
return; return;
CollisionObject* col0 = static_cast<CollisionObject*>(proxy0->m_clientObject); CollisionObject* col0 = static_cast<CollisionObject*>(proxy0->m_clientObject);
CollisionObject* col1 = static_cast<CollisionObject*>(proxy1->m_clientObject); CollisionObject* col1 = static_cast<CollisionObject*>(proxy1->m_clientObject);
SphereShape* sphere0 = (SphereShape*)col0->m_collisionShape; SphereShape* sphere0 = (SphereShape*)col0->m_collisionShape;
SphereShape* sphere1 = (SphereShape*)col1->m_collisionShape; SphereShape* sphere1 = (SphereShape*)col1->m_collisionShape;
SimdVector3 diff = col0->m_worldTransform.getOrigin()- col1->m_worldTransform.getOrigin();
float len = diff.length();
SimdScalar radius0 = sphere0->GetRadius(); SimdScalar radius0 = sphere0->GetRadius();
SimdScalar radius1 = sphere1->GetRadius(); SimdScalar radius1 = sphere1->GetRadius();
SimdVector3 diff = col0->m_worldTransform.getOrigin()- ///iff distance positive, don't generate a new contact
col1->m_worldTransform.getOrigin();
float len = diff.length();
if ( len > (radius0+radius1)) if ( len > (radius0+radius1))
return; return;
///distance (negative means penetration)
SimdScalar dist = len - (radius0+radius1); SimdScalar dist = len - (radius0+radius1);
SimdVector3 normalOnSurfaceB = diff / len; SimdVector3 normalOnSurfaceB = diff / len;
///point on A (worldspace)
SimdVector3 pos0 = col0->m_worldTransform.getOrigin() - radius0 * normalOnSurfaceB; SimdVector3 pos0 = col0->m_worldTransform.getOrigin() - radius0 * normalOnSurfaceB;
///point on B (worldspace)
SimdVector3 pos1 = col1->m_worldTransform.getOrigin() + radius1* normalOnSurfaceB; SimdVector3 pos1 = col1->m_worldTransform.getOrigin() + radius1* normalOnSurfaceB;
/// report a contact. internally this will be kept persistent, and contact reduction is done
ManifoldResult* resultOut = m_dispatcher->GetNewManifoldResult(col0,col1,m_manifoldPtr); ManifoldResult* resultOut = m_dispatcher->GetNewManifoldResult(col0,col1,m_manifoldPtr);
resultOut->AddContactPoint(normalOnSurfaceB,pos1,dist); resultOut->AddContactPoint(normalOnSurfaceB,pos1,dist);
m_dispatcher->ReleaseManifoldResult(resultOut);
} }