Damn, damn, damn. I took almost 3 hours to solve a problem.
// create a motion state
obj->motionState.reset( new btDefaultMotionState( transform ) );
// create a collision shape
const btVector3 halfExtents( 0.5f, 0.5f, 0.5f );
obj->collisionShape.reset( new btBoxShape( halfExtents ) );
// create a rigid body
const float mass = obj->mass;
btVector3 localInertia( 0.0f, 0.0f, 0.0f );
// rigidbody is dynamic if is non zero
if( mass != 0.0f ) {
obj->collisionShape->calculateLocalInertia( mass, localInertia );
}
btRigidBody::btRigidBodyConstructionInfo rbInfo(
mass, obj->motionState.get(), obj->collisionShape.get(), localInertia );
shared_ptr< agiRigidBody > rigidBody( new agiRigidBody( rbInfo ) );
rigidBody->Init( obj );
// add to dynamics world
imp->dynamicsWorld->addRigidBody( rigidBody.get() );
// set pointer in data object
obj->rigidBody = rigidBody;
// scale
btVector3 bulletScale;
bulletScale.setX( obj->scale.x() );
bulletScale.setY( obj->scale.y() );
bulletScale.setZ( obj->scale.z() );
rigidBody->getCollisionShape()->setLocalScaling( bulletScale );
I didn't know I had to initialise localInertia. Most vectors I work with default to 0.0.
I was relying on similar code elsewhere and then when I changed over to this code I had to track that error down. Grr. For three hours I had things falling through my ground for no good reason. Yeah, I need to learn more about physics and the physics library I'm using.
No comments:
Post a Comment