|
| 1 | +import Sofa |
| 2 | +import Sofa.Core |
| 3 | +import os |
| 4 | +pathSceneFile = os.path.dirname(os.path.abspath(__file__)) |
| 5 | +pathMesh = os.path.dirname(os.path.abspath(__file__))+'/' |
| 6 | +# Units: mm, kg, s. Pressure in kPa = k (kg/(m.s^2)) = k (g/(mm.s^2) = kg/(mm.s^2) |
| 7 | + |
| 8 | +def createScene(rootNode): |
| 9 | + rootNode.addObject('VisualStyle', displayFlags='showVisualModels hideBehaviorModels showCollisionModels hideBoundingCollisionModels showForceFields showInteractionForceFields hideWireframe') |
| 10 | + rootNode.gravity=[0,-9810, 0] |
| 11 | + rootNode.dt = 0.0001 |
| 12 | + rootNode.addObject('FreeMotionAnimationLoop') |
| 13 | + rootNode.addObject('GenericConstraintSolver', name='GSSolver', maxIterations='10000', tolerance='1e-15') |
| 14 | + rootNode.addObject('CollisionPipeline', verbose="0") |
| 15 | + rootNode.addObject('BruteForceBroadPhase', name="N2") |
| 16 | + rootNode.addObject('BVHNarrowPhase') |
| 17 | + rootNode.addObject('CollisionResponse', response="FrictionContactConstraint", responseParams="mu=0.0") |
| 18 | + rootNode.addObject('LocalMinDistance', name="Proximity", alarmDistance="8.0", contactDistance="0.5", angleCone="0.01") |
| 19 | + |
| 20 | + solverNode = rootNode.addChild('solverNode') |
| 21 | + solverNode.addObject('EulerImplicitSolver', name='odesolver',firstOrder="false", rayleighStiffness='0.0', rayleighMass='0.0') |
| 22 | + solverNode.addObject('SparseLDLSolver', name="preconditioner", template="CompressedRowSparseMatrixd") |
| 23 | + solverNode.addObject('GenericConstraintCorrection', linearSolver='@preconditioner',printLog=True, name='ResReso') |
| 24 | + |
| 25 | + ########################################## |
| 26 | + # FEM Model # |
| 27 | + ########################################## |
| 28 | + |
| 29 | + sphereTranslation = [0,10,0] |
| 30 | + model = solverNode.addChild('model') |
| 31 | + model.addObject('MeshVTKLoader', name='loader', filename=pathMesh+'sphere.vtk', translation=sphereTranslation) |
| 32 | + model.addObject('Mesh',src = '@loader') |
| 33 | + model.addObject('MechanicalObject', name='tetras', template='Vec3d', showIndices='false', showIndicesScale='4e-5', rx='0',printLog="0") |
| 34 | + model.addObject('UniformMass', totalMass='0.2', printLog='0') |
| 35 | + model.addObject('TetrahedronFEMForceField', template='Vec3d',youngModulus=1.0e3) |
| 36 | + |
| 37 | + dummyActuator = rootNode.addChild('dummyActuator') |
| 38 | + dummyActuator.addObject('MechanicalObject', name = 'actuatorState', position = [0,0,0], template = 'Vec3d') |
| 39 | + |
| 40 | + modelCollis = model.addChild('modelCollis') |
| 41 | + modelCollis.addObject('MeshSTLLoader', name='loader', filename=pathMesh+'sphere.stl', rotation="0 0 0", translation=sphereTranslation) |
| 42 | + #modelCollis.addObject('MeshSTLLoader', name='loader', filename=pathMesh+'sphereFine.stl', rotation="0 0 0", translation=sphereTranslation) |
| 43 | + modelCollis.addObject('TriangleSetTopologyContainer', src='@loader', name='container') |
| 44 | + modelCollis.addObject('MechanicalObject', name='collisMO', template='Vec3d') |
| 45 | + modelCollis.addObject('TriangleCollisionModel',group="0") |
| 46 | + modelCollis.addObject('LineCollisionModel',group="0") |
| 47 | + modelCollis.addObject('PointCollisionModel',group="0") |
| 48 | + modelCollis.addObject('BarycentricMapping') |
| 49 | + |
| 50 | + rotation=[0,0,0] |
| 51 | + #rotation=[30,0,0] |
| 52 | + planeNode = rootNode.addChild('Plane') |
| 53 | + planeNode.addObject('MeshObjLoader', name='loader', filename="mesh/floorFlat.obj", triangulate="true",rotation=rotation) |
| 54 | + planeNode.addObject('Mesh', src="@loader") |
| 55 | + planeNode.addObject('MechanicalObject', src="@loader", rotation="0 0 0", translation="0 0 0", scale="1") |
| 56 | + planeNode.addObject('TriangleCollisionModel',simulated="0", moving="0",group="1",name='TriPlane') |
| 57 | + planeNode.addObject('LineCollisionModel',simulated="0", moving="0",group="1") |
| 58 | + planeNode.addObject('PointCollisionModel',simulated="0", moving="0",group="1") |
| 59 | + planeNode.addObject('OglModel',name="Visual", fileMesh="mesh/floorFlat.obj", color="1 0 0 1",rotation=rotation, translation="0 0 0", scale="1") |
| 60 | + planeNode.addObject('UncoupledConstraintCorrection') |
| 61 | + |
| 62 | + return rootNode |
0 commit comments