collision detection

greg2330
Posts: 1
Joined: Mon Aug 15, 2011 8:22 pm

collision detection

Post by greg2330 »

Hello,

Im new to using bullet and have been reading through the user manual and wiki and looking at some of the demo source code. So far Im not sure how to exactly get things working... what Im try to do is detect a collision between a non-moving terrain and an airplane model that has a position and orientation. I only need to do collision detection and dont need to do anything physics related with forces or gravity. So if anyone can help me to figure out how to do this it would be appreciated.

Here is roughly how im currently trying to do things...

Creating the collision object:

Code: Select all

int numPoints = numVertices * 3;
	
	// Setup the mesh
	triangleMesh = new btTriangleMesh();

	for (int i = 0; i < numPoints; i += 9)
	{
		btVector3 v0(vertices[i], vertices[i+1], vertices[i+2]);
		btVector3 v1(vertices[i+3], vertices[i+4], vertices[i+5]);
		btVector3 v2(vertices[i+6], vertices[i+7], vertices[i+8]);

		// Add the triangle to the mesh
		triangleMesh->addTriangle(v0,v1,v2);
	}

	collisionShape = new btBvhTriangleMeshShape(triangleMesh, true);
	
	// Setup the collision object
	btMatrix3x3 basis;
	basis.setIdentity();
	
	collisionObject = new btCollisionObject();
	collisionObject->getWorldTransform().setBasis(basis);
	collisionObject->setCollisionShape(collisionShape);
Setting up the collision world:

Code: Select all

	collisionConfiguration = new btDefaultCollisionConfiguration();
	collisionDispatcher = new btCollisionDispatcher(collisionConfiguration);
	
	btVector3	worldAabbMin(-1000,-1000,-1000);
	btVector3	worldAabbMax(1000,1000,1000);
	
	broadphase = new btAxisSweep3(worldAabbMin, worldAabbMax);
	
	collisionWorld = new btCollisionWorld(collisionDispatcher, broadphase, collisionConfiguration);
	collisionWorld->addCollisionObject(environment.getCollisionObject());
	collisionWorld->addCollisionObject(airplane.getCollisionObject());
Checking collisions:

Code: Select all

collisionWorld->performDiscreteCollisionDetection();
	
        int numManifolds = collisionWorld->getDispatcher()->getNumManifolds();
	for (int i=0; i<numManifolds; i++)
	{
		btPersistentManifold* contactManifold = collisionWorld->getDispatcher()->getManifoldByIndexInternal(i);
		btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0());
		btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1());
		printf("manifolds = %d", numManifolds);
	
		int numContacts = contactManifold->getNumContacts();
		for (int j=0;j<numContacts;j++)
		{
			printf("contacts = %d", numContacts);
		}
	}
Everytime I draw, but before checking for collisions I call

Code: Select all

collisionObject->getWorldTransform().setFromOpenGLMatrix(m);
Any help, code, links, tutorials, etc are very much appreciated. Thank you!
MaxDZ8
Posts: 149
Joined: Fri Jun 24, 2011 8:53 am

Re: collision detection

Post by MaxDZ8 »

greg2330 wrote:Creating the collision object:

Code: Select all

triangleMesh = new btTriangleMesh();
...
I hardly believe you cannot approximate this using a simple convex volume, in case you don't consider btCompondShape.
Checking collisions:

Code: Select all

collisionWorld->performDiscreteCollisionDetection();	
        int numManifolds = collisionWorld->getDispatcher()->getNumManifolds();
        /* loop on all manifolds */
	}
Consider using a ghost object instead. Your mileage will vary but in my case, I measured about 10% more perf in CharacterDemo!
greg2330 wrote:Any help, code, links, tutorials, etc are very much appreciated. Thank you!
Have you looked at the provided demos?
AppConcaveDemo, ConcaveRayCastDemo? The former does slightly more than you need, but should be able to get you there.