The code (these are all functions of one class) :
Dynamics world initialization
Code: Select all
bullet_CollisionConfig = new btDefaultCollisionConfiguration();
bullet_Dispatcher = new btCollisionDispatcher(bullet_CollisionConfig);
bullet_Broadphase = new btDbvtBroadphase();
bullet_Solver = new btSequentialImpulseConstraintSolver;
bullet_World = new btDiscreteDynamicsWorld(bullet_Dispatcher, bullet_Broadphase, bullet_Solver, bullet_CollisionConfig);
bullet_World->getDispatchInfo().m_allowedCcdPenetration = 0.0001f;
bullet_World->setGravity(btVector3(0.0f, -30.0f, 0.0f));
Code: Select all
btTransform transform;
transform.setIdentity();
transform.setOrigin(btVector3(_POS.x, _POS.y, _POS.z));
_ghostobject = new btPairCachingGhostObject();
_ghostobject->setWorldTransform(transform);
btConvexShape* capsule = new btCapsuleShape(_RADIUS, _HEIGHT);
_ghostobject->setCollisionShape(capsule);
_ghostobject->setCollisionFlags(btCollisionObject::CF_CHARACTER_OBJECT);
_cameraobject = new btKinematicCharacterController(_ghostobject, capsule, 0.75f);
bullet_World->addCollisionObject(_ghostobject,
btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter);
bullet_World->addAction(_cameraobject);
Code: Select all
if (!_ghostobject || !_cameraobject) return;
//get basic information for movement
btTransform transform = _ghostobject->getWorldTransform();
btVector3 forward = transform.getBasis()[2];
btVector3 up = transform.getBasis()[1];
btVector3 right = transform.getBasis()[0];
forward.normalize();
up.normalize();
right.normalize();
btVector3 walkdirection = btVector3(0.0f, 0.0f, 0.0f);
btScalar walkvelocity = btScalar(1.1f);
btScalar walkspeed = walkvelocity*(timePassed);
//calculate rotation data
if (KeyDown(DIK_A)) //left
{
btMatrix3x3 orientation = _ghostobject->getWorldTransform().getBasis();
orientation *= btMatrix3x3( btQuaternion( btVector3(0, 1, 0), 0.01f ) );
_ghostobject->getWorldTransform().setBasis(orientation);
} else if (KeyDown(DIK_D)) { //right
btMatrix3x3 orientation = _ghostobject->getWorldTransform().getBasis();
orientation *= btMatrix3x3( btQuaternion( btVector3(0, 1, 0), -0.01f ) );
_ghostobject->getWorldTransform().setBasis(orientation);
}
//calculate forward movement
if (KeyDown(DIK_W)) //forward
walkdirection += forward;
else if (KeyDown(DIK_S)) //back
walkdirection -= forward;
//set data
_cameraobject->setWalkDirection(walkdirection*walkspeed);