Skip to content

Commit ac19ffa

Browse files
committed
Add bouncing ball example
1 parent 80f89a5 commit ac19ffa

File tree

4 files changed

+5043
-0
lines changed

4 files changed

+5043
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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

Comments
 (0)