Hi,
So I Created my world, my collisionShapes, my rigidBodies,... and we can see it with debugDrawer. It works but when I move my character towards an another object, a tree for exemple, my character penetrate inside it. why ? Bullet doesn't have to stop the character when there is contact ? or it's to me to code that ? I thought that when I create rigidBodies in a same world, Bullet works alone and stop when there is collision between entities... Can you explain to me what i have to do ?
sorry i'm french
Collisions aren't automatic ?
-
- Posts: 849
- Joined: Tue Sep 30, 2014 6:03 pm
- Location: San Francisco
Re: Collisions aren't automatic ?
Yes, the character should collide with the tree automatically by default. There must be a bug in your program, but you have not supplied enough information for us to figure out why. You would have to supply some code or a more detailed description of how you build/move the character and tree. Some questions that come to mind:
(1) How does the character move? Are you using btKinematicCharacterController or something else?
(2) What shape types are being used for the tree and character?
(1) How does the character move? Are you using btKinematicCharacterController or something else?
(2) What shape types are being used for the tree and character?
-
- Posts: 24
- Joined: Tue Sep 22, 2015 1:34 pm
Re: Collisions aren't automatic ?
thank you for reply
I use ogreBullet.
For the tree I use a triangleMeshShape
I use ogreBullet.
So for my character i use a collisionBox(2) What shape types are being used for the tree and character?
Code: Select all
AxisAlignedBox boundingB = mPJ->mEntityCorps->getBoundingBox();
Vector3 size = boundingB.getSize(); //size /= 2.0f; // only the half needed
//size *= 0.96f; // Bullet margin is a bit bigger so we need a smaller size
// (Bullet 2.76 Physics SDK Manual page 18)
// after that create the Bullet shape with the calculated size
OgreBulletCollisions::BoxCollisionShape *sceneBoxShape = new OgreBulletCollisions::BoxCollisionShape(size);
defaultBody = new OgreBulletDynamics::RigidBody("defaultBoxRigid2",mWorld);
defaultBody->setShape(mPJ->mNode,
sceneBoxShape,
0.6f, // dynamic body restitution
0.6f, // dynamic body friction
70.0f, // dynamic bodymass
Ogre::Vector3(mPJ->mNode->getPosition().x, mPJ->mNode->getPosition().y, mPJ->mNode->getPosition().z), // starting position of the box
mPJ->mNode ->getOrientation()) ;// orientation of the box
defaultBody->enableActiveState();
mWorld->addRigidBody(defaultBody, 0, 0);
Code: Select all
// collisionShape
AxisAlignedBox boundingB = mSceneMgr->getEntity("Arbre0")->getBoundingBox();
Vector3 size = mSceneMgr->getEntity("Arbre0")->getBoundingBox().getSize(); //size /= 2.0f; // only the half needed
//size *= 0.96f; // Bullet margin is a bit bigger so we need a smaller size
// (Bullet 2.76 Physics SDK Manual page 18)
SceneNode *node = mSceneMgr->getEntity("Arbre0")->getParentSceneNode();
OgreBulletCollisions::StaticMeshToShapeConverter *smtsc = new OgreBulletCollisions::StaticMeshToShapeConverter();
smtsc->addEntity(mSceneMgr->getEntity("Arbre0"));
OgreBulletCollisions::TriangleMeshCollisionShape *collisionShape = smtsc->createTrimesh();
//RigidBody
OgreBulletDynamics::RigidBody *defaultBody = new OgreBulletDynamics::RigidBody("defaultBoxRigid",mWorld);
defaultBody->setShape(node,
collisionShape,
0.6f, // dynamic body restitution
0.6f, // dynamic body friction
0.0f, // dynamic bodymass
Ogre::Vector3(node->getPosition()), // starting position of the box
Quaternion(180, 0, 0, 1));// orientation of the box
defaultBody->enableActiveState();
mWorld->addRigidBody(defaultBody,0,0);
I use Ogre to move my character ? I did'nt know btKinematicCharacterController.(1) How does the character move? Are you using btKinematicCharacterController or something else?
-
- Posts: 24
- Joined: Tue Sep 22, 2015 1:34 pm
Re: Collisions aren't automatic ?
I tried Kinematic Object for my character with
but I penetrate inside this tree. I don't understand.
Code: Select all
defaultBody->setKinematicObject(true);
defaultBody->disableDeactivation();
-
- Posts: 849
- Joined: Tue Sep 30, 2014 6:03 pm
- Location: San Francisco
Re: Collisions aren't automatic ?
A "kinematic" object is movable but moves in a non-physical way. That is, its motion is defined by some external source that is independent from the physics dynamics. Hence, kinematic will pass right through other kinematic and static objects... if the code that dictates their motion says they do. You know those platforms that move around in scrollers and various level-games? You can bounce dynamic objects off of them but you can't stop their motion -- it is determined by some script. Those are "kinematic" objects.
A "kinematic character controller" moves the character around kinematically, but also provides some collision detection and changes the kinematic motion accordingly. That is what you want to use.
A little research online reveals this Ogre forums post about how to do it. I followed the link to the tutorial and looked it over. The character's collision logic happens in the CharacterController_Physics class which appears to be a slightly modified version of btKinematicCharacterController.
Note: the btKinematicCharacterController class in the Bullet API is rather buggy. I don't view it as a proper part of the API but as a Demo class that was accidentally added to the API side. I wouldn't recommend using it, but you might try to understand what its doing and then write your own. Alternatively you could look a bit harder than I did an try to find other character controller implementations for Ogre.
A "kinematic character controller" moves the character around kinematically, but also provides some collision detection and changes the kinematic motion accordingly. That is what you want to use.
A little research online reveals this Ogre forums post about how to do it. I followed the link to the tutorial and looked it over. The character's collision logic happens in the CharacterController_Physics class which appears to be a slightly modified version of btKinematicCharacterController.
Note: the btKinematicCharacterController class in the Bullet API is rather buggy. I don't view it as a proper part of the API but as a Demo class that was accidentally added to the API side. I wouldn't recommend using it, but you might try to understand what its doing and then write your own. Alternatively you could look a bit harder than I did an try to find other character controller implementations for Ogre.