I am a newbie at Bullet Physics here and I am attempting to set up collisions between a KinematicCharacterController and Static mesh that I have loaded in my Physics world.
The ultimate goal is that I can have a character that can walk through the environment.
Currently my KinematicCharacterController object in the Physics world "falls through" everything in the 3D environment regardless of what I have set up. I attempted to follow the Character Demo and documentation closely but I am not sure if I missed something.
Thanks to previous help on this forum and the Debug Drawer I know that the following code below for loading my static mesh works as I can see the lines drawn for this custom mesh.
But first, here is my collision mask setup:
Code: Select all
enum CollisionTypes {
COLL_NOTHING = 0,
COLL_PERSON = 1,
COLL_WALLS = 2,
COLL_MARKERS = 4
};
short WhatWallsCollideWith, WhatPersonCollidesWith, WhatMarkersCollidesWith;
WhatWallsCollideWith = CollisionTypes::COLL_PERSON | CollisionTypes::COLL_MARKERS;
WhatPersonCollidesWith = CollisionTypes::COLL_WALLS | CollisionTypes::COLL_MARKERS;
WhatMarkersCollidesWith = CollisionTypes::COLL_PERSON | CollisionTypes::COLL_WALLS;
Code: Select all
void PhysicsController::AddStaticBasicMesh(PhysicsObject* NewObject, bool ReducePolygonCount = true)
{
btTriangleIndexVertexArray* meshInterface = new btTriangleIndexVertexArray();
btIndexedMesh* NewMesh = new btIndexedMesh();
NewMesh->m_triangleIndexBase = (const unsigned char *)NewObject->Indices;
NewMesh->m_triangleIndexStride = 3 * sizeof(unsigned int);
NewMesh->m_vertexBase = (const unsigned char *)NewObject->Vertices;
NewMesh->m_vertexStride = 3 * sizeof(float);
NewMesh->m_numVertices = NewObject->NumberOfVertices;
NewMesh->m_numTriangles = NewObject->NumberOfTriangles;
NewMesh->m_indexType = PHY_INTEGER;
meshInterface->addIndexedMesh((*NewMesh), PHY_INTEGER);
bool useQuantizedAabbCompression = true;
btBvhTriangleMeshShape* trimeshShape = new btBvhTriangleMeshShape(meshInterface, useQuantizedAabbCompression);
if (ReducePolygonCount == true) {
StaticShapes.push_back(trimeshShape);
btDefaultMotionState* StaticMotionState = new btDefaultMotionState((*NewObject->PositionAndOrientation));
btRigidBody::btRigidBodyConstructionInfo StaticMeshRigidBodyInfo(0, StaticMotionState, trimeshShape, btVector3(0.0f, 0.0f, 0.0f));
btRigidBody* StaticRigidMesh = new btRigidBody(StaticMeshRigidBodyInfo);
NewObject->Body = StaticRigidMesh;
StaticRigidMesh->setCollisionFlags(StaticRigidMesh->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT);
MainPhysicsWorld->addRigidBody(StaticRigidMesh, CollisionTypes::COLL_WALLS, WhatWallsCollideWith);
AllRigidBodies.push_back(NewObject);
StaticRigidMesh->setUserPointer(AllRigidBodies[AllRigidBodies.size() - 1]);
} else {
StaticShapes.push_back(trimeshShape);
btDefaultMotionState* StaticMotionState = new btDefaultMotionState((*NewObject->PositionAndOrientation));
btRigidBody::btRigidBodyConstructionInfo StaticMeshRigidBodyInfo(0, StaticMotionState, trimeshShape, btVector3(0.0f, 0.0f, 0.0f));
btRigidBody* StaticRigidMesh = new btRigidBody(StaticMeshRigidBodyInfo);
NewObject->Body = StaticRigidMesh;
StaticRigidMesh->setCollisionFlags(StaticRigidMesh->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT);
MainPhysicsWorld->addRigidBody(StaticRigidMesh, CollisionTypes::COLL_WALLS, WhatWallsCollideWith);
AllRigidBodies.push_back(NewObject);
StaticRigidMesh->setUserPointer(AllRigidBodies[AllRigidBodies.size() - 1]);
}
}
Code: Select all
unsigned int PhysicsController::AddCameraCapsule(PhysicsObject* NewObject, float WeightOfPerson,
btScalar RadiusOfCapsule, btScalar HeightOfCapsule, btScalar StepHeight)
{
if (PhysicsCameraInitialized == false) {
btPairCachingGhostObject* NewCameraController = new btPairCachingGhostObject();
NewCameraController->setWorldTransform((*NewObject->PositionAndOrientation));
btVector3 FallingInertia = btVector3(0.0f, 0.0f, 0.0f);
btConvexShape* NewCameraCapsule = new btCapsuleShape(RadiusOfCapsule, HeightOfCapsule);
btDefaultMotionState* CameraMotionState = new btDefaultMotionState((*NewObject->PositionAndOrientation));
NewCameraCapsule->calculateLocalInertia(WeightOfPerson, FallingInertia);
btRigidBody::btRigidBodyConstructionInfo CameraCapsuleRigidBodyInfo(WeightOfPerson, CameraMotionState, NewCameraCapsule, FallingInertia);
NewCameraController->setCollisionShape(NewCameraCapsule);
NewCameraController->setCollisionFlags(NewCameraController->getCollisionFlags() | btCollisionObject::CF_CHARACTER_OBJECT);
StaticShapes.push_back(NewCameraCapsule);
NewObject->Body = NewCameraController;
MainPhysicsWorld->addCollisionObject(NewCameraController, CollisionTypes::COLL_PERSON, WhatPersonCollidesWith);
AllRigidBodies.push_back(NewObject);
unsigned int PointerToCamera = 0;
PointerToCamera = AllRigidBodies.size() - 1;
NewCameraController->setUserPointer(AllRigidBodies[PointerToCamera]);
MainKinematicCharacter = new btKinematicCharacterController(NewCameraController,
NewCameraCapsule, StepHeight);
//MainKinematicCharacter->setUseGhostSweepTest(false);
MainPhysicsWorld->addAction(MainKinematicCharacter);
PhysicsCameraInitialized = true;
return PointerToCamera;
} else {
return 0;
}
}
Code: Select all
MainBroadPhase = new btDbvtBroadphase();
MainCollisionConfiguration = new btDefaultCollisionConfiguration();
MainDispatcher = new btCollisionDispatcher(MainCollisionConfiguration);
MainPhysicsSolver = new btSequentialImpulseConstraintSolver;
MainPhysicsWorld = new btDiscreteDynamicsWorld(MainDispatcher, MainBroadPhase,
MainPhysicsSolver, MainCollisionConfiguration);
MainPhysicsWorld->setGravity(btVector3(0, -9.81f, 0));
MainPhysicsWorld->getDispatchInfo().m_allowedCcdPenetration = 0.0001f;
gContactAddedCallback = CollisionCallBack;
Code: Select all
bool PhysicsController::CollisionCallBack(btManifoldPoint& cp, const btCollisionObjectWrapper* obj1, int id1, int index1, const btCollisionObjectWrapper* obj2, int id2, int index2)
{
std::ofstream MainDebugFile;
std::string EndLine = "\n";
std::string PhysicsErrorWarningString;
PhysicsErrorWarningString = "Collision occured!";
PhysicsErrorWarningString += EndLine;
std::streamsize sizeofPhysicsErrorWarningString = PhysicsErrorWarningString.length();
MainDebugFile.open("C:\PhysicsErrorsWarnings.txt", std::ios_base::app);
MainDebugFile.write(PhysicsErrorWarningString.c_str(), sizeofPhysicsErrorWarningString);
MainDebugFile.close();
return false;
}
Thank you in advance for your time.