0
\$\begingroup\$

I'm using Bullet Physics for Collision Detection in a first person game. The collision basically work fine, I cannot walk through objects. But if I walk against the wall and release the key I get bounced back and automatically move backwards. This is something I do not want. The player should not be bouncing off when walking into a wall, it just shouldn't be possible to pass through it.

Here are some code snippets.

Creating the Player-RigidBody (class Camera):

btCollisionShape* _collisionShape = new btCapsuleShapeZ(0.2f, 1.0f);
btDefaultMotionState* _motionState = new btDefaultMotionState(btTransform(
    btQuaternion(1, 0, 0, 1),
    btVector3(_position.x, _position.y, _position.z)        
    ));
btRigidBody::btRigidBodyConstructionInfo cameraRigidBodyCI(
    10,                 
    _motionState,       
    _collisionShape,    
    btVector3(0, 0, 0)  
    );
_rigidBody = new btRigidBody(cameraRigidBodyCI);
_rigidBody->setActivationState(DISABLE_DEACTIVATION);

Creating the RigidBody of the Walls and other box-objects:

btVector3 rigidBodyPos;
btCollisionShape* collisionShape;
glm::vec3* minMax = getMinMaxVertexCoords();
glm::vec3 minCoords = minMax[0];
glm::vec3 maxCoords = minMax[1];
glm::vec3 middleSize = glm::vec3((maxCoords.x - minCoords.x) / 2, (maxCoords.y - minCoords.y) / 2, (maxCoords.z - minCoords.z) / 2);
glm::vec3 middlePos = glm::vec3((maxCoords.x + minCoords.x) / 2, (maxCoords.y + minCoords.y) / 2, (maxCoords.z + minCoords.z) / 2);

collisionShape = new btBoxShape(btVector3(middleSize.x, middleSize.y, middleSize.z));
rigidBodyPos = btVector3(middlePos.x, middlePos.y, middlePos.z);

btMotionState* motionState = new btDefaultMotionState(btTransform(
    btQuaternion(0, 0, 0, 1),   
    rigidBodyPos                
    ));
btRigidBody::btRigidBodyConstructionInfo* rigidBodyCI = new btRigidBody::btRigidBodyConstructionInfo(
    0,                  
    motionState,
    collisionShape,
    btVector3(0, 0, 0)  
    );
if (_rigidBody != nullptr){
    delete _rigidBody;
    _rigidBody = nullptr;
}
_rigidBody = new btRigidBody(*rigidBodyCI);
_rigidBody->setActivationState(DISABLE_DEACTIVATION);
_rigidBody->setRestitution(0.0f);

The Collision-Detection itself:

dynamicsWorld->updateAabbs();
dynamicsWorld->stepSimulation(1 / 60.f, 10);
//...
btTransform cameraTrans = camera->getRigidBody()->getWorldTransform();
camera->setPosition(glm::vec3(cameraTrans.getOrigin().getX(), cameraTrans.getOrigin().getY(), cameraTrans.getOrigin().getZ()));

How can I change this behaviour?

\$\endgroup\$
  • \$\begingroup\$ I somehow managed to solve it... But honestly, I have no idea how. \$\endgroup\$ – SpiRyu May 4 '16 at 20:12
1
\$\begingroup\$

It's possible the player object moves into a wall and the position is updated, then collision is detected and the players position is then corrected creating a "bouncing" effect. To correct this, compute your collisions prior to moving the player (or probably any object).

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.