void buildModel () { TimeManager::getCurrent ()->setTimeStepSize (0.005); createMesh(); // create static rigid body string fileName = dataPath + "/models/cube.obj"; IndexedFaceMesh mesh; VertexData vd; OBJLoader::loadObj(fileName, vd, mesh); string fileNameTorus = dataPath + "/models/torus.obj"; IndexedFaceMesh meshTorus; VertexData vdTorus; OBJLoader::loadObj(fileNameTorus, vdTorus, meshTorus); SimulationModel::RigidBodyVector &rb = model.getRigidBodies(); rb.resize(2); // floor rb[0] = new RigidBody(); rb[0]->initBody(1.0, Vector3r(0.0, -5.5, 0.0), Quaternionr(1.0, 0.0, 0.0, 0.0), vd, mesh, Vector3r(100.0, 1.0, 100.0)); rb[0]->setMass(0.0); // torus rb[1] = new RigidBody(); rb[1]->initBody(1.0, Vector3r(5.0, -1.5, 0.0), Quaternionr(1.0, 0.0, 0.0, 0.0), vdTorus, meshTorus, Vector3r(3.0, 3.0, 3.0)); rb[1]->setMass(0.0); rb[1]->setFrictionCoeff(0.1); sim.setCollisionDetection(model, &cd); cd.setTolerance(0.05); const std::vector<Vector3r> *vertices1 = rb[0]->getGeometry().getVertexDataLocal().getVertices(); const unsigned int nVert1 = static_cast<unsigned int>(vertices1->size()); cd.addCollisionBox(0, CollisionDetection::CollisionObject::RigidBodyCollisionObjectType, &(*vertices1)[0], nVert1, Vector3r(100.0, 1.0, 100.0)); const std::vector<Vector3r> *vertices2 = rb[1]->getGeometry().getVertexDataLocal().getVertices(); const unsigned int nVert2 = static_cast<unsigned int>(vertices2->size()); cd.addCollisionTorus(1, CollisionDetection::CollisionObject::RigidBodyCollisionObjectType, &(*vertices2)[0], nVert2, Vector2r(3.0, 1.5)); SimulationModel::TetModelVector &tm = model.getTetModels(); ParticleData &pd = model.getParticles(); for (unsigned int i = 0; i < tm.size(); i++) { const unsigned int nVert = tm[i]->getParticleMesh().numVertices(); unsigned int offset = tm[i]->getIndexOffset(); tm[i]->setFrictionCoeff(0.1); cd.addCollisionObjectWithoutGeometry(i, CollisionDetection::CollisionObject::TetModelCollisionObjectType, &pd.getPosition(offset), nVert); } }
/** Create the rigid body model */ void createBodyModel() { SimulationModel *model = Simulation::getCurrent()->getModel(); SimulationModel::RigidBodyVector &rb = model->getRigidBodies(); SimulationModel::ConstraintVector &constraints = model->getConstraints(); string fileNameBox = FileSystem::normalizePath(base->getDataPath() + "/models/cube.obj"); IndexedFaceMesh meshBox; VertexData vdBox; loadObj(fileNameBox, vdBox, meshBox, Vector3r::Ones()); string fileNameCylinder = FileSystem::normalizePath(base->getDataPath() + "/models/cylinder.obj"); IndexedFaceMesh meshCylinder; VertexData vdCylinder; loadObj(fileNameCylinder, vdCylinder, meshCylinder, Vector3r::Ones()); string fileNameTorus = FileSystem::normalizePath(base->getDataPath() + "/models/torus.obj"); IndexedFaceMesh meshTorus; VertexData vdTorus; loadObj(fileNameTorus, vdTorus, meshTorus, Vector3r::Ones()); string fileNameCube = FileSystem::normalizePath(base->getDataPath() + "/models/cube_5.obj"); IndexedFaceMesh meshCube; VertexData vdCube; loadObj(fileNameCube, vdCube, meshCube, Vector3r::Ones()); string fileNameSphere = FileSystem::normalizePath(base->getDataPath() + "/models/sphere.obj"); IndexedFaceMesh meshSphere; VertexData vdSphere; loadObj(fileNameSphere, vdSphere, meshSphere, 2.0*Vector3r::Ones()); const unsigned int num_piles_x = 5; const unsigned int num_piles_z = 5; const Real dx_piles = 4.0; const Real dz_piles = 4.0; const Real startx_piles = -0.5 * (Real)(num_piles_x - 1)*dx_piles; const Real startz_piles = -0.5 * (Real)(num_piles_z - 1)*dz_piles; const unsigned int num_piles = num_piles_x * num_piles_z; const unsigned int num_bodies_x = 3; const unsigned int num_bodies_y = 5; const unsigned int num_bodies_z = 3; const Real dx_bodies = 6.0; const Real dy_bodies = 6.0; const Real dz_bodies = 6.0; const Real startx_bodies = -0.5 * (Real)(num_bodies_x - 1)*dx_bodies; const Real starty_bodies = 14.0; const Real startz_bodies = -0.5 * (Real)(num_bodies_z - 1)*dz_bodies; const unsigned int num_bodies = num_bodies_x * num_bodies_y * num_bodies_z; rb.resize(num_piles + num_bodies + 1); unsigned int rbIndex = 0; // floor rb[rbIndex] = new RigidBody(); rb[rbIndex]->initBody(1.0, Vector3r(0.0, -0.5, 0.0), Quaternionr(1.0, 0.0, 0.0, 0.0), vdBox, meshBox, Vector3r(100.0, 1.0, 100.0)); rb[rbIndex]->setMass(0.0); const std::vector<Vector3r> *vertices = rb[rbIndex]->getGeometry().getVertexDataLocal().getVertices(); const unsigned int nVert = static_cast<unsigned int>(vertices->size()); cd.addCollisionBox(rbIndex, CollisionDetection::CollisionObject::RigidBodyCollisionObjectType, &(*vertices)[0], nVert, Vector3r(100.0, 1.0, 100.0)); rbIndex++; Real current_z = startz_piles; for (unsigned int i = 0; i < num_piles_z; i++) { Real current_x = startx_piles; for (unsigned int j = 0; j < num_piles_x; j++) { rb[rbIndex] = new RigidBody(); rb[rbIndex]->initBody(100.0, Vector3r(current_x, 5.0, current_z), Quaternionr(1.0, 0.0, 0.0, 0.0), vdCylinder, meshCylinder, Vector3r(0.5, 10.0, 0.5)); rb[rbIndex]->setMass(0.0); const std::vector<Vector3r> *vertices = rb[rbIndex]->getGeometry().getVertexDataLocal().getVertices(); const unsigned int nVert = static_cast<unsigned int>(vertices->size()); cd.addCollisionCylinder(rbIndex, CollisionDetection::CollisionObject::RigidBodyCollisionObjectType, &(*vertices)[0], nVert, Vector2r(0.5, 10.0)); current_x += dx_piles; rbIndex++; } current_z += dz_piles; } srand((unsigned int) time(NULL)); Real current_y = starty_bodies; unsigned int currentType = 0; for (unsigned int i = 0; i < num_bodies_y; i++) { Real current_x = startx_bodies; for (unsigned int j = 0; j < num_bodies_x; j++) { Real current_z = startz_bodies; for (unsigned int k = 0; k < num_bodies_z; k++) { rb[rbIndex] = new RigidBody(); Real ax = static_cast <Real> (rand()) / static_cast <Real> (RAND_MAX); Real ay = static_cast <Real> (rand()) / static_cast <Real> (RAND_MAX); Real az = static_cast <Real> (rand()) / static_cast <Real> (RAND_MAX); Real w = static_cast <Real> (rand()) / static_cast <Real> (RAND_MAX); Quaternionr q(w, ax, ay, az); q.normalize(); currentType = rand() % 4; if (currentType == 0) { rb[rbIndex]->initBody(100.0, Vector3r(current_x, current_y, current_z), q, //Quaternionr(1.0, 0.0, 0.0, 0.0), vdTorus, meshTorus, Vector3r(2.0, 2.0, 2.0)); const std::vector<Vector3r> *vertices = rb[rbIndex]->getGeometry().getVertexDataLocal().getVertices(); const unsigned int nVert = static_cast<unsigned int>(vertices->size()); cd.addCollisionTorus(rbIndex, CollisionDetection::CollisionObject::RigidBodyCollisionObjectType, &(*vertices)[0], nVert, Vector2r(2.0, 1.0)); } else if (currentType == 1) { rb[rbIndex]->initBody(100.0, Vector3r(current_x, current_y, current_z), q, //Quaternionr(1.0, 0.0, 0.0, 0.0), vdCube, meshCube, Vector3r(4.0, 1.0, 1.0)); const std::vector<Vector3r> *vertices = rb[rbIndex]->getGeometry().getVertexDataLocal().getVertices(); const unsigned int nVert = static_cast<unsigned int>(vertices->size()); cd.addCollisionBox(rbIndex, CollisionDetection::CollisionObject::RigidBodyCollisionObjectType, &(*vertices)[0], nVert, Vector3r(4.0, 1.0, 1.0)); } else if (currentType == 2) { rb[rbIndex]->initBody(100.0, Vector3r(current_x, current_y, current_z), q, //Quaternionr(1.0, 0.0, 0.0, 0.0), vdSphere, meshSphere); const std::vector<Vector3r> *vertices = rb[rbIndex]->getGeometry().getVertexDataLocal().getVertices(); const unsigned int nVert = static_cast<unsigned int>(vertices->size()); cd.addCollisionSphere(rbIndex, CollisionDetection::CollisionObject::RigidBodyCollisionObjectType, &(*vertices)[0], nVert, 1.0); } else if (currentType == 3) { rb[rbIndex]->initBody(100.0, Vector3r(current_x, current_y, current_z), q, //Quaternionr(1.0, 0.0, 0.0, 0.0), vdCylinder, meshCylinder, Vector3r(0.75, 5.0, 0.75)); const std::vector<Vector3r> *vertices = rb[rbIndex]->getGeometry().getVertexDataLocal().getVertices(); const unsigned int nVert = static_cast<unsigned int>(vertices->size()); cd.addCollisionCylinder(rbIndex, CollisionDetection::CollisionObject::RigidBodyCollisionObjectType, &(*vertices)[0], nVert, Vector2r(0.75, 5.0)); } currentType = (currentType + 1) % 4; current_z += dz_bodies; rbIndex++; } current_x += dx_bodies; } current_y += dy_bodies; } }