temporarily exclude a rigidBody from ray testing

Started by
1 comment, last by Ed Welch 8 years, 7 months ago

I am using Bullet physics for ray testing and I want to exclude a rigidBody from the ray test for one call only.
Is there anyway to do this without calling removeBody and addBody?
I looked at using btOverlapFilterCallback, but that seems to be for preventing collisions, not ray testing.

Advertisement

Just use non-default ray intersection callback and filter out your body manually.

That is, make derived class from btCollisionWorld::ClosestRayResultCallback and override virtual bool needsCollision(btBroadphaseProxy* proxy0) const.

http://bulletphysics.org/Bullet/BulletFull/btCollisionWorld_8h_source.html#l00231

Just use non-default ray intersection callback and filter out your body manually.

That is, make derived class from btCollisionWorld::ClosestRayResultCallback and override virtual bool needsCollision(btBroadphaseProxy* proxy0) const.

http://bulletphysics.org/Bullet/BulletFull/btCollisionWorld_8h_source.html#l00231

Yeah, that seems to work. Thanks for the answer ;)

This is the code I used:


struct ExcludeRayResultCallback : public btCollisionWorld::ClosestRayResultCallback 
{
	ExcludeRayResultCallback(const btVector3& rayFromWorld,const btVector3&	rayToWorld)
		: btCollisionWorld::ClosestRayResultCallback(rayFromWorld, rayToWorld)
	{
		m_pExlude = NULL;
	}
		
	virtual bool needsCollision(btBroadphaseProxy* proxy0) const
	{
		btCollisionObject* pCollisionObject = (btCollisionObject*)proxy0->m_clientObject;
		assert(pCollisionObject->getInternalType() == btCollisionObject::CO_COLLISION_OBJECT ||
			pCollisionObject->getInternalType() == btCollisionObject::CO_RIGID_BODY);
		return pCollisionObject->getUserPointer() != m_pExlude;
	}
	void* m_pExlude;
};

This topic is closed to new replies.

Advertisement