int main() { btDefaultCollisionConfiguration *collisionConfiguration = new btDefaultCollisionConfiguration(); btCollisionDispatcher *dispatcher = new btCollisionDispatcher(collisionConfiguration); btBroadphaseInterface *overlappingPairCache = new btDbvtBroadphase(); btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver; btDiscreteDynamicsWorld *dynamicsWorld = new btDiscreteDynamicsWorld( dispatcher, overlappingPairCache, solver, collisionConfiguration); dynamicsWorld->setGravity(btVector3(0, gravity, 0)); dynamicsWorld->setInternalTickCallback(myTickCallback); btAlignedObjectArray<btCollisionShape*> collisionShapes; // Ground. { btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0, 0, 0)); btCollisionShape* groundShape; #if 0 // x / z plane at y = -1 (not 0 to compensate the radius of the falling object). groundShape = new btStaticPlaneShape(btVector3(groundXNormal, 1, 0), -1); #else // A cube of width 10 at y = -6 (upper surface at -1). // Does not fall because we won't call: // colShape->calculateLocalInertia // TODO: remove this from this example into a collision shape example. groundTransform.setOrigin(btVector3(-5, -6, 0)); groundShape = new btBoxShape( btVector3(btScalar(5.0), btScalar(5.0), btScalar(5.0))); #endif collisionShapes.push_back(groundShape); btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); btRigidBody::btRigidBodyConstructionInfo rbInfo(0, myMotionState, groundShape, btVector3(0, 0, 0)); btRigidBody* body = new btRigidBody(rbInfo); body->setRestitution(groundRestitution); dynamicsWorld->addRigidBody(body); } // Object. { btCollisionShape *colShape; #if 0 colShape = new btSphereShape(btScalar(1.0)); #else // Because of numerical instabilities, the cube bumps all over, // moving on the x and z directions as well as y. colShape = new btBoxShape( btVector3(btScalar(1.0), btScalar(1.0), btScalar(1.0))); #endif collisionShapes.push_back(colShape); btTransform startTransform; startTransform.setIdentity(); startTransform.setOrigin(btVector3(initialX, initialY, initialZ)); btVector3 localInertia(0, 0, 0); btScalar mass(1.0f); colShape->calculateLocalInertia(mass, localInertia); btDefaultMotionState *myMotionState = new btDefaultMotionState(startTransform); btRigidBody *body = new btRigidBody(btRigidBody::btRigidBodyConstructionInfo( mass, myMotionState, colShape, localInertia)); body->setRestitution(objectRestitution); body->setLinearVelocity(btVector3(initialLinearVelocityX, initialLinearVelocityY, initialLinearVelocityZ)); dynamicsWorld->addRigidBody(body); } // Main loop. std::printf(COMMON_PRINTF_HEADER " collision a b normal\n"); for (std::remove_const<decltype(nSteps)>::type step = 0; step < nSteps; ++step) { dynamicsWorld->stepSimulation(timeStep); auto nCollisionObjects = dynamicsWorld->getNumCollisionObjects(); for (decltype(nCollisionObjects) objectIndex = 0; objectIndex < nCollisionObjects; ++objectIndex) { btRigidBody *body = btRigidBody::upcast(dynamicsWorld->getCollisionObjectArray()[objectIndex]); commonPrintBodyState(body, step, objectIndex); auto& manifoldPoints = objectsCollisions[body]; if (manifoldPoints.empty()) { std::printf("0 "); } else { std::printf("1 "); for (auto& pt : manifoldPoints) { std::vector<btVector3> data; data.push_back(pt->getPositionWorldOnA()); data.push_back(pt->getPositionWorldOnB()); data.push_back(pt->m_normalWorldOnB); for (auto& v : data) { std::printf( COMMON_PRINTF_FLOAT " " COMMON_PRINTF_FLOAT " " COMMON_PRINTF_FLOAT " ", v.getX(), v.getY(), v.getZ() ); } } } std::printf("\n"); } } // Cleanup. for (int i = dynamicsWorld->getNumCollisionObjects() - 1; i >= 0; --i) { btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[i]; btRigidBody* body = btRigidBody::upcast(obj); if (body && body->getMotionState()) { delete body->getMotionState(); } dynamicsWorld->removeCollisionObject(obj); delete obj; } for (int i = 0; i < collisionShapes.size(); ++i) { delete collisionShapes[i]; } delete dynamicsWorld; delete solver; delete overlappingPairCache; delete dispatcher; delete collisionConfiguration; collisionShapes.clear(); }
int main() { btDefaultCollisionConfiguration *collisionConfiguration = new btDefaultCollisionConfiguration(); btCollisionDispatcher *dispatcher = new btCollisionDispatcher(collisionConfiguration); btBroadphaseInterface *overlappingPairCache = new btDbvtBroadphase(); btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver; btDiscreteDynamicsWorld *dynamicsWorld = new btDiscreteDynamicsWorld( dispatcher, overlappingPairCache, solver, collisionConfiguration); dynamicsWorld->setGravity(btVector3(0, gravity, 0)); dynamicsWorld->setInternalTickCallback(myTickCallback); btAlignedObjectArray<btCollisionShape*> collisionShapes; // Object0 { btCollisionShape *colShape; #if 0 colShape = new btSphereShape(btScalar(1.0)); #else // Because of numerical instabilities, the cube bumps all over, // moving on the x and z directions as well as y. colShape = new btBoxShape( btVector3(btScalar(1.0), btScalar(1.0), btScalar(1.0))); #endif collisionShapes.push_back(colShape); btTransform startTransform; startTransform.setIdentity(); startTransform.setOrigin(btVector3(initialX, initialY, initialZ)); btVector3 localInertia(0, 0, 0); btScalar mass(1.0f); colShape->calculateLocalInertia(mass, localInertia); btDefaultMotionState *myMotionState = new btDefaultMotionState(startTransform); btRigidBody *body = new btRigidBody(btRigidBody::btRigidBodyConstructionInfo( mass, myMotionState, colShape, localInertia)); body->setRestitution(objectRestitution); body->setLinearVelocity(btVector3(initialLinearVelocityX, initialLinearVelocityY, initialLinearVelocityZ)); body->setAngularVelocity(btVector3(initialAngularVelocityX, initialAngularVelocityY, initialAngularVelocityZ)); dynamicsWorld->addRigidBody(body); } // Object1 { btCollisionShape *colShape; #if 0 colShape = new btSphereShape(btScalar(1.0)); #else // Because of numerical instabilities, the cube bumps all over, // moving on the x and z directions as well as y. colShape = new btBoxShape( btVector3(btScalar(1.0), btScalar(1.0), btScalar(1.0))); #endif collisionShapes.push_back(colShape); btTransform startTransform; startTransform.setIdentity(); startTransform.setOrigin(btVector3(initialX, initialY, initialZ)); btVector3 localInertia(0, 0, 0); btScalar mass(1.0f); colShape->calculateLocalInertia(mass, localInertia); btDefaultMotionState *myMotionState = new btDefaultMotionState(startTransform); btRigidBody *body = new btRigidBody(btRigidBody::btRigidBodyConstructionInfo( mass, myMotionState, colShape, localInertia)); body->setRestitution(objectRestitution); body->setLinearVelocity(btVector3(initialLinearVelocityX, initialLinearVelocityY, initialLinearVelocityZ)); body->setAngularVelocity(btVector3(initialAngularVelocityX, initialAngularVelocityY, initialAngularVelocityZ)); dynamicsWorld->addRigidBody(body); } // Main loop. std::printf(COMMON_PRINTF_HEADER "\n"); for (std::remove_const<decltype(nSteps)>::type step = 0; step < nSteps; ++step) { dynamicsWorld->stepSimulation(timeStep); auto nCollisionObjects = dynamicsWorld->getNumCollisionObjects(); for (decltype(nCollisionObjects) objectIndex = 0; objectIndex < nCollisionObjects; ++objectIndex) { btRigidBody *body = btRigidBody::upcast(dynamicsWorld->getCollisionObjectArray()[objectIndex]); commonPrintBodyState(body, step, objectIndex); } std::printf("\n"); } // Cleanup. for (int i = dynamicsWorld->getNumCollisionObjects() - 1; i >= 0; --i) { btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[i]; btRigidBody* body = btRigidBody::upcast(obj); if (body && body->getMotionState()) { delete body->getMotionState(); } dynamicsWorld->removeCollisionObject(obj); delete obj; } for (int i = 0; i < collisionShapes.size(); ++i) { delete collisionShapes[i]; } delete dynamicsWorld; delete solver; delete overlappingPairCache; delete dispatcher; delete collisionConfiguration; collisionShapes.clear(); }
int main() { btDefaultCollisionConfiguration *collisionConfiguration = new btDefaultCollisionConfiguration(); btCollisionDispatcher *dispatcher = new btCollisionDispatcher(collisionConfiguration); btBroadphaseInterface *overlappingPairCache = new btDbvtBroadphase(); btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver; btDiscreteDynamicsWorld *dynamicsWorld = new btDiscreteDynamicsWorld( dispatcher, overlappingPairCache, solver, collisionConfiguration); dynamicsWorld->setGravity(btVector3(0, gravity, 0)); dynamicsWorld->setInternalTickCallback(myTickCallback); btAlignedObjectArray<btCollisionShape*> collisionShapes; // Ground. { btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0, 0, 0)); btCollisionShape* groundShape; groundShape = new btStaticPlaneShape(btVector3(0, 1, 0), -1); collisionShapes.push_back(groundShape); btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); btRigidBody::btRigidBodyConstructionInfo rbInfo(0, myMotionState, groundShape, btVector3(0, 0, 0)); btRigidBody* body = new btRigidBody(rbInfo); body->setRestitution(groundRestitution); dynamicsWorld->addRigidBody(body); } // Objects. std::vector<btRigidBody*> objects; for (size_t i = 0; i < nObjects; ++i) { btCollisionShape *colShape; colShape = new btSphereShape(btScalar(1.0)); collisionShapes.push_back(colShape); btTransform startTransform; startTransform.setIdentity(); startTransform.setOrigin(btVector3(initialXs[i], initialYs[i], 0)); btVector3 localInertia(0, 0, 0); btScalar mass(1.0f); colShape->calculateLocalInertia(mass, localInertia); btDefaultMotionState *myMotionState = new btDefaultMotionState(startTransform); btRigidBody *body = new btRigidBody(btRigidBody::btRigidBodyConstructionInfo( mass, myMotionState, colShape, localInertia)); body->setRestitution(objectRestitution); dynamicsWorld->addRigidBody(body); objects.push_back(body); } // Main loop. std::printf(COMMON_PRINTF_HEADER " collision1 collision2\n"); for (std::remove_const<decltype(nSteps)>::type step = 0; step < nSteps; ++step) { dynamicsWorld->stepSimulation(timeStep); auto nCollisionObjects = dynamicsWorld->getNumCollisionObjects(); for (std::remove_const<decltype(nCollisionObjects)>::type objectIndex = 0; objectIndex < nCollisionObjects; ++objectIndex) { btRigidBody *body = btRigidBody::upcast(dynamicsWorld->getCollisionObjectArray()[objectIndex]); commonPrintBodyState(body, step, objectIndex); // We could use objects[i] here to check for one of the objects we've created. auto manifoldPoints = objectsCollisions[body]; if (manifoldPoints.empty()) { std::printf("0"); } else { std::printf("1"); } std::printf("\n"); } } // Cleanup. for (int i = dynamicsWorld->getNumCollisionObjects() - 1; i >= 0; --i) { btCollisionObject *obj = dynamicsWorld->getCollisionObjectArray()[i]; btRigidBody *body = btRigidBody::upcast(obj); if (body && body->getMotionState()) { delete body->getMotionState(); } dynamicsWorld->removeCollisionObject(obj); delete obj; } for (int i = 0; i < collisionShapes.size(); ++i) { delete collisionShapes[i]; } delete dynamicsWorld; delete solver; delete overlappingPairCache; delete dispatcher; delete collisionConfiguration; collisionShapes.clear(); }