-
Notifications
You must be signed in to change notification settings - Fork 56
Expand file tree
/
Copy pathSofaScene.py
More file actions
119 lines (99 loc) · 6.2 KB
/
Copy pathSofaScene.py
File metadata and controls
119 lines (99 loc) · 6.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
from stlib.geometries.plane import PlaneParameters
from stlib.geometries.file import FileParameters
from stlib.geometries.extract import ExtractParameters
from stlib.materials.deformable import DeformableBehaviorParameters
from stlib.collision import Collision, CollisionParameters
from stlib.entities import Entity, EntityParameters
from stlib.visual import Visual, VisualParameters
from splib.core.enum_types import CollisionPrimitive, ElementType, ConstitutiveLaw
from splib.simulation.headers import setupLagrangianHeader, setupDefaultHeader
from splib.simulation.ode_solvers import addImplicitODE
from splib.simulation.linear_solvers import addLinearSolver
import dataclasses
import numpy as np
def createScene(root):
root.gravity=[0,0,9.81]
##Solvers
# setupDefaultHeader(root, displayFlags = "showVisualModels",backgroundColor=[0.8, 0.8, 0.8, 1],
# parallelComputing = True)
setupLagrangianHeader(root, displayFlags = "showVisualModels",backgroundColor=[0.8, 0.8, 0.8, 1],
parallelComputing = True,alarmDistance=0.3, contactDistance=0.02,
frictionCoef=0.5, tolerance=1.0e-4, maxIterations=20)
##Environement
planes_lengthNormal = np.array([0, 1, 0])
planes_lengthNbEdge = 1
planes_widthNbEdge = 2
planes_lengthSize = 30
planes_widthSize = 70
plane1_collisionParams = CollisionParameters()
plane1_collisionParams.name = "UP"
plane1_collisionParams.primitives = [CollisionPrimitive.TRIANGLES]
plane1_collisionParams.kwargs = {"TriangleCollision" : {"moving" : False, "simulated" : False}}
plane1_collisionParams.geometry = PlaneParameters(np.array([15,0,1]), np.array([0,0,-1]),
planes_lengthNormal, planes_lengthNbEdge, planes_widthNbEdge, planes_lengthSize, planes_widthSize)
plane1 = root.add(Collision, parameters = plane1_collisionParams)
# TODO being able to reuse already loaded geometry of current prefab to add any new sub prefab
# We need to enable to directly pass a link to an already existing prefab in place of a prefab parameter object
plane1_visu = plane1.addChild("Visu")
plane1_visu.addObject("OglModel", name="VisualModel", src="@../Geometry/container")
plane2_collisionParams = CollisionParameters()
plane2_collisionParams.name = "DOWN"
plane2_collisionParams.primitives = [CollisionPrimitive.TRIANGLES]
plane2_collisionParams.kwargs = {"TriangleCollision" : {"moving" : False, "simulated" : False}}
plane2_collisionParams.geometry = PlaneParameters(np.array([15,0,-20]), np.array([0,0,1]),
planes_lengthNormal, planes_lengthNbEdge, planes_widthNbEdge, planes_lengthSize, planes_widthSize)
plane2 = root.add(Collision, parameters = plane2_collisionParams)
plane2_visu = plane2.addChild("Visu")
plane2_visu.addObject("OglModel", name="VisualModel", src="@../Geometry/container")
## Real models
# VolumetricObjects = root.addChild("VolumetricObjects")
# addImplicitODE(VolumetricObjects)
# addLinearSolver(VolumetricObjects, constantSparsity=False, )
### Logo
LogoNode = root.addChild("LogoNode")
addImplicitODE(LogoNode)
addLinearSolver(LogoNode, constantSparsity=False, )
LogoParams = EntityParameters(name = "Logo",
geometry = FileParameters(filename="mesh/SofaScene/Logo.vtk"),
material = DeformableBehaviorParameters(),
collision = CollisionParameters(geometry = FileParameters(filename="mesh/SofaScene/LogoColli.sph")),
visual = VisualParameters(geometry = FileParameters(filename="mesh/SofaScene/LogoVisu.obj")))
LogoParams.geometry.elementType = ElementType.TETRAHEDRA
LogoParams.material.constitutiveLawType = ConstitutiveLaw.ELASTIC
LogoParams.material.parameters = [200, 0.4]
LogoParams.material.massDensity = 0.003261
LogoParams.collision.primitives = [CollisionPrimitive.SPHERES]
#TODO make this flawless with spheres. Here collisions elements are not in the topology and a link is to be made between the loader and the collision object
LogoParams.collision.kwargs = {"SphereCollision" : {"radius" : "@Geometry/loader.listRadius"}}
LogoParams.visual.color = [0.7, .35, 0, 0.8]
Logo = LogoNode.add(Entity, parameters = LogoParams)
Logo.material.addObject("ConstantForceField", name="ConstantForceUpwards", totalForce=[0, 0, -5.0])
Logo.material.addObject("LinearSolverConstraintCorrection", name="ConstraintCorrection", linearSolver=LogoNode.LinearSolver.linkpath, ODESolver=LogoNode.ODESolver.linkpath)
### S
SNode = root.addChild("SNode")
addImplicitODE(SNode)
addLinearSolver(SNode, constantSparsity=False, )
SParams = EntityParameters("bob.yaml")
SParams.name = "S"
SParams.geometry = FileParameters(filename="mesh/SofaScene/S.vtk")
SParams.geometry.elementType = ElementType.TETRAHEDRA
SParams.material = DeformableBehaviorParameters()
SParams.material.constitutiveLawType = ConstitutiveLaw.ELASTIC
SParams.material.parameters = [200, 0.45]
def SAddMaterial(node):
DeformableBehaviorParameters.addMaterial(node)
#TODO deal with that is a more smooth way in the material directly
node.addObject("LinearSolverConstraintCorrection", name="ConstraintCorrection", linearSolver=SNode.LinearSolver.linkpath, ODESolver=SNode.ODESolver.linkpath)
SParams.material.addMaterial = SAddMaterial
SParams.material.massDensity = 0.011021
SParams.collision = CollisionParameters()
SParams.collision.primitives = [CollisionPrimitive.TRIANGLES]
# # #TODO: to fix link issues for extracted geometry, it might be better to give source geometry relative link + parameters
SParams.collision.geometry = ExtractParameters(destinationType=ElementType.TRIANGLES, sourceParameters=SParams.geometry )
SParams.visual = VisualParameters()
SParams.visual.geometry = FileParameters(filename="mesh/SofaScene/SVisu.obj")
SParams.visual.color = [0.7, .7, 0.7, 0.8]
S = SNode.add(Entity, parameters = SParams)
SDensity = 0.011021
ODensity = SDensity
ADensity = 0.00693695