00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <sofa/helper/ArgumentParser.h>
00028 #include <sofa/simulation/tree/Simulation.h>
00029 #include <sofa/component/contextobject/CoordinateSystem.h>
00030 #include <sofa/helper/system/FileRepository.h>
00031 #include <sofa/core/objectmodel/Context.h>
00032 #include <sofa/gui/SofaGUI.h>
00033
00034
00035 #include <sofa/component/collision/DefaultPipeline.h>
00036 #include <sofa/component/collision/DefaultContactManager.h>
00037 #include <sofa/component/collision/DefaultCollisionGroupManager.h>
00038 #include <sofa/component/collision/BruteForceDetection.h>
00039 #include <sofa/component/collision/NewProximityIntersection.h>
00040 #include <sofa/component/collision/TriangleModel.h>
00041
00042
00043 #include <sofa/component/topology/MeshTopology.h>
00044 #include <sofa/component/topology/RegularGridTopology.h>
00045 #include <sofa/component/MeshLoader.h>
00046
00047
00048 #include <sofa/component/odesolver/EulerImplicitSolver.h>
00049 #include <sofa/component/linearsolver/CGLinearSolver.h>
00050 #include <sofa/simulation/common/MatrixLinearSolver.h>
00051
00052 #include <sofa/component/visualmodel/OglModel.h>
00053
00054 #include <sofa/simulation/common/TransformationVisitor.h>
00055 #include <sofa/helper/system/glut.h>
00056
00057 using sofa::component::visualmodel::OglModel;
00058
00059 using namespace sofa::simulation::tree;
00060 using namespace sofa::component::collision;
00061 using namespace sofa::component::topology;
00062 using sofa::component::MeshLoader;
00063 using sofa::component::odesolver::EulerImplicitSolver;
00064 using sofa::component::linearsolver::CGLinearSolver;
00065 using sofa::simulation::GraphScatteredMatrix;
00066 using sofa::simulation::GraphScatteredVector;
00067 typedef CGLinearSolver<GraphScatteredMatrix,GraphScatteredVector> CGLinearSolverGraph;
00068
00069
00070 #include <sofa/component/typedef/Sofa_typedef.h>
00071
00072
00073
00074 int main(int argc, char** argv)
00075 {
00076 glutInit(&argc,argv);
00077 sofa::helper::parse("This is a SOFA application.")
00078 (argc,argv);
00079 sofa::gui::SofaGUI::Init(argv[0]);
00080
00081
00082 GNode* groot = new GNode;
00083 groot->setName( "root" );
00084 groot->setGravityInWorld( Coord3(0,0,-10) );
00085
00086
00087
00088
00089
00090 DefaultPipeline* collisionPipeline = new DefaultPipeline;
00091 collisionPipeline->setName("Collision Pipeline");
00092 groot->addObject(collisionPipeline);
00093
00094
00095 BruteForceDetection* detection = new BruteForceDetection;
00096 detection->setName("Detection");
00097 groot->addObject(detection);
00098
00099
00100 NewProximityIntersection* detectionProximity = new NewProximityIntersection;
00101 detectionProximity->setName("Proximity");
00102 detectionProximity->setAlarmDistance(0.3);
00103 detectionProximity->setContactDistance(0.2);
00104 groot->addObject(detectionProximity);
00105
00106
00107
00108 DefaultContactManager* contactManager = new DefaultContactManager;
00109 contactManager->setName("Contact Manager");
00110 groot->addObject(contactManager);
00111
00112
00113 DefaultCollisionGroupManager* collisionGroupManager = new DefaultCollisionGroupManager;
00114 collisionGroupManager->setName("Collision Group Manager");
00115 groot->addObject(collisionGroupManager);
00116
00117
00118
00119
00120
00121 GNode* chain = new GNode;
00122 chain->setName("Chain");
00123 groot->addChild(chain);
00124
00125
00126
00127 GNode* torusFixed = new GNode;
00128 torusFixed->setName("Fixed");
00129 chain->addChild(torusFixed);
00130
00131 MeshLoader* loaderFixed = new MeshLoader;
00132 loaderFixed->setFilename(sofa::helper::system::DataRepository.getFile("mesh/torus_for_collision.obj"));
00133 torusFixed->addObject(loaderFixed);
00134
00135 MeshTopology* meshTorusFixed = new MeshTopology;
00136 torusFixed->addObject(meshTorusFixed);
00137
00138 MechanicalObject3* dofFixed = new MechanicalObject3; dofFixed->setName("Fixed Object");
00139 torusFixed->addObject(dofFixed);
00140
00141 TriangleModel* triangleFixed = new TriangleModel; triangleFixed->setName("Collision Fixed");
00142 triangleFixed->setSimulated(false);
00143 triangleFixed->setMoving(false);
00144 torusFixed->addObject(triangleFixed);
00145
00146 OglModel* visualFixed = new OglModel;
00147 visualFixed->setName("visual");
00148 visualFixed->load(sofa::helper::system::DataRepository.getFile("mesh/torus.obj"),"","");
00149 visualFixed->setColor("gray");
00150 torusFixed->addObject(visualFixed);
00151
00152
00153
00154
00155 GNode* torusFEM = new GNode;
00156 torusFEM->setName("FEM");
00157 chain->addChild(torusFEM);
00158
00159 EulerImplicitSolver* solverFEM = new EulerImplicitSolver;
00160 CGLinearSolverGraph* linearFEM = new CGLinearSolverGraph;
00161 solverFEM->setName("Euler Implicit");
00162 solverFEM->f_rayleighStiffness.setValue(0.01);
00163 solverFEM->f_rayleighMass.setValue(1);
00164
00165 solverFEM->setName("Conjugate Gradient");
00166 linearFEM->f_maxIter.setValue(20);
00167 linearFEM->f_smallDenominatorThreshold.setValue(0.000001);
00168 linearFEM->f_tolerance.setValue(0.001);
00169
00170 torusFEM->addObject(solverFEM);
00171 torusFEM->addObject(linearFEM);
00172
00173
00174 MeshLoader* loaderFEM = new MeshLoader;
00175 loaderFEM->setFilename(sofa::helper::system::DataRepository.getFile("mesh/torus_low_res.msh"));
00176 torusFEM->addObject(loaderFEM);
00177
00178 MeshTopology* meshTorusFEM = new MeshTopology;
00179 torusFEM->addObject(meshTorusFEM);
00180
00181 MechanicalObject3* dofFEM = new MechanicalObject3; dofFEM->setName("FEM Object");
00182 torusFEM->addObject(dofFEM);
00183
00184 UniformMass3* uniMassFEM = new UniformMass3;
00185 uniMassFEM->setTotalMass(5);
00186 torusFEM->addObject(uniMassFEM);
00187
00188 TetrahedronFEMForceField3* tetraFEMFF = new TetrahedronFEMForceField3;
00189 tetraFEMFF->setName("FEM");
00190 tetraFEMFF->setComputeGlobalMatrix(false);
00191 tetraFEMFF->setMethod("large");
00192 tetraFEMFF->setPoissonRatio(0.3);
00193 tetraFEMFF->setYoungModulus(1000);
00194 torusFEM->addObject(tetraFEMFF);
00195
00196
00197 GNode* FEMVisualNode = new GNode;
00198 FEMVisualNode->setName("Visu");
00199 torusFEM->addChild(FEMVisualNode);
00200
00201 OglModel* visualFEM = new OglModel;
00202 visualFEM->setName("visual");
00203 visualFEM->load(sofa::helper::system::DataRepository.getFile("mesh/torus.obj"),"","");
00204 visualFEM->setColor("red");
00205 FEMVisualNode->addObject(visualFEM);
00206
00207 BarycentricMapping3_to_Ext3* mappingFEM = new BarycentricMapping3_to_Ext3(dofFEM, visualFEM);
00208 mappingFEM->setName("Mapping Visual");
00209 FEMVisualNode->addObject(mappingFEM);
00210
00211
00212
00213 GNode* FEMCollisionNode = new GNode;
00214 FEMCollisionNode->setName("Visu");
00215 torusFEM->addChild(FEMCollisionNode);
00216
00217 MeshLoader* loaderFEM_surf = new MeshLoader;
00218 loaderFEM_surf->setFilename(sofa::helper::system::DataRepository.getFile("mesh/torus_for_collision.obj"));
00219 FEMCollisionNode->addObject(loaderFEM_surf);
00220
00221 MeshTopology* meshTorusFEM_surf= new MeshTopology;
00222 FEMCollisionNode->addObject(meshTorusFEM_surf);
00223
00224 MechanicalObject3* dofFEM_surf = new MechanicalObject3; dofFEM_surf->setName("Collision Object FEM");
00225 FEMCollisionNode->addObject(dofFEM_surf);
00226
00227 TriangleModel* triangleFEM = new TriangleModel;triangleFEM->setName("TriangleCollision FEM");
00228 FEMCollisionNode->addObject(triangleFEM);
00229
00230 BarycentricMechanicalMapping3_to_3* mechaMappingFEM = new BarycentricMechanicalMapping3_to_3(dofFEM, dofFEM_surf);
00231 FEMCollisionNode->addObject(mechaMappingFEM);
00232
00233
00234
00235
00236 GNode* torusSpring = new GNode;
00237 torusSpring->setName("Spring");
00238 chain->addChild(torusSpring);
00239
00240 EulerImplicitSolver* solverSpring = new EulerImplicitSolver;
00241 CGLinearSolverGraph* linearSpring = new CGLinearSolverGraph;
00242 solverSpring->setName("Euler Implicit");
00243 solverSpring->f_rayleighStiffness.setValue(0.01);
00244 solverSpring->f_rayleighMass.setValue(1);
00245
00246 linearSpring->setName("Conjugate Gradient");
00247 linearSpring->f_maxIter.setValue(20);
00248 linearSpring->f_smallDenominatorThreshold.setValue(0.000001);
00249 linearSpring->f_tolerance.setValue(0.001);
00250
00251 torusSpring->addObject(solverSpring);
00252 torusSpring->addObject(linearSpring);
00253
00254 MeshLoader* loaderSpring = new MeshLoader;
00255 loaderSpring->setFilename(sofa::helper::system::DataRepository.getFile("mesh/torus_low_res.msh"));
00256 torusSpring->addObject(loaderSpring);
00257
00258 MeshTopology* meshTorusSpring = new MeshTopology;
00259 torusSpring->addObject(meshTorusSpring);
00260
00261 MechanicalObject3* dofSpring = new MechanicalObject3; dofSpring->setName("Spring Object");
00262 torusSpring->addObject(dofSpring);
00263
00264 UniformMass3* uniMassSpring = new UniformMass3;
00265 uniMassSpring->setTotalMass(5);
00266 torusSpring->addObject(uniMassSpring);
00267
00268 MeshSpringForceField3* springFF = new MeshSpringForceField3;
00269 springFF->setName("Springs");
00270 springFF->setStiffness(400);
00271 springFF->setDamping(0);
00272 torusSpring->addObject(springFF);
00273
00274
00275 GNode* SpringVisualNode = new GNode;
00276 SpringVisualNode->setName("Visu");
00277 torusSpring->addChild(SpringVisualNode);
00278
00279 OglModel* visualSpring = new OglModel;
00280 visualSpring->setName("visual");
00281 visualSpring->load(sofa::helper::system::DataRepository.getFile("mesh/torus.obj"),"","");
00282 visualSpring->setColor("green");
00283 SpringVisualNode->addObject(visualSpring);
00284
00285 BarycentricMapping3_to_Ext3* mappingSpring = new BarycentricMapping3_to_Ext3(dofSpring, visualSpring);
00286 mappingSpring->setName("Mapping Visual");
00287 SpringVisualNode->addObject(mappingSpring);
00288
00289
00290
00291 GNode* SpringCollisionNode = new GNode;
00292 SpringCollisionNode->setName("Visu");
00293 torusSpring->addChild(SpringCollisionNode);
00294
00295 MeshLoader* loaderSpring_surf = new MeshLoader;
00296 loaderSpring_surf->setFilename(sofa::helper::system::DataRepository.getFile("mesh/torus_for_collision.obj"));
00297 SpringCollisionNode->addObject(loaderSpring_surf);
00298
00299 MeshTopology* meshTorusSpring_surf= new MeshTopology;
00300 SpringCollisionNode->addObject(meshTorusSpring_surf);
00301
00302 MechanicalObject3* dofSpring_surf = new MechanicalObject3; dofSpring_surf->setName("Collision Object Spring");
00303 SpringCollisionNode->addObject(dofSpring_surf);
00304
00305 TriangleModel* triangleSpring = new TriangleModel; triangleSpring->setName("TriangleCollision Spring");
00306 SpringCollisionNode->addObject(triangleSpring);
00307
00308 BarycentricMechanicalMapping3_to_3* mechaMappingSpring = new BarycentricMechanicalMapping3_to_3(dofSpring, dofSpring_surf);
00309 SpringCollisionNode->addObject(mechaMappingSpring);
00310
00311
00312
00313
00314 GNode* torusFFD = new GNode;
00315 torusFFD->setName("FFD");
00316 chain->addChild(torusFFD);
00317
00318 EulerImplicitSolver* solverFFD = new EulerImplicitSolver;
00319 CGLinearSolverGraph* linearFFD = new CGLinearSolverGraph;
00320 solverFFD->setName("Euler Implicit");
00321 solverFFD->f_rayleighStiffness.setValue(0.01);
00322 solverFFD->f_rayleighMass.setValue(1);
00323
00324 linearFFD->setName("Conjugate Gradient");
00325 linearFFD->f_maxIter.setValue(20);
00326 linearFFD->f_smallDenominatorThreshold.setValue(0.000001);
00327 linearFFD->f_tolerance.setValue(0.001);
00328
00329 torusFFD->addObject(solverFFD);
00330 torusFFD->addObject(linearFFD);
00331
00332 MechanicalObject3* dofFFD = new MechanicalObject3; dofFFD->setName("FFD Object");
00333 torusFFD->addObject(dofFFD);
00334
00335 UniformMass3* uniMassFFD = new UniformMass3;
00336 uniMassFFD->setTotalMass(5);
00337 torusFFD->addObject(uniMassFFD);
00338
00339 RegularGridTopology* gridTopo = new RegularGridTopology(6,2,5);
00340 gridTopo->setPos(
00341 -2.5,2.5,
00342 -0.5,0.5,
00343 -2,2
00344 );
00345 torusFFD->addObject(gridTopo);
00346
00347 RegularGridSpringForceField3* FFDFF = new RegularGridSpringForceField3;
00348 FFDFF->setName("Springs FFD");
00349 FFDFF->setStiffness(200);
00350 FFDFF->setDamping(0);
00351 torusFFD->addObject(FFDFF);
00352
00353
00354 GNode* FFDVisualNode = new GNode;
00355 FFDVisualNode->setName("Visu");
00356 torusFFD->addChild(FFDVisualNode);
00357
00358 OglModel* visualFFD = new OglModel;
00359 visualFFD->setName("visual");
00360 visualFFD->load(sofa::helper::system::DataRepository.getFile("mesh/torus.obj"),"","");
00361 visualFFD->setColor("yellow");
00362 FFDVisualNode->addObject(visualFFD);
00363
00364 BarycentricMapping3_to_Ext3* mappingFFD = new BarycentricMapping3_to_Ext3(dofFFD, visualFFD);
00365 mappingFFD->setName("Mapping Visual");
00366 FFDVisualNode->addObject(mappingFFD);
00367
00368
00369
00370 GNode* FFDCollisionNode = new GNode;
00371 FFDCollisionNode->setName("Visu");
00372 torusFFD->addChild(FFDCollisionNode);
00373
00374
00375 MeshLoader* loaderFFD_surf = new MeshLoader;
00376 loaderFFD_surf->setFilename(sofa::helper::system::DataRepository.getFile("mesh/torus_for_collision.obj"));
00377 FFDCollisionNode->addObject(loaderFFD_surf);
00378
00379 MeshTopology* meshTorusFFD_surf= new MeshTopology;
00380 FFDCollisionNode->addObject(meshTorusFFD_surf);
00381
00382 MechanicalObject3* dofFFD_surf = new MechanicalObject3; dofFFD_surf->setName("Collision Object FFD");
00383 FFDCollisionNode->addObject(dofFFD_surf);
00384
00385 TriangleModel* triangleFFD = new TriangleModel; triangleFFD->setName("TriangleCollision FFD");
00386 FFDCollisionNode->addObject(triangleFFD);
00387
00388 BarycentricMechanicalMapping3_to_3* mechaMappingFFD = new BarycentricMechanicalMapping3_to_3(dofFFD, dofFFD_surf);
00389 FFDCollisionNode->addObject(mechaMappingFFD);
00390
00391
00392
00393 GNode* torusRigid = new GNode;
00394 torusRigid->setName("Rigid");
00395 chain->addChild(torusRigid);
00396
00397
00398 EulerImplicitSolver* solverRigid = new EulerImplicitSolver;
00399 CGLinearSolverGraph* linearRigid = new CGLinearSolverGraph;
00400 solverRigid->setName("Euler Implicit");
00401 solverRigid->f_rayleighStiffness.setValue(0.01);
00402 solverRigid->f_rayleighMass.setValue(1);
00403
00404 solverRigid->setName("Conjugate Gradient");
00405 linearRigid->f_maxIter.setValue(20);
00406 linearRigid->f_smallDenominatorThreshold.setValue(0.000001);
00407 linearRigid->f_tolerance.setValue(0.001);
00408
00409 torusRigid->addObject(solverRigid);
00410 torusRigid->addObject(linearRigid);
00411
00412 MechanicalObjectRigid3* dofRigid = new MechanicalObjectRigid3; dofRigid->setName("Rigid Object");
00413 torusRigid->addObject(dofRigid);
00414
00415 UniformMassRigid3* uniMassRigid = new UniformMassRigid3;
00416 uniMassRigid->setTotalMass(1);
00417 torusRigid->addObject(uniMassRigid);
00418
00419
00420 GNode* RigidVisualNode = new GNode;
00421 RigidVisualNode->setName("Visu");
00422 torusRigid->addChild(RigidVisualNode);
00423
00424 OglModel* visualRigid = new OglModel;
00425 visualRigid->setName("visual");
00426 visualRigid->load(sofa::helper::system::DataRepository.getFile("mesh/torus.obj"),"","");
00427 visualRigid->setColor("gray");
00428 RigidVisualNode->addObject(visualRigid);
00429
00430 RigidMappingRigid3_to_Ext3* mappingRigid = new RigidMappingRigid3_to_Ext3(dofRigid, visualRigid);
00431 mappingRigid->setName("Mapping Visual");
00432 RigidVisualNode->addObject(mappingRigid);
00433
00434
00435
00436 GNode* RigidCollisionNode = new GNode;
00437 RigidCollisionNode->setName("Visu");
00438 torusRigid->addChild(RigidCollisionNode);
00439
00440 MeshLoader* loaderRigid_surf = new MeshLoader;
00441 loaderRigid_surf->setFilename(sofa::helper::system::DataRepository.getFile("mesh/torus_for_collision.obj"));
00442 RigidCollisionNode->addObject(loaderRigid_surf);
00443
00444 MeshTopology* meshTorusRigid_surf= new MeshTopology;
00445 RigidCollisionNode->addObject(meshTorusRigid_surf);
00446
00447 MechanicalObject3* dofRigid_surf = new MechanicalObject3; dofRigid_surf->setName("Collision Object Rigid");
00448 RigidCollisionNode->addObject(dofRigid_surf);
00449
00450 TriangleModel* triangleRigid = new TriangleModel; triangleRigid->setName("TriangleCollision Rigid");
00451 RigidCollisionNode->addObject(triangleRigid);
00452
00453 RigidMechanicalMappingRigid3_to_3* mechaMappingRigid = new RigidMechanicalMappingRigid3_to_3(dofRigid, dofRigid_surf);
00454 RigidCollisionNode->addObject(mechaMappingRigid);
00455
00456 getSimulation()->init(groot);
00457
00458
00459 sofa::simulation::TransformationVisitor transform;
00460 transform.setTranslation(2.5,0.0,0.0);
00461 transform.setRotation(90,0,0);
00462 transform.execute(torusFEM);
00463
00464 transform.setTranslation(5.0,0.0,0.0);
00465 transform.setRotation(0,0,0);
00466 transform.execute(torusSpring);
00467
00468 transform.setTranslation(7.5,0.0,0.0);
00469 transform.setRotation(90,0,0);
00470 transform.execute(torusFFD);
00471
00472 transform.setTranslation(10.0,0.0,0.0);
00473 transform.setRotation(00,0,0);
00474 transform.execute(torusRigid);
00475
00476
00477 groot->setAnimate(false);
00478
00479
00480
00481 sofa::gui::SofaGUI::MainLoop(groot);
00482
00483 return 0;
00484 }