void CCar::MakeParts(neSimulator * sim, neV3 & pos) { s32 i; for (i = 0; i < N_PARTS; i++) { neRigidBody * rb = sim->CreateRigidBody(); if (id == 0 ) //make it harder to sleep rb->SetSleepingParameter(0.1f); rb->SetPos(parts[i].position + pos); neGeometry * geom = rb->AddGeometry(); geom->SetBoxSize(parts[i].boxSize); rb->SetMass(0.01f); rb->UpdateBoundingInfo(); rb->SetInertiaTensor(neBoxInertiaTensor(parts[i].boxSize, 0.01f)); neJoint * joint = sim->CreateJoint(rb, carRigidBody); neT3 trans; trans.pos = parts[i].jointPos + pos; trans.rot.RotateXYZ(parts[i].jointRot); joint->SetJointFrameWorld(trans); joint->SetType(neJoint::NE_JOINT_HINGE); joint->SetLowerLimit(parts[i].lowerLimit); joint->SetUpperLimit(parts[i].upperLimit); joint->SetEpsilon(0.0f); joint->SetIteration(4); joint->EnableLimit(true); joint->Enable(true); carParts[i] = rb; // CRenderPrimitive * renderPrim = AddRenderPrimitive(); // // renderPrim->SetGraphicBox(parts[i].boxSize[0], parts[i].boxSize[1], parts[i].boxSize[2]); // // geom->SetUserData((u32)renderPrim); } }
void CSampleRigidParticlesAndTerrain::MakeParticle(neV3 position, s32 index) { //const f32 groundLevel = -10.0f; s32 cur; cur = index; box[cur] = sim->CreateRigidParticle(); neGeometry * geom = box[cur]->AddGeometry(); neV3 boxSize1; boxSize1.Set(1.f, 1.f, 1.f); geom->SetBoxSize(boxSize1[0],boxSize1[1],boxSize1[2]); box[cur]->UpdateBoundingInfo(); f32 mass = 0.1f; box[cur]->SetInertiaTensor(neBoxInertiaTensor(boxSize1[0], boxSize1[1], boxSize1[2], mass)); box[cur]->SetMass(mass); box[cur]->SetPos(position); //graphic boxRenderPrimitives[cur].SetGraphicBox(boxSize1[0],boxSize1[1],boxSize1[2]); if ((cur % 4) == 0) { boxRenderPrimitives[cur].SetDiffuseColor(D3DXCOLOR(0.8f, 0.2f, 0.2f, 1.0f)); } else if ((cur % 4) == 1) { boxRenderPrimitives[cur].SetDiffuseColor(D3DXCOLOR(0.2f, 0.4f, 0.6f, 1.0f)); } else if ((cur % 4) == 2) { boxRenderPrimitives[cur].SetDiffuseColor(D3DXCOLOR(0.2f, 0.6f, 0.2f, 1.0f)); } else { boxRenderPrimitives[cur].SetDiffuseColor(D3DXCOLOR(0.6f, 0.6f, 0.2f, 1.0f)); } }
void TConvex::Initialise() { SetBoxSize(1.0f, 1.0f, 1.0f); neT3 t; t.SetIdentity(); SetTransform(t); matIndex = 0; //id = 0; userData = 0; breakInfo.mass = 1.0f; breakInfo.inertiaTensor = neBoxInertiaTensor(1.0f, 1.0f, 1.0f, 1.0f); breakInfo.breakMagnitude = 0.0f; breakInfo.breakAbsorb = 0.5f; breakInfo.neighbourRadius = 0.0f; breakInfo.flag = neGeometry::NE_BREAK_DISABLE; //break all, breakInfo.breakPlane.SetZero(); }
void CSampleBreakageObjects::MakeTable(neV3 position, s32 index) { //const f32 groundLevel = -10.0f; neV3 tableSize; tableSize.Set(3.0f, 1.0f, 3.0f); s32 cur; cur = index; rigidBodies[cur] = sim->CreateRigidBody(); rigidBodies[cur]->SetInertiaTensor(neBoxInertiaTensor(tableSize, 2.0f)); rigidBodies[cur]->SetMass(2.0f); //position[1] = groundLevel + 0.95f * (1 + cur) + (0.15f * cur); rigidBodies[cur]->SetPos(position); neQ rot; rot.X = ((f32)rand()) /RAND_MAX; rot.Y = ((f32)rand()) /RAND_MAX; rot.Z = ((f32)rand()) /RAND_MAX; rot.W = ((f32)rand()) /RAND_MAX; rot.Normalize(); rigidBodies[cur]->SetRotation(rot); for (s32 i = 0; i < GEOMETRY_PER_TABLE; i++) { neGeometry * geom = rigidBodies[cur]->AddGeometry(); geom->SetUserData((u32) (cur * GEOMETRY_PER_TABLE + i)); geom->SetBoxSize(tableData[i].size); neT3 trans; trans.SetIdentity(); trans.pos = tableData[i].pos; geom->SetTransform(trans); geom->SetBreakageFlag(tableData[i].breakFlag); geom->SetBreakageMass(tableData[i].breakageMass); geom->SetBreakageInertiaTensor(neBoxInertiaTensor(tableData[i].size, tableData[i].breakageMass)); geom->SetBreakageMagnitude(tableData[i].breakageMagnitude); geom->SetBreakageAbsorption(tableData[i].breakageAbsorption); neV3 plane; plane.Set(0.0f, 1.0f, 0.0f); geom->SetBreakagePlane(plane); //graphic boxRenderPrimitives[geom->GetUserData()].SetGraphicBox(tableData[i].size.X(),tableData[i].size.Y(),tableData[i].size.Z()); if (i % 3 == 0) { boxRenderPrimitives[geom->GetUserData()].SetDiffuseColor(D3DXCOLOR(0.8f, 0.2f, 0.2f, 1.0f)); } else if (i % 3 == 1) { boxRenderPrimitives[geom->GetUserData()].SetDiffuseColor(D3DXCOLOR(0.3f, 0.3f, 1.0f, 1.0f)); } else { boxRenderPrimitives[geom->GetUserData()].SetDiffuseColor(D3DXCOLOR(0.2f, 0.8f, 0.2f, 1.0f)); } } rigidBodies[cur]->UpdateBoundingInfo(); }
void CSampleHingeJointMotorOn::InititialisePhysics() { f32 ypos = -7; neV3 gravity; gravity.Set(0.0f, -9.0f, 0.0f); //neV3 gravity; gravity.Set(-9.0f, 0.0f, 0.0f); //f32 linkLength = 2.2f; f32 linkLength = -0.0f; neSimulatorSizeInfo sizeInfo; sizeInfo.rigidBodiesCount = N_TOTAL_BODIES; sizeInfo.animatedBodiesCount = WALL_NUMBER; sizeInfo.geometriesCount = N_TOTAL_BODIES + WALL_NUMBER; sizeInfo.overlappedPairsCount = 2000;//MAX_OVERLAPPED_PAIR; { //dont need any of these sizeInfo.terrainNodesStartCount = 0; sizeInfo.rigidParticleCount = 0; } sim = neSimulator::CreateSimulator(sizeInfo, &all, &gravity); //create the kart body f32 mass = 1.0f; rigidBodies[0] = sim->CreateRigidBody(); rigidBodies[0]->SetMass(mass); neGeometry * geom = rigidBodies[0]->AddGeometry(); neV3 boxSize; boxSize.Set(3.0f, 3.f, 1.0f); geom->SetBoxSize(boxSize); rigidBodies[0]->UpdateBoundingInfo(); rigidBodies[0]->SetInertiaTensor(neBoxInertiaTensor(boxSize, mass)); neV3 pos; pos.Set(0.0f, ypos, 0.0f); rigidBodies[0]->SetPos(pos); rigidBodies[0]->SetSleepingParameter(.0f); //create the 4 wheels (sphere) s32 j = 1; ypos -= 2.0f; for (int i = 0; i < 4; i++) { neRigidBody * rb; rigidBodies[j++] = rb = sim->CreateRigidBody(); rb->SetMass(mass); geom = rb->AddGeometry(); geom->SetBoxSize(2.0f, .5f, 1.0f);//SetSphereDiameter(1.0f); //geom->SetSphereDiameter(1.0f); rb->UpdateBoundingInfo(); //rb->SetInertiaTensor(neSphereInertiaTensor(1.0f, 0.1f)); rb->SetInertiaTensor(neBoxInertiaTensor(2.0f, .5f, 1.0f, mass)); neV3 pos; switch(i) { case 0: pos.Set(-1.5f, ypos, 1.0f); break; case 1: pos.Set(-1.5f, ypos, -1.0f); break; case 2: pos.Set(1.5f, ypos, 1.0f); break; case 3: pos.Set(1.5f, ypos, -1.0f); break; } rb->SetPos(pos); neJoint * joint = sim->CreateJoint(rigidBodies[0], rb); joint->SetIteration(1); neT3 jointFrame; jointFrame.rot[0].Set(1.0f, 0.0f, 0.0f); jointFrame.rot[1].Set(0.0f, 0.0f, -1.0f); jointFrame.rot[2].Set(0.0f, 1.0f, 0.0f); jointFrame.pos = pos; joint->SetJointFrameWorld(jointFrame); joint->SetType(neJoint::NE_JOINT_HINGE); joint->Enable(true); joint->EnableMotor(true); joint->SetMotor(neJoint::NE_MOTOR_SPEED, 1.f, 50.f); } for (int i = 0; i < N_BODY; i++) { rigidBodies[i]->BeginIterateGeometry(); neGeometry * geom = rigidBodies[i]->GetNextGeometry(); neV3 scale; if (geom->GetBoxSize(scale)) { renderPrimitives[i].SetGraphicBox(scale.X(),scale.Y(),scale.Z()); } else { f32 height, diameter; if (geom->GetCylinder(diameter, height)) { renderPrimitives[i].SetGraphicCylinder(diameter/2.0f,height); } else if (geom->GetSphereDiameter(diameter)) { renderPrimitives[i].SetGraphicSphere(diameter/2.0); } } geom->SetUserData((u32)&renderPrimitives[i]); } //SetUpRoom { ground = sim->CreateAnimatedBody(); neGeometry * geom = ground->AddGeometry(); geom->SetBoxSize(gFloor.boxSize); ground->UpdateBoundingInfo(); ground->SetPos(gFloor.pos); groundRender.SetGraphicBox(gFloor.boxSize[0], gFloor.boxSize[1], gFloor.boxSize[2]); } }
void CCar::MakeCar(neSimulator * sim, neV3 & pos) { f32 mass = 1.0f; neRigidBody * rigidBody = sim->CreateRigidBody(); rigidBody->CollideConnected(true); neGeometry * geom = rigidBody->AddGeometry(); neV3 boxSize; { // the car consist of two boxes boxSize.Set(6.0f, 1.0f, 3.2f); geom->SetBoxSize(boxSize); neT3 t; t.SetIdentity(); t.pos.Set(0.0f, 0.25f, 0.0f); geom->SetTransform(t); geom = rigidBody->AddGeometry(); boxSize.Set(2.5f, 1.0f, 2.8f); geom->SetBoxSize(boxSize[0],boxSize[1],boxSize[2]); t.pos.Set(-0.6f, 1.0f, 0.0f); geom->SetTransform(t); } { // add 4 sensors to the rigid body neSensor * sn; for (s32 si = 0; si < 4; si++) { sn =rigidBody->AddSensor(); neV3 snPos, snDir; snDir.Set(0.0f, -1.0f, 0.0f); snPos.Set(sensorData[si].pos); sn->SetLineSensor(snPos, snDir); } // add a controller to the rigid body neRigidBodyController * controller; controller = rigidBody->AddController(&cb, 0); } neV3 tensorSize; tensorSize = boxSize; rigidBody->UpdateBoundingInfo(); rigidBody->SetInertiaTensor(neBoxInertiaTensor(tensorSize, mass)); rigidBody->SetMass(mass); rigidBody->SetUserData((u32)this); carRigidBody = rigidBody; { // setup the display boxes for the car rigidBody->BeginIterateGeometry(); while (geom = rigidBody->GetNextGeometry()) { neV3 boxSize; geom->GetBoxSize(boxSize); // CRenderPrimitive * renderPrim = AddRenderPrimitive(); // renderPrim->SetGraphicBox(boxSize[0], boxSize[1], boxSize[2]); // geom->SetUserData((u32)renderPrim); // renderPrim->SetDiffuseColor(D3DXCOLOR(0.2f, 0.2f, 0.8f, 1)); } } // wheelRenderPrimitive.SetGraphicCylinder(WHEEL_DIAMETER * 0.5f, WHEEL_WIDTH); // set the car position carRigidBody->SetPos(pos); // add bonnet to the car MakeParts(sim, pos); }