Main.cpp

Go to the documentation of this file.
00001 /******************************************************************************
00002 *       SOFA, Simulation Open-Framework Architecture, version 1.0 beta 3      *
00003 *                (c) 2006-2008 MGH, INRIA, USTL, UJF, CNRS                    *
00004 *                                                                             *
00005 * This program is free software; you can redistribute it and/or modify it     *
00006 * under the terms of the GNU General Public License as published by the Free  *
00007 * Software Foundation; either version 2 of the License, or (at your option)   *
00008 * any later version.                                                          *
00009 *                                                                             *
00010 * This program is distributed in the hope that it will be useful, but WITHOUT *
00011 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
00012 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
00013 * more details.                                                               *
00014 *                                                                             *
00015 * You should have received a copy of the GNU General Public License along     *
00016 * with this program; if not, write to the Free Software Foundation, Inc., 51  *
00017 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.                   *
00018 *******************************************************************************
00019 *                            SOFA :: Applications                             *
00020 *                                                                             *
00021 * Authors: M. Adam, J. Allard, B. Andre, P-J. Bensoussan, S. Cotin, C. Duriez,*
00022 * H. Delingette, F. Falipou, F. Faure, S. Fonteneau, L. Heigeas, C. Mendoza,  *
00023 * M. Nesme, P. Neumann, J-P. de la Plata Alcade, F. Poyer and F. Roy          *
00024 *                                                                             *
00025 * Contact information: contact@sofa-framework.org                             *
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 //Including components for collision detection
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 //Including component for topological description of the objects
00043 #include <sofa/component/topology/MeshTopology.h> 
00044 #include <sofa/component/topology/RegularGridTopology.h> 
00045 #include <sofa/component/MeshLoader.h>
00046 
00047 //Including Solvers
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 //Using double by default, if you have SOFA_FLOAT in use in you sofa-default.cfg, then it will be FLOAT.
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     // The graph root node
00082     GNode* groot = new GNode;
00083     groot->setName( "root" );
00084     groot->setGravityInWorld( Coord3(0,0,-10) );
00085     
00086     
00087     //Components for collision management
00088     //------------------------------------
00089     //--> adding collision pipeline
00090     DefaultPipeline* collisionPipeline = new DefaultPipeline;
00091     collisionPipeline->setName("Collision Pipeline");
00092     groot->addObject(collisionPipeline);   
00093 
00094     //--> adding collision detection system
00095     BruteForceDetection* detection = new BruteForceDetection;
00096     detection->setName("Detection");
00097     groot->addObject(detection);
00098 
00099     //--> adding component to detection intersection of elements
00100     NewProximityIntersection* detectionProximity = new NewProximityIntersection;
00101     detectionProximity->setName("Proximity");
00102     detectionProximity->setAlarmDistance(0.3);   //warning distance
00103     detectionProximity->setContactDistance(0.2); //min distance before setting a spring to create a repulsion
00104     groot->addObject(detectionProximity);
00105 
00106     
00107     //--> adding contact manager
00108     DefaultContactManager* contactManager = new DefaultContactManager;
00109     contactManager->setName("Contact Manager");
00110     groot->addObject(contactManager);    
00111 
00112     //--> adding component to handle groups of collision.
00113     DefaultCollisionGroupManager* collisionGroupManager = new DefaultCollisionGroupManager;
00114     collisionGroupManager->setName("Collision Group Manager");
00115     groot->addObject(collisionGroupManager);
00116 
00117     
00118     
00119     //Elements of the scene
00120     //------------------------------------
00121     GNode* chain = new GNode;
00122     chain->setName("Chain");
00123     groot->addChild(chain);
00124 
00125     //************************************
00126     //Torus Fixed
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); //Not simulated, fixed object
00143     triangleFixed->setMoving(false);    //No extern events 
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     //Torus FEM
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); //iteration maxi for the CG
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); //the whole object will have 5 as given mass
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     //Node VISUAL
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     //Node COLLISION
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     //Torus Spring
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); //iteration maxi for the CG
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); //the whole object will have 5 as given mass
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     //Node VISUAL
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     //Node COLLISION
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     //Torus FFD
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); //iteration maxi for the CG
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); //the whole object will have 5 as given mass
00337     torusFFD->addObject(uniMassFFD);
00338 
00339     RegularGridTopology* gridTopo = new RegularGridTopology(6,2,5); //dimension of the grid
00340     gridTopo->setPos(
00341              -2.5,2.5,  //Xmin, Xmax
00342              -0.5,0.5,  //Ymin, Ymax
00343              -2,2       //Zmin, Zmax
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     //Node VISUAL
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     //Node COLLISION
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     //Torus Rigid
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); //iteration maxi for the CG
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); //the whole object will have 5 as given mass
00417     torusRigid->addObject(uniMassRigid);
00418 
00419     //Node VISUAL
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     //Node COLLISION
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     //Set the initial position: must be done AFTER the initialization of the scene    
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     // Run the main loop
00481     sofa::gui::SofaGUI::MainLoop(groot);
00482 
00483     return 0;
00484 }

Generated on Sun Nov 23 02:28:34 2008 for Sofa by  doxygen 1.5.7.1