Ghost Object doesn't always detect collision

Ripiz
Posts: 47
Joined: Mon Aug 16, 2010 10:43 am

Ghost Object doesn't always detect collision

Post by Ripiz »

I based my ClosestConvexResultCallback on the one used in Kinematic Character Controller (if really it's almost copy/pasted):

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;
			};
I use convexSweepTest() to detect collision:

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
			}
However sometimes it doesn't detect collision, and my object simply bounces off (or even several times). Anyone know what I did wrong, or how to fix that?

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);