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