// Creates a Box object, including the associated Bullet rigid // body, and sets its collision shape to a bullet box shape. // If the object is specified to be kinematic, then the appropriate setup // is done to the rigid body to make it kinematic within Bullet. // position: where to create the box. // dimensions: the dimensions of the box // density: the density of the box (which, with the dimensions, determines its mass) // isKinematic: flag to determine if this object will be kinematic or not Box::Box(double position[3], double dimensions[3], double density, bool isKinematic) { x = dimensions[0]; y = dimensions[1]; z = dimensions[2]; double mass = x * y * z * density; btCollisionShape* boxCollision = new btBoxShape(btVector3(x * 0.5, y * 0.5, z * 0.5)); btDefaultMotionState* boxState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(position[0], position[1], position[2]))); btVector3 boxInertia(0, 0, 0); boxCollision->calculateLocalInertia(mass, boxInertia); btRigidBody::btRigidBodyConstructionInfo boxInfo(mass, boxState, boxCollision, boxInertia); btRigidBody* rb = new btRigidBody(boxInfo); // set the kinematic flag and set up the rigid body as kinematic if necessary setKinematic(isKinematic); if (isKinematic) { rb->setCollisionFlags(rb->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); rb->setActivationState(DISABLE_DEACTIVATION); } // set the rigid body associated with this SceneObject. setRigidBody(rb); }
PhysicsRigidBody* PhysicsMgr::createRigidBodyMesh(Mesh* mesh, Matrix44* transform) { auto rig = new PhysicsRigidBody(); btScalar mass(0.0f); btTransform startTransform; btTriangleMesh * meshInterface = new btTriangleMesh(); auto idxSize = mesh->getIndicesSize(); for(auto i =0; i < idxSize; i+=3) { auto v1 = mesh->getVertex(i); auto v2 = mesh->getVertex(i + 1); auto v3 = mesh->getVertex(i + 2); meshInterface->addTriangle(btVector3(v1.m_pos.x, v1.m_pos.y, v1.m_pos.z), btVector3(v2.m_pos.x, v2.m_pos.y, v2.m_pos.z), btVector3(v3.m_pos.x, v3.m_pos.y, v3.m_pos.z)); } auto tetraShape = new btBvhTriangleMeshShape(meshInterface, true, true); startTransform.setIdentity(); if (transform) { startTransform.setFromOpenGLMatrix(transform->data()); } auto btRig = shared()->createRigidBodyInternal(mass, startTransform, tetraShape, btVector4(1, 0, 0, 1)); btRig->setContactProcessingThreshold(BT_LARGE_FLOAT); btRig->setFriction (btScalar(0.9)); btRig->setCcdMotionThreshold(.1); btRig->setCcdSweptSphereRadius(0); rig->setRigidBody(btRig); rig->genUserIndex(); btRig->setUserIndex(rig->userIndex()); btRig->setUserPointer(rig); return rig; }
PhysicsRigidBody* PhysicsMgr::createRigidBodyFromCompund(float mass, Matrix44* transform, PhysicsCompoundShape * tzwShape) { auto rig = new PhysicsRigidBody(); bool isDynamic = (mass != 0.f); btVector3 localInertia(0, 0, 0); auto shape = tzwShape->getShape(); if (isDynamic) shape->calculateLocalInertia(mass, localInertia); btTransform startTransform; startTransform.setFromOpenGLMatrix(transform->data()); auto btRig = shared()->createRigidBodyInternal(mass, startTransform, shape, btVector4(1, 0, 0, 1)); rig->setRigidBody(btRig); rig->genUserIndex(); btRig->setUserIndex(rig->userIndex()); btRig->setUserPointer(rig); return rig; }
void gpp::CharacterComponent::createCharacterRigidBody(gep::CharacterRigidBodyCInfo cinfo) { GEP_ASSERT(m_pWorld != nullptr, "The Physics World for of the CharacterComponent on %s has not been set.", m_pParentGameObject->getName().c_str()); GEP_ASSERT(m_pParentGameObject->getComponent<PhysicsComponent>() == nullptr, "The GameObject already has physical behavior. Currently no character can be added. TODO: FIX ME!"); auto physicsComponent = m_pParentGameObject->createComponent<PhysicsComponent>(); auto* physicsSystem = g_globalManager.getPhysicsSystem(); auto* physicsFactory = physicsSystem->getPhysicsFactory(); m_pCharacterRigidBody = physicsFactory->createCharacterRigidBody(cinfo); m_pCharacterRigidBody->initialize(); //Note: The world is taking ownership of the rigid body here. m_pWorld->addCharacter(m_pCharacterRigidBody.get()); physicsComponent->setRigidBody(m_pCharacterRigidBody->getRigidBody()); }
PhysicsRigidBody * PhysicsMgr::createRigidBodyCylinder(float massValue, float topRadius, float bottomRadius, float height, Matrix44 transform) { auto rig = new PhysicsRigidBody(); btScalar mass(massValue); btTransform startTransform; startTransform.setIdentity(); bool isDynamic = (mass != 0.f); btCylinderShape* colShape = new btCylinderShapeZ(btVector3(topRadius, bottomRadius, height * 0.5)); btVector3 localInertia(0, 0, 0); if (isDynamic) { colShape->calculateLocalInertia(mass, localInertia); } startTransform.setFromOpenGLMatrix(transform.data()); auto btRig = shared()->createRigidBodyInternal(mass, startTransform, colShape, btVector4(1, 0, 0, 1)); rig->setRigidBody(btRig); rig->genUserIndex(); btRig->setUserIndex(rig->userIndex()); btRig->setUserPointer(rig); return rig; }
PhysicsRigidBody* PhysicsMgr::createRigidBody(float massValue, Matrix44& transform, AABB& aabb) { auto rig = new PhysicsRigidBody(); btScalar mass(massValue); btTransform startTransform; startTransform.setIdentity(); bool isDynamic = (mass != 0.f); vec3 half = aabb.half(); btBoxShape* colShape = shared()->createBoxShape(btVector3(half.x, half.y, half.z)); btVector3 localInertia(0, 0, 0); if (isDynamic) { colShape->calculateLocalInertia(mass, localInertia); } startTransform.setFromOpenGLMatrix(transform.data()); auto btRig = shared()->createRigidBodyInternal(mass, startTransform, colShape, btVector4(1, 0, 0, 1)); rig->setRigidBody(btRig); rig->genUserIndex(); btRig->setUserIndex(rig->userIndex()); btRig->setUserPointer(rig); return rig; }