void CPHWorld::Create() { dWorldID phWorld=0; if (psDeviceFlags.test(mtPhysics)) Device.seqFrameMT.Add (this,REG_PRIORITY_HIGH); else Device.seqFrame.Add (this,REG_PRIORITY_LOW); m_commander =xr_new<CPHCommander>(); //dVector3 extensions={2048,256,2048}; /* Fbox level_box = Level().ObjectSpace.GetBoundingVolume(); Fvector level_size,level_center; level_box . getsize (level_size); level_box . getcenter (level_center); dVector3 extensions = { level_size.x ,256.f,level_size.z}; dVector3 center = {level_center.x,0.f,level_center.z}; */ #ifdef ODE_SLOW_SOLVER #else dWorldSetAutoEnableDepthSF1(phWorld, 100000000); ///dWorldSetContactSurfaceLayer(phWorld,0.f); //phWorld->contactp.min_depth =0.f; #endif ContactGroup = dJointGroupCreate(0); dWorldSetGravity (phWorld, 0,-Gravity(), 0);//-2.f*9.81f Mesh.Create (0,phWorld); #ifdef PH_PLAIN plane=dCreatePlane(Space,0,1,0,0.3f); #endif //const dReal k_p=2400000.f;//550000.f;///1000000.f; //const dReal k_d=200000.f; dWorldSetERP(phWorld, ERP(world_spring,world_damping) ); dWorldSetCFM(phWorld, CFM(world_spring,world_damping)); //dWorldSetERP(phWorld, 0.2f); //dWorldSetCFM(phWorld, 0.000001f); disable_count=0; m_motion_ray=dCreateRayMotions(0); phBoundaries.set(Level().ObjectSpace.GetBoundingVolume()); phBoundaries.y1-=30.f; CPHCollideValidator::Init(); b_exist=true; }
static void command (int cmd) { switch (cmd) { case 'a': case 'A': speed += 0.3; break; case 'z': case 'Z': speed -= 0.3; break; case ',': turn += 0.1; if (turn > 0.3) turn = 0.3; break; case '.': turn -= 0.1; if (turn < -0.3) turn = -0.3; break; case ' ': speed = 0; turn = 0; break; case 'f': case 'F': doFast = !doFast; break; case '+': dWorldSetAutoEnableDepthSF1 (world, dWorldGetAutoEnableDepthSF1 (world) + 1); break; case '-': dWorldSetAutoEnableDepthSF1 (world, dWorldGetAutoEnableDepthSF1 (world) - 1); break; case 'r': case 'R': resetSimulation(); break; case '[': cannon_angle += 0.1; break; case ']': cannon_angle -= 0.1; break; case '1': cannon_elevation += 0.1; break; case '2': cannon_elevation -= 0.1; break; case 'x': case 'X': { dMatrix3 R2,R3,R4; dRFromAxisAndAngle (R2,0,0,1,cannon_angle); dRFromAxisAndAngle (R3,0,1,0,cannon_elevation); dMultiply0 (R4,R2,R3,3,3,3); dReal cpos[3] = {CANNON_X,CANNON_Y,1}; for (int i=0; i<3; i++) cpos[i] += 3*R4[i*4+2]; dBodySetPosition (cannon_ball_body,cpos[0],cpos[1],cpos[2]); dReal force = 10; dBodySetLinearVel (cannon_ball_body,force*R4[2],force*R4[6],force*R4[10]); dBodySetAngularVel (cannon_ball_body,0,0,0); break; } } }