Code: Select all
class btKinematicClosestNotMeConvexResultCallback : public btCollisionWorld::ClosestConvexResultCallback{
public:
btKinematicClosestNotMeConvexResultCallback(btCollisionObject* me) : ClosestConvexResultCallback(btVector3(0.0, 0.0, 0.0), btVector3(0.0, 0.0, 0.0)){
m_me = me;
}
virtual btScalar addSingleResult(btCollisionWorld::LocalConvexResult& convexResult, bool normalInWorldSpace){
if (convexResult.m_hitCollisionObject == m_me)
return btScalar(1.0);
return ClosestConvexResultCallback::addSingleResult(convexResult, btVector3(0, 0, 0));
}
btCollisionObject* m_me;
const btVector3 m_up;
btScalar m_minSlopeDot;
};
Code: Select all
btKinematicClosestNotMeConvexResultCallback callback(body);
m_ghostObject->convexSweepTest((btConvexShape*)m_ghostObject->getCollisionShape(), m_ghostObject->getWorldTransform(), body->getWorldTransform(), callback);
if(!callback.hasHit()){
m_ghostObject->setWorldTransform(body->getWorldTransform());
}
else{
// handle other stuff
}
Here's my Collision, Body and Ghost Object initialization:
Code: Select all
bodyCollision = new btSphereShape(1.5);
btTransform startTransform;
startTransform.setIdentity();
startTransform.setOrigin(btVector3(position.x, position.y, position.z));
btVector3 localInertia(0, 0, 0);
bodyCollision->calculateLocalInertia(1, localInertia);
bodyMotionState = new btDefaultMotionState(startTransform);
btRigidBody::btRigidBodyConstructionInfo rbInfo(1, bodyMotionState, bodyCollision, localInertia);
body = new btRigidBody(rbInfo);
physics->addRigidBody(body);
body->setLinearVelocity(btVector3(direction.x, direction.y, direction.z) * 70);
body->setFriction(0.5f);
m_ghostObject = new btPairCachingGhostObject();
m_ghostObject->setWorldTransform(startTransform);
m_ghostObject->setCollisionShape(bodyCollision);
m_ghostObject->setCollisionFlags(btCollisionObject::CF_NO_CONTACT_RESPONSE);
physics->addCollisionObject(m_ghostObject, btBroadphaseProxy::SensorTrigger,btBroadphaseProxy::AllFilter & ~btBroadphaseProxy::SensorTrigger);