void BasicDemo::initPhysics() { setTexturing(true); setShadows(false); setCameraDistance(btScalar(100.)); // _app = new QApplication(myargc,myargv); /* this function ( in src/coordinator/coordinator/coorcinator.cpp ) * creates 4 wheels, one robot's body and merges them together. * * */ m_wheelShape = new btCylinderShapeX(btVector3(1,3,3)); m_dynamicsWorld =(cdn->getPhysicalCalculatorInstance()).getScene(); //cdn->getPhysicalCalculatorInstance().simple_scene_walls(200); //Mesh::buildBox(QVector3D(10,10,10), 1000, PositionData(0,30,0,0,0,0)); /* pc->simple_scene_walls(100); */ //m_dynamicsWorld = cdn->getPhysicalCalculatorScene(); /*_robot = new Robot(pc->addBox(btVector3(2,0.5,2), btVector3(0,0,0), 8), pc->getScene()); pc->getScene()->addVehicle(_robot);*/ // _MD = new Wheel(_robot, btVector3(1.5,-0.1,0),btVector3(0,-1,0),.5,true); // _MG = new Wheel(_robot, btVector3(-1.5,-0.1,0),btVector3(0,-1,0),.5,true); // _ED = new Wheel(_robot, btVector3(1.9,-0.1,0),btVector3(0,-1,0),.5,false); // _EG = new Wheel(_robot, btVector3(-1.9,-0.1,0),btVector3(0,-1,0),.5,false); }
void BenchmarkDemo::createTest7() { createTest6(); setCameraDistance(btScalar(150.)); initRays(); }
void GpuDemo::initPhysics(const ConstructionInfo& ci) { setTexturing(true); setShadows(false); setCameraDistance(btScalar(SCALING*250.)); ///collision configuration contains default setup for memory, collision setup if (ci.useOpenCL) { m_dynamicsWorld = new btGpuDynamicsWorld(ci.preferredOpenCLPlatformIndex,ci.preferredOpenCLDeviceIndex); } else { m_dynamicsWorld = new btCpuDynamicsWorld(); } m_dynamicsWorld->setGravity(btVector3(0,-10,0)); ///create a few basic rigid bodies setupScene(ci); }
void BenchmarkDemo::createTest3() { setCameraDistance(btScalar(50.)); int size = 16; float sizeX = 1.f; float sizeY = 1.f; //int rc=0; btScalar scale(3.5); btVector3 pos(0.0f, sizeY, 0.0f); while(size) { float offset = -size * (sizeX * 6.0f) * 0.5f; for(int i=0;i<size;i++) { pos[0] = offset + (float)i * (sizeX * 6.0f); RagDoll* ragDoll = new RagDoll (m_dynamicsWorld,pos,scale); m_ragdolls.push_back(ragDoll); } offset += sizeX; pos[1] += (sizeY * 7.0f); pos[2] -= sizeX * 2.0f; size--; } }
void PendulumApplication::initPhysics() { setCameraDistance(8.); m_debugMode |= btIDebugDraw::DBG_NoHelpText; ///register some softbody collision algorithms on top of the default btDefaultCollisionConfiguration m_collisionConfiguration = new btSoftBodyRigidBodyCollisionConfiguration(); m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); m_softBodyWorldInfo.m_dispatcher = m_dispatcher; btVector3 worldAabbMin(-1000,-1000,-1000); btVector3 worldAabbMax(1000,1000,1000); m_broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); m_softBodyWorldInfo.m_broadphase = m_broadphase; btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver(); m_solver = solver; btSoftBodySolver* softBodySolver = 0; btDiscreteDynamicsWorld* world = new btSoftRigidDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration,softBodySolver); m_dynamicsWorld = world; m_dynamicsWorld->setDebugDrawer(&gDebugDrawer); m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; m_dynamicsWorld->setGravity(btVector3(0,-10,0)); m_softBodyWorldInfo.m_gravity.setValue(0,-10,0); m_softBodyWorldInfo.m_sparsesdf.Initialize(); //create a few basic rigid bodies btBoxShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); m_collisionShapes.push_back(groundShape); btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,-50,0)); localCreateRigidBody(0,groundTransform,groundShape); //buildDoublePendulumRigid(); //buildDoublePendulumSoft(); buildFlyingTrapeze(); m_softBodyWorldInfo.m_sparsesdf.Reset(); m_softBodyWorldInfo.air_density = (btScalar)1.2; m_softBodyWorldInfo.water_density = 0; m_softBodyWorldInfo.water_offset = 0; m_softBodyWorldInfo.water_normal = btVector3(0,0,0); m_softBodyWorldInfo.m_gravity.setValue(0,-10,0); }
BasicGpuDemo::BasicGpuDemo() { m_np=0; m_bp=0; m_clData = new btInternalData; setCameraDistance(btScalar(SCALING*60.)); this->setAzi(45); this->setEle(45); }
void ThirdPersonCameraMount::runCommand(const std::string& command, const std::string& args) { if (SetCameraDistance == command) { Tokeniser tokeniser; tokeniser.initTokens(args); std::string distance = tokeniser.nextToken(); if (!distance.empty()) { float fDistance = Ogre::StringConverter::parseReal(distance); setCameraDistance(fDistance); } } }
void BenchmarkDemo::createTest2() { setCameraDistance(btScalar(50.)); const float cubeSize = 1.0f; createPyramid(btVector3(-20.0f,0.0f,0.0f),12,btVector3(cubeSize,cubeSize,cubeSize)); createWall(btVector3(-2.0f,0.0f,0.0f),12,btVector3(cubeSize,cubeSize,cubeSize)); createWall(btVector3(4.0f,0.0f,0.0f),12,btVector3(cubeSize,cubeSize,cubeSize)); createWall(btVector3(10.0f,0.0f,0.0f),12,btVector3(cubeSize,cubeSize,cubeSize)); createTowerCircle(btVector3(25.0f,0.0f,0.0f),8,24,btVector3(cubeSize,cubeSize,cubeSize)); }
void RagdollDemo::initPhysics() { // Setup the basic world setTexturing(true); setShadows(true); setCameraDistance(btScalar(5.)); m_collisionConfiguration = new btDefaultCollisionConfiguration(); m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); btVector3 worldAabbMin(-10000,-10000,-10000); btVector3 worldAabbMax(10000,10000,10000); m_broadphase = new btAxisSweep3 (worldAabbMin, worldAabbMax); m_solver = new btSequentialImpulseConstraintSolver; m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); //m_dynamicsWorld->getDispatchInfo().m_useConvexConservativeDistanceUtil = true; //m_dynamicsWorld->getDispatchInfo().m_convexConservativeDistanceThreshold = 0.01f; // Setup a big ground box { btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); m_collisionShapes.push_back(groundShape); btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,-10,0)); #define CREATE_GROUND_COLLISION_OBJECT 1 #ifdef CREATE_GROUND_COLLISION_OBJECT btCollisionObject* fixedGround = new btCollisionObject(); fixedGround->setCollisionShape(groundShape); fixedGround->setWorldTransform(groundTransform); m_dynamicsWorld->addCollisionObject(fixedGround); #else localCreateRigidBody(btScalar(0.),groundTransform,groundShape); #endif //CREATE_GROUND_COLLISION_OBJECT } // Spawn one ragdoll btVector3 startOffset(1,0.5,0); spawnRagdoll(startOffset); startOffset.setValue(-1,0.5,0); spawnRagdoll(startOffset); clientResetScene(); }
void BenchmarkDemo::createTest6() { setCameraDistance(btScalar(250.)); btVector3 boxSize(1.5f,1.5f,1.5f); btConvexHullShape* convexHullShape = new btConvexHullShape(); for (int i=0;i<TaruVtxCount;i++) { btVector3 vtx(TaruVtx[i*3],TaruVtx[i*3+1],TaruVtx[i*3+2]); convexHullShape->addPoint(vtx); } btTransform trans; trans.setIdentity(); float mass = 1.f; btVector3 localInertia(0,0,0); convexHullShape->calculateLocalInertia(mass,localInertia); { int size = 10; int height = 10; const float cubeSize = boxSize[0]; float spacing = 2.0f; btVector3 pos(0.0f, 20.0f, 0.0f); float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; for(int k=0;k<height;k++) { for(int j=0;j<size;j++) { pos[2] = offset + (float)j * (cubeSize * 2.0f + spacing); for(int i=0;i<size;i++) { pos[0] = offset + (float)i * (cubeSize * 2.0f + spacing); btVector3 bpos = btVector3(0,25,0) + btVector3(5.0f,1.0f,5.0f)*pos; trans.setOrigin(bpos); localCreateRigidBody(mass,trans,convexHullShape); } } offset -= 0.05f * spacing * (size-1); spacing *= 1.1f; pos[1] += (cubeSize * 2.0f + spacing); } } createLargeMeshBody(); }
/** Initializes the physics world and simulation * **/ void Physics::initPhysics(){ dead=false; totaltime=0; currentBoxIndex=0; currentJointIndex=0; noBoxes =0; fitness=0; enableEffectors=true; setTexturing(true); setShadows(true); setCameraDistance(btScalar(20.)); ///collision configuration contains default setup for memory, collision setup m_collisionConfiguration = new btDefaultCollisionConfiguration(); ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); m_broadphase = new btDbvtBroadphase(); ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; m_solver = sol; m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); m_dynamicsWorld->setDebugDrawer(&gDebugDraw); m_dynamicsWorld->setGravity(btVector3(0,-10,0)); //create ground body btBoxShape* groundShape = new btBoxShape(btVector3(btScalar(1000.),btScalar(10.),btScalar(1000.))); int* userP = new int(); *userP = 0; groundShape->setUserPointer2((void*)userP); m_collisionShapes.push_back(groundShape); btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,0,0)); btRigidBody* ground = localCreateRigidBody(0.,groundTransform,groundShape,COL_GROUND,COL_BOX); //ground collides with boxes only ground->setUserPointer((void*)(-1));; groundY = ground->getWorldTransform().getOrigin().getY()+groundShape->getHalfExtentsWithMargin().getY(); currentBoxIndex++; theNet=NULL; }
void BasicDemo::initPhysics() { setTexturing(true); setShadows(true); setCameraDistance(btScalar(SCALING*50.)); m_physicsSetup.initPhysics(); m_dynamicsWorld = m_physicsSetup.m_dynamicsWorld; m_dynamicsWorld->setDebugDrawer(&gDebugDraw); }
void GlassViewer::fitCameraToModel(int pad) { float sw = MIN(getWidth()*0.5f-pad, getHeight()*0.5f-pad); model_t *m = Res_GetModel(model); float bw = m->bSphere.r; float ez = 1/tan(DEG2RAD(fov/2.0)); float Az = m->bSphere.r*2+(bw/sw)*ez; setCameraPosition(0,-1,m->bmax[AXIS_Z]*0.45f); setCameraTarget(0,0,camPos[AXIS_Z]); setCameraDistance(Az+pad+m->bSphere.r); }
void RagdollApp::initPhysics() { // Setup the basic world m_time = 0; m_CycPerKnee = 2000.f; // in milliseconds m_CycPerHip = 3000.f; // in milliseconds m_fMuscleStrength = 0.5f; setTexturing(true); setShadows(true); setCameraDistance(btScalar(5.)); m_collisionConfiguration = new btDefaultCollisionConfiguration(); m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); btVector3 worldAabbMin(-10000,-10000,-10000); btVector3 worldAabbMax(10000,10000,10000); m_broadphase = new btAxisSweep3 (worldAabbMin, worldAabbMax); m_solver = new btSequentialImpulseConstraintSolver; m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); //m_dynamicsWorld->getDispatchInfo().m_useConvexConservativeDistanceUtil = true; //m_dynamicsWorld->getDispatchInfo().m_convexConservativeDistanceThreshold = 0.01f; m_dynamicsWorld->setInternalTickCallback( forcePreTickCB, this, true ); m_dynamicsWorld->setGravity( btVector3(0,-0,0) ); // create surface //createSurface(); //// Setup a big ground box btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); m_collisionShapes.push_back(groundShape); btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,-10,0)); btCollisionObject* fixedGround = new btCollisionObject(); fixedGround->setCollisionShape(groundShape); fixedGround->setWorldTransform(groundTransform); m_dynamicsWorld->addCollisionObject(fixedGround); // Spawn one ragdoll btVector3 startOffset(1,0.5,0); spawnRagdoll(startOffset); startOffset.setValue(-1,0.1,0); spawnRagdoll(startOffset); clientResetScene(); }
void ArtificialBirdsDemoApp::initPhysics() { // Setup the basic world setTexturing(true); setShadows(true); setCameraDistance(btScalar(5.)); m_collisionConfiguration = new btDefaultCollisionConfiguration(); m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); btVector3 worldAabbMin(-10000,-10000,-10000); btVector3 worldAabbMax(10000,10000,10000); m_broadphase = new btAxisSweep3 (worldAabbMin, worldAabbMax); m_solver = new btSequentialImpulseConstraintSolver; m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); //m_dynamicsWorld->getDispatchInfo().m_useConvexConservativeDistanceUtil = true; //m_dynamicsWorld->getDispatchInfo().m_convexConservativeDistanceThreshold = 0.01f; m_dynamicsWorld->setInternalTickCallback(pickingPreTickCallback, this, true); m_dynamicsWorld->getSolverInfo().m_numIterations = kSolverNumIterations; m_dynamicsWorld->setGravity(btVector3(0,kGravity,0)); // Setup a big ground box { btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); m_collisionShapes.push_back(groundShape); btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,-10,0)); #define CREATE_GROUND_COLLISION_OBJECT 1 #ifdef CREATE_GROUND_COLLISION_OBJECT btCollisionObject* fixedGround = new btCollisionObject(); fixedGround->setCollisionShape(groundShape); fixedGround->setWorldTransform(groundTransform); m_dynamicsWorld->addCollisionObject(fixedGround); #else localCreateRigidBody(btScalar(0.),groundTransform,groundShape); #endif //CREATE_GROUND_COLLISION_OBJECT } m_birdOpt = 0; m_birdDemo = 0; //m_birdOpt = new BirdOptimizer(m_dynamicsWorld); m_birdDemo = new BirdDemo(m_dynamicsWorld); clientResetScene(); }
void MotorDemo::initPhysics() { setTexturing(true); setShadows(true); // Setup the basic world m_Time = 0; m_fCyclePeriod = 2000.f; // in milliseconds // m_fMuscleStrength = 0.05f; // new SIMD solver for joints clips accumulated impulse, so the new limits for the motor // should be (numberOfsolverIterations * oldLimits) // currently solver uses 10 iterations, so: m_fMuscleStrength = 0.5f; setCameraDistance(btScalar(5.)); m_collisionConfiguration = new btDefaultCollisionConfiguration(); m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); btVector3 worldAabbMin(-10000,-10000,-10000); btVector3 worldAabbMax(10000,10000,10000); m_broadphase = new btAxisSweep3 (worldAabbMin, worldAabbMax); m_solver = new btSequentialImpulseConstraintSolver; m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); m_dynamicsWorld->setInternalTickCallback(motorPreTickCallback,this,true); // Setup a big ground box { btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); m_collisionShapes.push_back(groundShape); btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,-10,0)); localCreateRigidBody(btScalar(0.),groundTransform,groundShape); } // Spawn one ragdoll btVector3 startOffset(1,0.5,0); spawnTestRig(startOffset, false); startOffset.setValue(-2,0.5,0); spawnTestRig(startOffset, true); clientResetScene(); }
void PendulumApplication::initPhysics() { setTexturing(true); setShadows(true); m_debugMode |= btIDebugDraw::DBG_NoHelpText; setCameraDistance(btScalar(20.)); m_collisionConfiguration = new btDefaultCollisionConfiguration(); //m_collisionConfiguration->setConvexConvexMultipointIterations(); ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); m_broadphase = new btDbvtBroadphase(); ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; m_solver = sol; m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); ///create a few basic rigid bodies btBoxShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); m_collisionShapes.push_back(groundShape); btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,-50,0)); localCreateRigidBody(0,groundTransform,groundShape); btSphereShape* sphereShape = new btSphereShape(1.); m_collisionShapes.push_back(sphereShape); btTransform pendulumTransform; pendulumTransform.setIdentity(); m_theta.m_value = SIMD_HALF_PI; m_theta.m_dot = 1.; m_r.m_value = 10; m_r.m_dot = 0; temp = 0; btVector3 to_Remplace; // to replace with te pendulum position pendulumTransform.setOrigin( to_Remplace); m_pendulumBody = localCreateRigidBody(1,pendulumTransform,sphereShape); m_pendulumBody->setCollisionFlags( m_pendulumBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); }
void BenchmarkDemo::createTest4() { setCameraDistance(btScalar(50.)); int size = 8; const float cubeSize = 1.5f; float spacing = cubeSize; btVector3 pos(0.0f, cubeSize * 2, 0.0f); float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; btConvexHullShape* convexHullShape = new btConvexHullShape(); btScalar scaling(1); convexHullShape->setLocalScaling(btVector3(scaling,scaling,scaling)); for (int i=0;i<TaruVtxCount;i++) { btVector3 vtx(TaruVtx[i*3],TaruVtx[i*3+1],TaruVtx[i*3+2]); convexHullShape->addPoint(vtx*btScalar(1./scaling)); } //this will enable polyhedral contact clipping, better quality, slightly slower //convexHullShape->initializePolyhedralFeatures(); btTransform trans; trans.setIdentity(); float mass = 1.f; btVector3 localInertia(0,0,0); convexHullShape->calculateLocalInertia(mass,localInertia); for(int k=0;k<15;k++) { for(int j=0;j<size;j++) { pos[2] = offset + (float)j * (cubeSize * 2.0f + spacing); for(int i=0;i<size;i++) { pos[0] = offset + (float)i * (cubeSize * 2.0f + spacing); trans.setOrigin(pos); localCreateRigidBody(mass,trans,convexHullShape); } } offset -= 0.05f * spacing * (size-1); spacing *= 1.01f; pos[1] += (cubeSize * 2.0f + spacing); } }
void SimpleRenderContext::showFull(const Ogre::MovableObject* object) { //only do this if there's an active object if (object) { mEntityNode->_update(true, true); Ogre::Real distance = object->getBoundingRadius() / Ogre::Math::Tan(mCamera->getFOVy() / 2); //we can't have a distance of 0 if (distance == 0) { distance = 1; } Ogre::Real distanceNudge = distance / 100; distance += distanceNudge; mDefaultCameraDistance = distance; setCameraDistance(distance); } }
int main(int argc,char** argv) { raytracePicture = new RenderTexture(screenWidth,screenHeight); myBox.SetMargin(0.02f); myCone.SetMargin(0.2f); simplex.SetSimplexSolver(&simplexSolver); simplex.AddVertex(SimdPoint3(-1,0,-1)); simplex.AddVertex(SimdPoint3(1,0,-1)); simplex.AddVertex(SimdPoint3(0,0,1)); simplex.AddVertex(SimdPoint3(0,1,0)); /// convex hull of 5 spheres #define NUM_SPHERES 5 SimdVector3 inertiaHalfExtents(10.f,10.f,10.f); SimdVector3 positions[NUM_SPHERES] = { SimdVector3(-1.2f, -0.3f, 0.f), SimdVector3(0.8f, -0.3f, 0.f), SimdVector3(0.5f, 0.6f, 0.f), SimdVector3(-0.5f, 0.6f, 0.f), SimdVector3(0.f, 0.f, 0.f) }; SimdScalar radi[NUM_SPHERES] = { 0.35f,0.35f,0.45f,0.40f,0.40f }; MultiSphereShape multiSphereShape(inertiaHalfExtents,positions,radi,NUM_SPHERES); ConvexHullShape convexHullShape(positions,3); //choose shape shapePtr[0] = &myCone; shapePtr[1] =&simplex; shapePtr[2] =&convexHullShape; shapePtr[3] =&myMink;//myBox; simplex.SetMargin(0.3f); setCameraDistance(6.f); return glutmain(argc, argv,screenWidth,screenHeight,"Minkowski-Sum Raytracer Demo"); }
void LinearConvexCastDemo::initPhysics() { setCameraDistance(30.f); tr[0].setOrigin(SimdVector3(0,0,0)); tr[1].setOrigin(SimdVector3(0,10,0)); SimdMatrix3x3 basisA; basisA.setValue(0.99999958f,0.00022980258f,0.00090992288f, -0.00029313788f,0.99753088f,0.070228584f, -0.00089153741f,-0.070228823f,0.99753052f); SimdMatrix3x3 basisB; basisB.setValue(1.0000000f,4.4865553e-018f,-4.4410586e-017f, 4.4865495e-018f,0.97979438f,0.20000751f, 4.4410586e-017f,-0.20000751f,0.97979438f); tr[0].setBasis(basisA); tr[1].setBasis(basisB); SimdVector3 boxHalfExtentsA(0.2,4,4); SimdVector3 boxHalfExtentsB(6,6,6); BoxShape* boxA = new BoxShape(boxHalfExtentsA); /* BU_Simplex1to4 boxB; boxB.AddVertex(SimdPoint3(-5,0,-5)); boxB.AddVertex(SimdPoint3(5,0,-5)); boxB.AddVertex(SimdPoint3(0,0,5)); boxB.AddVertex(SimdPoint3(0,5,0)); */ BoxShape* boxB = new BoxShape(boxHalfExtentsB); shapePtr[0] = boxA; shapePtr[1] = boxB; shapePtr[0]->SetMargin(0.01f); shapePtr[1]->SetMargin(0.01f); SimdTransform tr; tr.setIdentity(); }
int main(int argc,char** argv) { setCameraDistance(20.f); tr[0].setOrigin(SimdVector3(0.0013328250f,8.1363249f,7.0390840f)); tr[1].setOrigin(SimdVector3(0.00000000f,9.1262732f,2.0343180f)); //tr[0].setOrigin(SimdVector3(0,0,0)); //tr[1].setOrigin(SimdVector3(0,10,0)); SimdMatrix3x3 basisA; basisA.setValue(0.99999958f,0.00022980258f,0.00090992288f, -0.00029313788f,0.99753088f,0.070228584f, -0.00089153741f,-0.070228823f,0.99753052f); SimdMatrix3x3 basisB; basisB.setValue(1.0000000f,4.4865553e-018f,-4.4410586e-017f, 4.4865495e-018f,0.97979438f,0.20000751f, 4.4410586e-017f,-0.20000751f,0.97979438f); tr[0].setBasis(basisA); tr[1].setBasis(basisB); SimdVector3 boxHalfExtentsA(1.0000004768371582f,1.0000004768371582f,1.0000001192092896f); SimdVector3 boxHalfExtentsB(3.2836332321166992f,3.2836332321166992f,3.2836320400238037f); BoxShape boxA(boxHalfExtentsA); BoxShape boxB(boxHalfExtentsB); shapePtr[0] = &boxA; shapePtr[1] = &boxB; SimdTransform tr; tr.setIdentity(); return glutmain(argc, argv,screenWidth,screenHeight,"Collision Demo"); }
void ThirdPersonCameraMount::createNodesForCamera(Ogre::SceneManager& sceneManager) { mCameraRootNode = sceneManager.createSceneNode(OgreInfo::createUniqueResourceName("ThirdPersonCameraRootNode")); mCameraRootNode->setInheritOrientation(false); mCameraRootNode->setInheritScale(false); //we need to adjust for the height of the mesh mCameraRootNode->setPosition(Ogre::Vector3(0, 2, 0)); //Start camera behind avatar mCameraRootNode->yaw(Ogre::Degree(180)); mCameraPitchNode = mCameraRootNode->createChildSceneNode(OgreInfo::createUniqueResourceName("ThirdPersonCameraPitchNode")); mCameraPitchNode->setPosition(Ogre::Vector3(0, 0, 0)); mCameraPitchNode->setInheritScale(false); //The camera node isn't actually attached to the pitch node. We'll instead adjust it each frame to match the pitch node, adjusted by collisions. mCameraNode = sceneManager.createSceneNode(OgreInfo::createUniqueResourceName("ThirdPersonCameraNode")); mCameraNode->setInheritScale(false); mCameraNode->setFixedYawAxis(true); //Important that we set this to disallow the camera from rolling. setCameraDistance(10); Ogre::Vector3 pos(0, 0, 10); mCameraNode->setPosition(pos); }
void LinearConvexCastDemo::initPhysics() { setCameraDistance(10.f); tr[0].setIdentity(); tr[0].setOrigin( btVector3( 0.0f, 5.5f, 0.0f ) ); tr[1].setIdentity(); tr[1].setOrigin( btVector3( 0.0f, 0.0f, 0.0f ) ); // Pyramide float r = 1.0f; float h = 2.0f; btConvexHullShape* shapeA = new btConvexHullShape; shapeA->addPoint( btVector3( 0.0f, 0.75f * h, 0.0f ) ); shapeA->addPoint( btVector3( -r, -0.25f * h, r ) ); shapeA->addPoint( btVector3( r, -0.25f * h, r ) ); shapeA->addPoint( btVector3( r, -0.25f * h, -r ) ); shapeA->addPoint( btVector3( -r, -0.25f * h, -r ) ); // Triangle btConvexHullShape* shapeB = new btConvexHullShape; shapeB->addPoint( btVector3( 0.0f, 1.0f, 0.0f ) ); shapeB->addPoint( btVector3( 1.0f, -1.0f, 0.0f ) ); shapeB->addPoint( btVector3( -1.0f, -1.0f, 0.0f ) ); shapePtr[0] = shapeA; shapePtr[1] = shapeB; shapePtr[0]->setMargin( 0.01f ); shapePtr[1]->setMargin( 0.01f ); }
void SerializeDemo::initPhysics() { setTexturing(true); setShadows(true); setCameraDistance(btScalar(SCALING*50.)); setupEmptyDynamicsWorld(); #ifdef DESERIALIZE_SOFT_BODIES btBulletWorldImporter* fileLoader = new MySoftBulletWorldImporter((btSoftRigidDynamicsWorld*)m_dynamicsWorld); #else btBulletWorldImporter* fileLoader = new btBulletWorldImporter(m_dynamicsWorld); #endif //DESERIALIZE_SOFT_BODIES // fileLoader->setVerboseMode(true); if (!fileLoader->loadFile("testFile.bullet")) { btAssert(0); exit(0); } }
BulletOpenGLViewer::BulletOpenGLViewer(DynamicsWorldPtr world) { SIMDYNAMICS_ASSERT(world); m_sundirection = btVector3(1, 1, -2) * 1000; bulletEngine = boost::dynamic_pointer_cast<BulletEngine>(world->getEngine()); SIMDYNAMICS_ASSERT(bulletEngine); setTexturing(true); setShadows(true); // set Bullet world (defined in bullet's OpenGL helpers) m_dynamicsWorld = bulletEngine->getBulletWorld(); m_dynamicsWorld->setDebugDrawer(&debugDrawer); // set up vector for camera setCameraDistance(btScalar(3.)); setCameraForwardAxis(1); btVector3 up(0, 0, btScalar(1.)); setCameraUp(up); clientResetScene(); }
void BasicDemo::initPhysics() { setTexturing(true); setShadows(true); setCameraDistance(btScalar(SCALING*50.)); ///collision configuration contains default setup for memory, collision setup m_collisionConfiguration = new btDefaultCollisionConfiguration(); //m_collisionConfiguration->setConvexConvexMultipointIterations(); ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); m_broadphase = new btDbvtBroadphase(); ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; m_solver = sol; m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); m_dynamicsWorld->setGravity(btVector3(0,-10,0)); ///create a few basic rigid bodies btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); // btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); m_collisionShapes.push_back(groundShape); btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,-50,0)); //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: { btScalar mass(0.); //rigidbody is dynamic if and only if mass is non zero, otherwise static bool isDynamic = (mass != 0.f); btVector3 localInertia(0,0,0); if (isDynamic) groundShape->calculateLocalInertia(mass,localInertia); //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); btRigidBody* body = new btRigidBody(rbInfo); //add the body to the dynamics world m_dynamicsWorld->addRigidBody(body); } { //create a few dynamic rigidbodies // Re-using the same collision is better for memory usage and performance //btCollisionShape* colShape = new btBoxShape(btVector3(SCALING*1,SCALING*1,SCALING*1)); btCollisionShape* colShape = new btSphereShape(btScalar(1.)); m_collisionShapes.push_back(colShape); /// Create Dynamic Objects btTransform startTransform; startTransform.setIdentity(); btScalar mass(1.f); //rigidbody is dynamic if and only if mass is non zero, otherwise static bool isDynamic = (mass != 0.f); btVector3 localInertia(0,0,0); if (isDynamic) colShape->calculateLocalInertia(mass,localInertia); float start_x = START_POS_X - ARRAY_SIZE_X/2; float start_y = START_POS_Y; float start_z = START_POS_Z - ARRAY_SIZE_Z/2; for (int k=0;k<ARRAY_SIZE_Y;k++) { for (int i=0;i<ARRAY_SIZE_X;i++) { for(int j = 0;j<ARRAY_SIZE_Z;j++) { startTransform.setOrigin(SCALING*btVector3( btScalar(2.0*i + start_x), btScalar(20+2.0*k + start_y), btScalar(2.0*j + start_z))); //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,colShape,localInertia); btRigidBody* body = new btRigidBody(rbInfo); m_dynamicsWorld->addRigidBody(body); } } } } }
void VehicleDemo::initPhysics() { #ifdef FORCE_ZAXIS_UP m_cameraUp = btVector3(0,0,1); m_forwardAxis = 1; #endif btCollisionShape* groundShape = new btBoxShape(btVector3(50,3,50)); m_collisionShapes.push_back(groundShape); m_collisionConfiguration = new btDefaultCollisionConfiguration(); m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); btVector3 worldMin(-1000,-1000,-1000); btVector3 worldMax(1000,1000,1000); m_overlappingPairCache = new btAxisSweep3(worldMin,worldMax); m_constraintSolver = new btSequentialImpulseConstraintSolver(); m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); #ifdef FORCE_ZAXIS_UP m_dynamicsWorld->setGravity(btVector3(0,0,-10)); #endif //m_dynamicsWorld->setGravity(btVector3(0,0,0)); btTransform tr; tr.setIdentity(); //either use heightfield or triangle mesh //#define USE_TRIMESH_GROUND 1 #ifdef USE_TRIMESH_GROUND int i; const float TRIANGLE_SIZE=20.f; //create a triangle-mesh ground int vertStride = sizeof(btVector3); int indexStride = 3*sizeof(int); const int NUM_VERTS_X = 20; const int NUM_VERTS_Y = 20; const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); m_vertices = new btVector3[totalVerts]; int* gIndices = new int[totalTriangles*3]; for ( i=0;i<NUM_VERTS_X;i++) { for (int j=0;j<NUM_VERTS_Y;j++) { float wl = .2f; //height set to zero, but can also use curved landscape, just uncomment out the code float height = 0.f;//20.f*sinf(float(i)*wl)*cosf(float(j)*wl); #ifdef FORCE_ZAXIS_UP m_vertices[i+j*NUM_VERTS_X].setValue( (i-NUM_VERTS_X*0.5f)*TRIANGLE_SIZE, (j-NUM_VERTS_Y*0.5f)*TRIANGLE_SIZE, height ); #else m_vertices[i+j*NUM_VERTS_X].setValue( (i-NUM_VERTS_X*0.5f)*TRIANGLE_SIZE, height, (j-NUM_VERTS_Y*0.5f)*TRIANGLE_SIZE); #endif } } int index=0; for ( i=0;i<NUM_VERTS_X-1;i++) { for (int j=0;j<NUM_VERTS_Y-1;j++) { gIndices[index++] = j*NUM_VERTS_X+i; gIndices[index++] = j*NUM_VERTS_X+i+1; gIndices[index++] = (j+1)*NUM_VERTS_X+i+1; gIndices[index++] = j*NUM_VERTS_X+i; gIndices[index++] = (j+1)*NUM_VERTS_X+i+1; gIndices[index++] = (j+1)*NUM_VERTS_X+i; } } m_indexVertexArrays = new btTriangleIndexVertexArray(totalTriangles, gIndices, indexStride, totalVerts,(btScalar*) &m_vertices[0].x(),vertStride); bool useQuantizedAabbCompression = true; groundShape = new btBvhTriangleMeshShape(m_indexVertexArrays,useQuantizedAabbCompression); tr.setOrigin(btVector3(0,-4.5f,0)); #else //testing btHeightfieldTerrainShape int width=128; int length=128; #ifdef LOAD_FROM_FILE unsigned char* heightfieldData = new unsigned char[width*length]; { for (int i=0;i<width*length;i++) { heightfieldData[i]=0; } } char* filename="heightfield128x128.raw"; FILE* heightfieldFile = fopen(filename,"r"); if (!heightfieldFile) { filename="../../heightfield128x128.raw"; heightfieldFile = fopen(filename,"r"); } if (heightfieldFile) { int numBytes =fread(heightfieldData,1,width*length,heightfieldFile); //btAssert(numBytes); if (!numBytes) { printf("couldn't read heightfield at %s\n",filename); } fclose (heightfieldFile); } #else char* heightfieldData = MyHeightfield; #endif //btScalar maxHeight = 20000.f;//exposes a bug btScalar maxHeight = 100; bool useFloatDatam=false; bool flipQuadEdges=false; btHeightfieldTerrainShape* heightFieldShape = new btHeightfieldTerrainShape(width,length,heightfieldData,maxHeight,upIndex,useFloatDatam,flipQuadEdges);; btVector3 mmin,mmax; heightFieldShape->getAabb(btTransform::getIdentity(),mmin,mmax); groundShape = heightFieldShape; heightFieldShape->setUseDiamondSubdivision(true); btVector3 localScaling(100,1,100); localScaling[upIndex]=1.f; groundShape->setLocalScaling(localScaling); //tr.setOrigin(btVector3(0,9940,0)); tr.setOrigin(btVector3(0,49.4,0)); #endif // m_collisionShapes.push_back(groundShape); //create ground object localCreateRigidBody(0,tr,groundShape); tr.setOrigin(btVector3(0,0,0));//-64.5f,0)); #ifdef FORCE_ZAXIS_UP // indexRightAxis = 0; // indexUpAxis = 2; // indexForwardAxis = 1; btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,2.f, 0.5f)); btCompoundShape* compound = new btCompoundShape(); btTransform localTrans; localTrans.setIdentity(); //localTrans effectively shifts the center of mass with respect to the chassis localTrans.setOrigin(btVector3(0,0,1)); #else btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,0.5f,2.f)); m_collisionShapes.push_back(chassisShape); btCompoundShape* compound = new btCompoundShape(); m_collisionShapes.push_back(compound); btTransform localTrans; localTrans.setIdentity(); //localTrans effectively shifts the center of mass with respect to the chassis localTrans.setOrigin(btVector3(0,1,0)); #endif compound->addChildShape(localTrans,chassisShape); tr.setOrigin(btVector3(0,0.f,0)); m_carChassis = localCreateRigidBody(800,tr,compound);//chassisShape); //m_carChassis->setDamping(0.2,0.2); m_wheelShape = new btCylinderShapeX(btVector3(wheelWidth,wheelRadius,wheelRadius)); clientResetScene(); /// create vehicle { m_vehicleRayCaster = new btDefaultVehicleRaycaster(m_dynamicsWorld); m_vehicle = new btRaycastVehicle(m_tuning,m_carChassis,m_vehicleRayCaster); ///never deactivate the vehicle m_carChassis->setActivationState(DISABLE_DEACTIVATION); m_dynamicsWorld->addVehicle(m_vehicle); float connectionHeight = 1.2f; bool isFrontWheel=true; //choose coordinate system m_vehicle->setCoordinateSystem(rightIndex,upIndex,forwardIndex); #ifdef FORCE_ZAXIS_UP btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); #else btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); #endif m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); #ifdef FORCE_ZAXIS_UP connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); #else connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); #endif m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); #ifdef FORCE_ZAXIS_UP connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); #else connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); #endif //FORCE_ZAXIS_UP isFrontWheel = false; m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); #ifdef FORCE_ZAXIS_UP connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); #else connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); #endif m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); for (int i=0;i<m_vehicle->getNumWheels();i++) { btWheelInfo& wheel = m_vehicle->getWheelInfo(i); wheel.m_suspensionStiffness = suspensionStiffness; wheel.m_wheelsDampingRelaxation = suspensionDamping; wheel.m_wheelsDampingCompression = suspensionCompression; wheel.m_frictionSlip = wheelFriction; wheel.m_rollInfluence = rollInfluence; } } setCameraDistance(26.f); }
void ForkLiftDemo::initPhysics() { #ifdef FORCE_ZAXIS_UP m_cameraUp = btVector3(0,0,1); m_forwardAxis = 1; #endif btCollisionShape* groundShape = new btBoxShape(btVector3(50,3,50)); m_collisionShapes.push_back(groundShape); m_collisionConfiguration = new btDefaultCollisionConfiguration(); m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); btVector3 worldMin(-1000,-1000,-1000); btVector3 worldMax(1000,1000,1000); m_overlappingPairCache = new btAxisSweep3(worldMin,worldMax); m_constraintSolver = new btSequentialImpulseConstraintSolver(); m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); #ifdef FORCE_ZAXIS_UP m_dynamicsWorld->setGravity(btVector3(0,0,-10)); #endif //m_dynamicsWorld->setGravity(btVector3(0,0,0)); btTransform tr; tr.setIdentity(); tr.setOrigin(btVector3(0,-10,0)); //either use heightfield or triangle mesh //create ground object localCreateRigidBody(0,tr,groundShape); #ifdef FORCE_ZAXIS_UP // indexRightAxis = 0; // indexUpAxis = 2; // indexForwardAxis = 1; btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,2.f, 0.5f)); btCompoundShape* compound = new btCompoundShape(); btTransform localTrans; localTrans.setIdentity(); //localTrans effectively shifts the center of mass with respect to the chassis localTrans.setOrigin(btVector3(0,0,1)); #else btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,0.5f,2.f)); m_collisionShapes.push_back(chassisShape); btCompoundShape* compound = new btCompoundShape(); m_collisionShapes.push_back(compound); btTransform localTrans; localTrans.setIdentity(); //localTrans effectively shifts the center of mass with respect to the chassis localTrans.setOrigin(btVector3(0,1,0)); #endif compound->addChildShape(localTrans,chassisShape); { btCollisionShape* suppShape = new btBoxShape(btVector3(0.5f,0.1f,0.5f)); btTransform suppLocalTrans; suppLocalTrans.setIdentity(); //localTrans effectively shifts the center of mass with respect to the chassis suppLocalTrans.setOrigin(btVector3(0,1.0,2.5)); compound->addChildShape(suppLocalTrans, suppShape); } tr.setOrigin(btVector3(0,0.f,0)); m_carChassis = localCreateRigidBody(800,tr,compound);//chassisShape); //m_carChassis->setDamping(0.2,0.2); m_wheelShape = new btCylinderShapeX(btVector3(wheelWidth,wheelRadius,wheelRadius)); { btCollisionShape* liftShape = new btBoxShape(btVector3(0.5f,2.0f,0.05f)); m_collisionShapes.push_back(liftShape); btTransform liftTrans; m_liftStartPos = btVector3(0.0f, 2.5f, 3.05f); liftTrans.setIdentity(); liftTrans.setOrigin(m_liftStartPos); m_liftBody = localCreateRigidBody(10,liftTrans, liftShape); btTransform localA, localB; localA.setIdentity(); localB.setIdentity(); localA.getBasis().setEulerZYX(0, M_PI_2, 0); localA.setOrigin(btVector3(0.0, 1.0, 3.05)); localB.getBasis().setEulerZYX(0, M_PI_2, 0); localB.setOrigin(btVector3(0.0, -1.5, -0.05)); m_liftHinge = new btHingeConstraint(*m_carChassis,*m_liftBody, localA, localB); // m_liftHinge->setLimit(-LIFT_EPS, LIFT_EPS); m_liftHinge->setLimit(0.0f, 0.0f); m_dynamicsWorld->addConstraint(m_liftHinge, true); btCollisionShape* forkShapeA = new btBoxShape(btVector3(1.0f,0.1f,0.1f)); m_collisionShapes.push_back(forkShapeA); btCompoundShape* forkCompound = new btCompoundShape(); m_collisionShapes.push_back(forkCompound); btTransform forkLocalTrans; forkLocalTrans.setIdentity(); forkCompound->addChildShape(forkLocalTrans, forkShapeA); btCollisionShape* forkShapeB = new btBoxShape(btVector3(0.1f,0.02f,0.6f)); m_collisionShapes.push_back(forkShapeB); forkLocalTrans.setIdentity(); forkLocalTrans.setOrigin(btVector3(-0.9f, -0.08f, 0.7f)); forkCompound->addChildShape(forkLocalTrans, forkShapeB); btCollisionShape* forkShapeC = new btBoxShape(btVector3(0.1f,0.02f,0.6f)); m_collisionShapes.push_back(forkShapeC); forkLocalTrans.setIdentity(); forkLocalTrans.setOrigin(btVector3(0.9f, -0.08f, 0.7f)); forkCompound->addChildShape(forkLocalTrans, forkShapeC); btTransform forkTrans; m_forkStartPos = btVector3(0.0f, 0.6f, 3.2f); forkTrans.setIdentity(); forkTrans.setOrigin(m_forkStartPos); m_forkBody = localCreateRigidBody(5, forkTrans, forkCompound); localA.setIdentity(); localB.setIdentity(); localA.getBasis().setEulerZYX(0, 0, M_PI_2); localA.setOrigin(btVector3(0.0f, -1.9f, 0.05f)); localB.getBasis().setEulerZYX(0, 0, M_PI_2); localB.setOrigin(btVector3(0.0, 0.0, -0.1)); m_forkSlider = new btSliderConstraint(*m_liftBody, *m_forkBody, localA, localB, true); m_forkSlider->setLowerLinLimit(0.1f); m_forkSlider->setUpperLinLimit(0.1f); // m_forkSlider->setLowerAngLimit(-LIFT_EPS); // m_forkSlider->setUpperAngLimit(LIFT_EPS); m_forkSlider->setLowerAngLimit(0.0f); m_forkSlider->setUpperAngLimit(0.0f); m_dynamicsWorld->addConstraint(m_forkSlider, true); btCompoundShape* loadCompound = new btCompoundShape(); m_collisionShapes.push_back(loadCompound); btCollisionShape* loadShapeA = new btBoxShape(btVector3(2.0f,0.5f,0.5f)); m_collisionShapes.push_back(loadShapeA); btTransform loadTrans; loadTrans.setIdentity(); loadCompound->addChildShape(loadTrans, loadShapeA); btCollisionShape* loadShapeB = new btBoxShape(btVector3(0.1f,1.0f,1.0f)); m_collisionShapes.push_back(loadShapeB); loadTrans.setIdentity(); loadTrans.setOrigin(btVector3(2.1f, 0.0f, 0.0f)); loadCompound->addChildShape(loadTrans, loadShapeB); btCollisionShape* loadShapeC = new btBoxShape(btVector3(0.1f,1.0f,1.0f)); m_collisionShapes.push_back(loadShapeC); loadTrans.setIdentity(); loadTrans.setOrigin(btVector3(-2.1f, 0.0f, 0.0f)); loadCompound->addChildShape(loadTrans, loadShapeC); loadTrans.setIdentity(); m_loadStartPos = btVector3(0.0f, -3.5f, 7.0f); loadTrans.setOrigin(m_loadStartPos); m_loadBody = localCreateRigidBody(4, loadTrans, loadCompound); } clientResetScene(); /// create vehicle { m_vehicleRayCaster = new btDefaultVehicleRaycaster(m_dynamicsWorld); m_vehicle = new btRaycastVehicle(m_tuning,m_carChassis,m_vehicleRayCaster); ///never deactivate the vehicle m_carChassis->setActivationState(DISABLE_DEACTIVATION); m_dynamicsWorld->addVehicle(m_vehicle); float connectionHeight = 1.2f; bool isFrontWheel=true; //choose coordinate system m_vehicle->setCoordinateSystem(rightIndex,upIndex,forwardIndex); #ifdef FORCE_ZAXIS_UP btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); #else btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); #endif m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); #ifdef FORCE_ZAXIS_UP connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); #else connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); #endif m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); #ifdef FORCE_ZAXIS_UP connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); #else connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); #endif //FORCE_ZAXIS_UP isFrontWheel = false; m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); #ifdef FORCE_ZAXIS_UP connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); #else connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); #endif m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); for (int i=0;i<m_vehicle->getNumWheels();i++) { btWheelInfo& wheel = m_vehicle->getWheelInfo(i); wheel.m_suspensionStiffness = suspensionStiffness; wheel.m_wheelsDampingRelaxation = suspensionDamping; wheel.m_wheelsDampingCompression = suspensionCompression; wheel.m_frictionSlip = wheelFriction; wheel.m_rollInfluence = rollInfluence; } } setCameraDistance(26.f); }
void RagdollDemo::initPhysics() { // Setup the basic world setTexturing(true); setShadows(true); setCameraDistance(btScalar(5.)); m_collisionConfiguration = new btDefaultCollisionConfiguration(); m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); btVector3 worldAabbMin(-10000,-10000,-10000); btVector3 worldAabbMax(10000,10000,10000); m_broadphase = new btAxisSweep3 (worldAabbMin, worldAabbMax); m_solver = new btSequentialImpulseConstraintSolver; m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); //m_dynamicsWorld->getDispatchInfo().m_useConvexConservativeDistanceUtil = true; //m_dynamicsWorld->getDispatchInfo().m_convexConservativeDistanceThreshold = 0.01f; // Setup a big ground box { btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); m_collisionShapes.push_back(groundShape); btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,-10,0)); #define CREATE_GROUND_COLLISION_OBJECT 1 #ifdef CREATE_GROUND_COLLISION_OBJECT btCollisionObject* fixedGround = new btCollisionObject(); fixedGround->setCollisionShape(groundShape); fixedGround->setWorldTransform(groundTransform); m_dynamicsWorld->addCollisionObject(fixedGround); #else localCreateRigidBody(btScalar(0.),groundTransform,groundShape); #endif //CREATE_GROUND_COLLISION_OBJECT } // Spawn one ragdoll btVector3 startOffset(1,0.5,0); //spawnRagdoll(startOffset); startOffset.setValue(-1,0.5,0); //spawnRagdoll(startOffset); CreateBox(0, 0., 2., 0., 1., 0.2, 1.); // Create the box //leg components CreateCylinder(1, 2. , 2., 0., .2, 1., 0., 0., M_PI_2); //xleft horizontal CreateCylinder(2, -2., 2., 0., .2, 1., 0., 0., M_PI_2); //xright (negative) horizontal CreateCylinder(3, 0, 2., 2., .2, 1., M_PI_2, 0., 0.); //zpositive (into screen) CreateCylinder(4, 0, 2., -2., .2, 1., M_PI_2, 0., 0.); //znegative (out of screen) CreateCylinder(5, 3.0, 1., 0., .2, 1., 0., 0., 0.); //xleft vertical CreateCylinder(6, -3.0, 1., 0., .2, 1., 0., 0., 0.); //xright vertical CreateCylinder(7, 0., 1., 3.0, .2, 1., 0., 0., 0.); //zpositive vertical CreateCylinder(8, 0., 1., -3.0, .2, 1., 0., 0., 0.); //znegative vertical //The axisworldtolocal defines a vector perpendicular to the plane that you want the bodies to rotate in //hinge the legs together //xnegative -- right //two bodies should rotate in y-plane through x--give axisworldtolocal it a z vector btVector3 local2 = PointWorldToLocal(2, btVector3(-3., 2., 0)); btVector3 local6 = PointWorldToLocal(6, btVector3(-3., 2., 0)); btVector3 axis2 = AxisWorldToLocal(2, btVector3(0., 0., 1.)); btVector3 axis6 = AxisWorldToLocal(6, btVector3( 0., 0., 1.)); CreateHinge(0, *body[2], *body[6], local2, local6, axis2, axis6); joints[0]->setLimit(btScalar(0.), btScalar(M_PI_2+M_PI_4)); //positive -- left //give axisworldtolocal a z vector btVector3 local1 = PointWorldToLocal(1, btVector3(3., 2., 0)); btVector3 local5 = PointWorldToLocal(5, btVector3(3., 2., 0)); btVector3 axis1 = AxisWorldToLocal(1, btVector3( 0., 0., 1.)); btVector3 axis5 = AxisWorldToLocal(5, btVector3(0., 0., 1.)); CreateHinge(1, *body[1], *body[5], local1, local5, axis1, axis5); joints[1]->setLimit(btScalar(M_PI_4), btScalar(M_PI_4)); //zpositive -- back //rotates in y-plane through z--give it an x vector btVector3 local3 = PointWorldToLocal(3, btVector3(0, 2., 3.)); btVector3 local7 = PointWorldToLocal(7, btVector3(0, 2., 3.)); btVector3 axis3 = AxisWorldToLocal(3, btVector3(1., 0., 0.)); btVector3 axis7 = AxisWorldToLocal(7, btVector3(1., 0., 0.)); CreateHinge(2, *body[3], *body[7], local3, local7, axis3, axis7); joints[2]->setLimit(btScalar(0.), btScalar(M_PI_2+M_PI_4)); //znegative -- front btVector3 local4 = PointWorldToLocal(4, btVector3(0, 2., -3.)); btVector3 local8 = PointWorldToLocal(8, btVector3(0, 2., -3.)); btVector3 axis4 = AxisWorldToLocal(4, btVector3(1., 0., 0.)); btVector3 axis8 = AxisWorldToLocal(8, btVector3(1., 0., 0.)); CreateHinge(3, *body[4], *body[8], local4, local8, axis4, axis8); joints[3]->setLimit(btScalar(M_PI_4), btScalar(M_PI_4)); //hinge the legs to the body //xright to main btVector3 localHinge2 = PointWorldToLocal(2, btVector3(-1, 2., 0)); btVector3 mainHinge2 = PointWorldToLocal(0, btVector3(-1, 2., 0)); btVector3 localAxis2 = AxisWorldToLocal(2, btVector3(0., 0., 1.)); btVector3 mainAxis2 = AxisWorldToLocal(0, btVector3( 0., 0., 1.)); CreateHinge(4, *body[0], *body[2], mainHinge2, localHinge2, mainAxis2, localAxis2); //joints[4]->setLimit(btScalar(-M_PI_2-M_PI_4), btScalar(M_PI_4)); //xleft to main btVector3 localHinge1 = PointWorldToLocal(1, btVector3(1, 2., 0)); btVector3 mainHinge1 = PointWorldToLocal(0, btVector3(1, 2., 0)); btVector3 localAxis1 = AxisWorldToLocal(1, btVector3(0., 0., 1.)); btVector3 mainAxis1 = AxisWorldToLocal(0, btVector3( 0., 0., 1.)); CreateHinge(5, *body[0], *body[1], mainHinge1, localHinge1, mainAxis1, localAxis1); //joints[5]->setLimit(btScalar(-M_PI_2), btScalar(M_PI_2)); //zpositive (back) to main btVector3 localHinge3 = PointWorldToLocal(3, btVector3(0., 2., 1)); btVector3 mainHinge3 = PointWorldToLocal(0, btVector3(0., 2., 1)); btVector3 localAxis3 = AxisWorldToLocal(3, btVector3(1., 0., 0.)); btVector3 mainAxis3 = AxisWorldToLocal(0, btVector3( 1., 0., 0.)); CreateHinge(6, *body[0], *body[3], mainHinge3, localHinge3, mainAxis3, localAxis3); //joints[6]->setLimit(btScalar(-M_PI_2-M_PI_4), btScalar(M_PI_4)); btVector3 localHinge4 = PointWorldToLocal(4, btVector3(0., 2., -1)); btVector3 mainHinge4= PointWorldToLocal(0, btVector3(0., 2., -1)); btVector3 localAxis4 = AxisWorldToLocal(4, btVector3(1., 0., 0. )); btVector3 mainAxis4 = AxisWorldToLocal(0, btVector3( 1., 0., 0.)); CreateHinge(7, *body[0], *body[4], mainHinge4, localHinge4, mainAxis4, localAxis4); //joints[7]->setLimit(btScalar(-M_PI_2), btScalar(M_PI_2)); clientResetScene(); }