void CBulletWorld::initialize() { broadphase = new btDbvtBroadphase(); collisionConfiguration = new btDefaultCollisionConfiguration(); dispatcher = new btCollisionDispatcher(collisionConfiguration); solver = new btSequentialImpulseConstraintSolver; mWorld = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration); mWorld->setGravity(btVector3(0, -10, 0)); groundShape = new btStaticPlaneShape(btVector3(0, 1, 0), 1); ballShape = new btSphereShape(1); groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, -1, 0))); btRigidBody::btRigidBodyConstructionInfo groundRigidBodyCI(0, groundMotionState, groundShape, btVector3(0, 0, 0)); groundRigidBody = new btRigidBody(groundRigidBodyCI); groundRigidBody->setRestitution(1.0); mWorld->addRigidBody(groundRigidBody); ballMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, 50, 0))); btScalar mass = 1; btVector3 ballInertia(0, 0, 0); ballShape->calculateLocalInertia(mass, ballInertia); btRigidBody::btRigidBodyConstructionInfo ballRigidBodyCI(mass, ballMotionState, ballShape, ballInertia); ballRigidBody = new btRigidBody(ballRigidBodyCI); ballRigidBody->setRestitution(1.0); mWorld->addRigidBody(ballRigidBody); }
/** * links up the class with bullet * note that this cannot be called before renderObject */ void Ball::initializeBullet(btDiscreteDynamicsWorld* dynamicsWorld) { if (ballNode == NULL) { return; } ballPosition = ballNode->getPosition(); btVector3 position(ballPosition.x, ballPosition.y, ballPosition.z); ballShape = new btSphereShape(ballRadius); ballMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), position)); btScalar mass = 100; //btVector3 ballInertia(0, 0, 0); //ballShape->calculateLocalInertia(mass, ballInertia); btRigidBody::btRigidBodyConstructionInfo ballRigidBodyCI(mass, ballMotionState, ballShape); ballRigidBody = new btRigidBody(ballRigidBodyCI); ballRigidBody->setRestitution(1.0f); srand(time(NULL)); btVector3 direction(10.0f * (rand() * 1.0f / RAND_MAX), 10.0f * (rand() * 1.0f / RAND_MAX), 10.0f * (rand() * 1.0f / RAND_MAX)); ballRigidBody->setLinearVelocity(direction); dynamicsWorld->addRigidBody(ballRigidBody); }