PhysicalObject* PhysicsSim::applyPhysics(SceneObject* object, Shape shape, float mass) { PhysicalObject* phyObject; switch(shape) { case shSphere: phyObject = new Sphere(object, mass); break; case shBox: phyObject = new Box(object, mass); break; case shCapsule: phyObject = new Capsule(object, mass); break; case shCylinder: phyObject = new Cylinder(object, mass); break; case shCone: phyObject = new Cone(object, mass); break; case shConvexHull: phyObject = new ConvexHull(object, mass); break; case shTriMesh: phyObject = new TriMesh(object, mass); break; } objects_list.push_back(phyObject); dynamicsWorld->addRigidBody(phyObject->getRigidBody()); updateObjects(); return phyObject; }
void PhysicsSim::shootTestSphere() { removeObject(testSphere); testSphere = loadSceneObject("lemon.dae"); testSphere->setPosition(fpscam->getPosition()); testSphere->setScale(Vector3D(2,2,2)); PhysicalObject* phyObj = applyPhysics(testSphere, shSphere, 20); vector3df dir = fpscam->getTarget() - fpscam->getPosition(); dir = 250*dir.normalize(); phyObj->getRigidBody()->applyCentralImpulse(btVector3(dir.X, dir.Y, dir.Z)); }
bool PhysicsSim::loadPhysicalObjects(PhysicalStructure &structure, stringc mesh_filename, Vector3D position, bool lock2d) { stringc physics_filename = mesh_filename; physics_filename.remove(".dae"); physics_filename.append(".bullet"); physics_filename = mediaDirectory + physics_filename; if(smgr->getFileSystem()->existFile(physics_filename)) { stringw collada_filename = smgr->getFileSystem()->getAbsolutePath(mediaDirectory) + mesh_filename; if(smgr->getFileSystem()->existFile(collada_filename)) { btBlenderImporter* fileLoader = new btBlenderImporter(position); fileLoader->loadFile(physics_filename.c_str()); smgr->getMesh(collada_filename); for(int i = 0; i < fileLoader->getNumRigidBodies(); i++) { btRigidBody* rb = (btRigidBody*)fileLoader->getRigidBodyByIndex(i); if(lock2d) { rb->setLinearFactor(btVector3(1,0,1)); rb->setAngularFactor(btVector3(0,1,0)); } stringc meshname(fileLoader->getNameForPointer(rb)); stringc bodyname = meshname; stringc tex_file = meshname; s32 underline = tex_file.findFirst('_'); if(underline < 0) underline = tex_file.findFirst('.'); if(underline > -1) tex_file = tex_file.subString(0, underline+1); tex_file = mediaDirectory + tex_file + ".jpg"; if(fileLoader->getNumRigidBodies() > 1) meshname = collada_filename + "#" + meshname + "-mesh"; else meshname = collada_filename; IAnimatedMesh *mesh = smgr->getMeshCache()->getMeshByName(meshname); if(mesh){ IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh, smgr->getRootSceneNode()); node->setMaterialFlag(EMF_LIGHTING, true); node->setMaterialFlag(EMF_TEXTURE_WRAP, false); node->setMaterialFlag(EMF_BACK_FACE_CULLING, false); node->addShadowVolumeSceneNode(0,-1,false); if(smgr->getFileSystem()->existFile(tex_file)) { node->setMaterialTexture(0, driver->getTexture(tex_file)); } PhysicalObject* pobj = new PhysicalObject(node, rb, bodyname); objects_list.push_back(pobj); structure.bodies.push_back(pobj); dynamicsWorld->addRigidBody(pobj->getRigidBody()); } } for(int i = 0; i < fileLoader->getNumConstraints(); i++) { Joint* jt = new Joint(fileLoader->getConstraintByIndex(i)); joints_list.push_back(jt); structure.joints.push_back(jt); btTypedConstraint* constr = jt->getConstraint(); dynamicsWorld->addConstraint(constr, true); } delete fileLoader; updateObjects(); return true; } } return false; }