MeshSpringForceField
Spring force field acting along the edges of a mesh Supports GPU-side computations using CUDA
Templates:
Vec1d
Vec2d
Vec3d
Target: Sofa.Component.SolidMechanics.Spring
namespace: sofa::component::solidmechanics::spring
parents:
StiffSpringForceField
Data:
Name | Description | Default value |
---|---|---|
name | object name | unnamed |
printLog | if true, emits extra messages at runtime. | 0 |
tags | list of the subsets the objet belongs to | |
bbox | this object bounding box | |
componentState | The state of the component among (Dirty, Valid, Undefined, Loading, Invalid). | Undefined |
listening | if true, handle the events, otherwise ignore the events | 0 |
isCompliance | Consider the component as a compliance, else as a stiffness | 0 |
rayleighStiffness | Rayleigh damping - stiffness matrix coefficient | 0 |
stiffness | uniform stiffness for the all springs | 100 |
damping | uniform damping for the all springs | 5 |
spring | pairs of indices, stiffness, damping, rest length | |
springsIndices1 | List of indices in springs from the first mstate | |
springsIndices2 | List of indices in springs from the second mstate | |
indices1 | Indices of the source points on the first model | |
indices2 | Indices of the fixed points on the second model | |
lengths | List of lengths to create the springs. Must have the same than indices1 & indices2, or if only one element, it will be applied to all springs. If empty, 0 will be applied everywhere | |
linesStiffness | Stiffness for the Lines | 0 |
linesDamping | Damping for the Lines | 0 |
trianglesStiffness | Stiffness for the Triangles | 0 |
trianglesDamping | Damping for the Triangles | 0 |
quadsStiffness | Stiffness for the Quads | 0 |
quadsDamping | Damping for the Quads | 0 |
tetrahedraStiffness | Stiffness for the Tetrahedra | 0 |
tetrahedraDamping | Damping for the Tetrahedra | 0 |
cubesStiffness | Stiffness for the Cubes | 0 |
cubesDamping | Damping for the Cubes | 0 |
noCompression | Only consider elongation | 0 |
localRange | optional range of local DOF indices. Any computation involving only indices outside of this range are discarded (useful for parallelization using mesh partitionning) | 4294967295 4294967295 |
Visualization | ||
showArrowSize | size of the axis | 0.01 |
drawMode | The way springs will be drawn: - 0: Line - 1:Cylinder - 2: Arrow | 0 |
drawMinElongationRange | Min range of elongation (red eongation - blue neutral - green compression) | 8 |
drawMaxElongationRange | Max range of elongation (red eongation - blue neutral - green compression) | 15 |
drawSpringSize | Size of drawed lines | 8 |
Links:
Name | Description |
---|---|
context | Graph Node containing this object (or BaseContext::getDefault() if no graph is used) |
slaves | Sub-objects used internally by this object |
master | nullptr for regular objects, or master object for which this object is one sub-objects |
mechanicalStates | List of mechanical states to which this component is associated |
object1 | First object associated to this component |
object2 | Second object associated to this component |
topology | link to the topology container |
Examples
Component/SolidMechanics/Spring/MeshSpringForceField.scn
<?xml version="1.0"?>
<Node name="root" dt="0.01" gravity="0 -9 0">
<RequiredPlugin name="Sofa.Component.Collision.Detection.Algorithm"/> <!-- Needed to use components [BVHNarrowPhase BruteForceBroadPhase CollisionPipeline] -->
<RequiredPlugin name="Sofa.Component.Collision.Detection.Intersection"/> <!-- Needed to use components [NewProximityIntersection] -->
<RequiredPlugin name="Sofa.Component.Collision.Geometry"/> <!-- Needed to use components [TriangleCollisionModel] -->
<RequiredPlugin name="Sofa.Component.Collision.Response.Contact"/> <!-- Needed to use components [CollisionResponse] -->
<RequiredPlugin name="Sofa.Component.IO.Mesh"/> <!-- Needed to use components [MeshGmshLoader MeshOBJLoader] -->
<RequiredPlugin name="Sofa.Component.LinearSolver.Iterative"/> <!-- Needed to use components [CGLinearSolver] -->
<RequiredPlugin name="Sofa.Component.Mapping.Linear"/> <!-- Needed to use components [BarycentricMapping] -->
<RequiredPlugin name="Sofa.Component.Mass"/> <!-- Needed to use components [UniformMass] -->
<RequiredPlugin name="Sofa.Component.ODESolver.Backward"/> <!-- Needed to use components [EulerImplicitSolver] -->
<RequiredPlugin name="Sofa.Component.SolidMechanics.Spring"/> <!-- Needed to use components [MeshSpringForceField] -->
<RequiredPlugin name="Sofa.Component.StateContainer"/> <!-- Needed to use components [MechanicalObject] -->
<RequiredPlugin name="Sofa.Component.Topology.Container.Constant"/> <!-- Needed to use components [MeshTopology] -->
<RequiredPlugin name="Sofa.GL.Component.Rendering3D"/> <!-- Needed to use components [OglModel] -->
<DefaultAnimationLoop/>
<CollisionPipeline depth="6" verbose="0" draw="0" />
<BruteForceBroadPhase/>
<BVHNarrowPhase/>
<NewProximityIntersection name="Proximity" alarmDistance="0.5" contactDistance="0.2" />
<CollisionResponse name="Response" response="PenalityContactForceField" />
<Node name="ChainSpring">
<Node name="TorusFixed">
<MeshOBJLoader name="loader" filename="mesh/torus2_for_collision.obj" />
<MeshTopology src="@loader" />
<MechanicalObject src="@loader" />
<TriangleCollisionModel simulated="0" moving="0" />
<MeshOBJLoader name="meshLoader_3" filename="mesh/torus2.obj" handleSeams="1" />
<OglModel name="Visual" src="@meshLoader_3" color="gray" />
</Node>
<Node name="TorusSpring1">
<EulerImplicitSolver name="cg_odesolver" printLog="false" rayleighStiffness="0.1" rayleighMass="0.1" />
<CGLinearSolver iterations="100" name="linear solver" tolerance="1.0e-9" threshold="1.0e-9" />
<MeshGmshLoader name="loader" filename="mesh/torus_low_res.msh" translation="2.5 0 0"/>
<MeshTopology src="@loader" />
<MechanicalObject src="@loader" />
<UniformMass totalMass="5" />
<MeshSpringForceField name="Springs" tetrasStiffness="1000" tetrasDamping="0" />
<Node name="Visu1">
<MeshOBJLoader name="meshLoader_0" filename="mesh/torus.obj" translation="2.5 0 0" handleSeams="1" />
<OglModel name="Visual" src="@meshLoader_0" color="green"/>
<BarycentricMapping input="@.." output="@Visual" />
</Node>
<Node name="Surf1">
<MeshOBJLoader name="loader" filename="mesh/torus_for_collision.obj" translation="2.5 0 0"/>
<MeshTopology src="@loader" />
<MechanicalObject src="@loader" />
<TriangleCollisionModel />
<BarycentricMapping />
</Node>
</Node>
<Node name="TorusSpring2">
<EulerImplicitSolver name="cg_odesolver" printLog="false" />
<CGLinearSolver iterations="25" name="linear solver" tolerance="1.0e-9" threshold="1.0e-9" />
<MeshGmshLoader name="loader" filename="mesh/torus2_low_res.msh" translation="5 0 0"/>
<MeshTopology src="@loader" />
<MechanicalObject src="@loader" />
<UniformMass totalMass="5" />
<MeshSpringForceField name="Springs" tetrasStiffness="200" tetrasDamping="0" />
<Node name="Visu2">
<MeshOBJLoader name="meshLoader_2" filename="mesh/torus2.obj" translation="5 0 0" handleSeams="1" />
<OglModel name="Visual" src="@meshLoader_2" color="blue"/>
<BarycentricMapping input="@.." output="@Visual" />
</Node>
<Node name="Surf2">
<MeshOBJLoader name="loader" filename="mesh/torus2_for_collision.obj" translation="5 0 0"/>
<MeshTopology src="@loader" />
<MechanicalObject src="@loader" />
<TriangleCollisionModel />
<BarycentricMapping />
</Node>
</Node>
<Node name="TorusSpring3">
<EulerImplicitSolver name="cg_odesolver" printLog="false" />
<CGLinearSolver iterations="100" name="linear solver" tolerance="1.0e-9" threshold="1.0e-9" />
<MeshGmshLoader name="loader" filename="mesh/torus_low_res.msh" translation="7.5 0 0"/>
<MeshTopology src="@loader" />
<MechanicalObject src="@loader" />
<UniformMass totalMass="0.5" />
<MeshSpringForceField name="Springs" tetrasStiffness="400" tetrasDamping="0" />
<Node name="Visu3">
<MeshOBJLoader name="meshLoader_1" filename="mesh/torus.obj" translation="7.5 0 0" handleSeams="1" />
<OglModel name="Visual" src="@meshLoader_1" color="green"/>
<BarycentricMapping input="@.." output="@Visual" />
</Node>
<Node name="Surf3">
<MeshOBJLoader name="loader" filename="mesh/torus_for_collision.obj" translation="7.5 0 0"/>
<MeshTopology src="@loader" />
<MechanicalObject src="@loader" />
<TriangleCollisionModel />
<BarycentricMapping />
</Node>
</Node>
<Node name="TorusSpring4">
<EulerImplicitSolver name="cg_odesolver" printLog="false" />
<CGLinearSolver iterations="100" name="linear solver" tolerance="1.0e-9" threshold="1.0e-9" />
<MeshGmshLoader name="loader" filename="mesh/torus2_low_res.msh" translation="10 0 0"/>
<MeshTopology src="@loader" />
<MechanicalObject src="@loader" />
<UniformMass totalMass="0.5" />
<MeshSpringForceField name="Springs" tetrasStiffness="400" tetrasDamping="0" />
<Node name="Visu4">
<MeshOBJLoader name="meshLoader_4" filename="mesh/torus2.obj" translation="10 0 0" handleSeams="1" />
<OglModel name="Visual" src="@meshLoader_4" color="red"/>
<BarycentricMapping input="@.." output="@Visual" />
</Node>
<Node name="Surf4">
<MeshOBJLoader name="loader" filename="mesh/torus2_for_collision.obj" translation="10 0 0"/>
<MeshTopology src="@loader" />
<MechanicalObject src="@loader" />
<TriangleCollisionModel />
<BarycentricMapping />
</Node>
</Node>
</Node>
</Node>
def createScene(rootNode):
root = rootNode.addChild('root', dt="0.01", gravity="0 -9 0")
root.addObject('RequiredPlugin', name="Sofa.Component.Collision.Detection.Algorithm")
root.addObject('RequiredPlugin', name="Sofa.Component.Collision.Detection.Intersection")
root.addObject('RequiredPlugin', name="Sofa.Component.Collision.Geometry")
root.addObject('RequiredPlugin', name="Sofa.Component.Collision.Response.Contact")
root.addObject('RequiredPlugin', name="Sofa.Component.IO.Mesh")
root.addObject('RequiredPlugin', name="Sofa.Component.LinearSolver.Iterative")
root.addObject('RequiredPlugin', name="Sofa.Component.Mapping.Linear")
root.addObject('RequiredPlugin', name="Sofa.Component.Mass")
root.addObject('RequiredPlugin', name="Sofa.Component.ODESolver.Backward")
root.addObject('RequiredPlugin', name="Sofa.Component.SolidMechanics.Spring")
root.addObject('RequiredPlugin', name="Sofa.Component.StateContainer")
root.addObject('RequiredPlugin', name="Sofa.Component.Topology.Container.Constant")
root.addObject('RequiredPlugin', name="Sofa.GL.Component.Rendering3D")
root.addObject('DefaultAnimationLoop')
root.addObject('CollisionPipeline', depth="6", verbose="0", draw="0")
root.addObject('BruteForceBroadPhase')
root.addObject('BVHNarrowPhase')
root.addObject('NewProximityIntersection', name="Proximity", alarmDistance="0.5", contactDistance="0.2")
root.addObject('CollisionResponse', name="Response", response="PenalityContactForceField")
ChainSpring = root.addChild('ChainSpring')
TorusFixed = ChainSpring.addChild('TorusFixed')
TorusFixed.addObject('MeshOBJLoader', name="loader", filename="mesh/torus2_for_collision.obj")
TorusFixed.addObject('MeshTopology', src="@loader")
TorusFixed.addObject('MechanicalObject', src="@loader")
TorusFixed.addObject('TriangleCollisionModel', simulated="0", moving="0")
TorusFixed.addObject('MeshOBJLoader', name="meshLoader_3", filename="mesh/torus2.obj", handleSeams="1")
TorusFixed.addObject('OglModel', name="Visual", src="@meshLoader_3", color="gray")
TorusSpring1 = ChainSpring.addChild('TorusSpring1')
TorusSpring1.addObject('EulerImplicitSolver', name="cg_odesolver", printLog="false", rayleighStiffness="0.1", rayleighMass="0.1")
TorusSpring1.addObject('CGLinearSolver', iterations="100", name="linear solver", tolerance="1.0e-9", threshold="1.0e-9")
TorusSpring1.addObject('MeshGmshLoader', name="loader", filename="mesh/torus_low_res.msh", translation="2.5 0 0")
TorusSpring1.addObject('MeshTopology', src="@loader")
TorusSpring1.addObject('MechanicalObject', src="@loader")
TorusSpring1.addObject('UniformMass', totalMass="5")
TorusSpring1.addObject('MeshSpringForceField', name="Springs", tetrasStiffness="1000", tetrasDamping="0")
Visu1 = TorusSpring1.addChild('Visu1')
Visu1.addObject('MeshOBJLoader', name="meshLoader_0", filename="mesh/torus.obj", translation="2.5 0 0", handleSeams="1")
Visu1.addObject('OglModel', name="Visual", src="@meshLoader_0", color="green")
Visu1.addObject('BarycentricMapping', input="@..", output="@Visual")
Surf1 = TorusSpring1.addChild('Surf1')
Surf1.addObject('MeshOBJLoader', name="loader", filename="mesh/torus_for_collision.obj", translation="2.5 0 0")
Surf1.addObject('MeshTopology', src="@loader")
Surf1.addObject('MechanicalObject', src="@loader")
Surf1.addObject('TriangleCollisionModel')
Surf1.addObject('BarycentricMapping')
TorusSpring2 = ChainSpring.addChild('TorusSpring2')
TorusSpring2.addObject('EulerImplicitSolver', name="cg_odesolver", printLog="false")
TorusSpring2.addObject('CGLinearSolver', iterations="25", name="linear solver", tolerance="1.0e-9", threshold="1.0e-9")
TorusSpring2.addObject('MeshGmshLoader', name="loader", filename="mesh/torus2_low_res.msh", translation="5 0 0")
TorusSpring2.addObject('MeshTopology', src="@loader")
TorusSpring2.addObject('MechanicalObject', src="@loader")
TorusSpring2.addObject('UniformMass', totalMass="5")
TorusSpring2.addObject('MeshSpringForceField', name="Springs", tetrasStiffness="200", tetrasDamping="0")
Visu2 = TorusSpring2.addChild('Visu2')
Visu2.addObject('MeshOBJLoader', name="meshLoader_2", filename="mesh/torus2.obj", translation="5 0 0", handleSeams="1")
Visu2.addObject('OglModel', name="Visual", src="@meshLoader_2", color="blue")
Visu2.addObject('BarycentricMapping', input="@..", output="@Visual")
Surf2 = TorusSpring2.addChild('Surf2')
Surf2.addObject('MeshOBJLoader', name="loader", filename="mesh/torus2_for_collision.obj", translation="5 0 0")
Surf2.addObject('MeshTopology', src="@loader")
Surf2.addObject('MechanicalObject', src="@loader")
Surf2.addObject('TriangleCollisionModel')
Surf2.addObject('BarycentricMapping')
TorusSpring3 = ChainSpring.addChild('TorusSpring3')
TorusSpring3.addObject('EulerImplicitSolver', name="cg_odesolver", printLog="false")
TorusSpring3.addObject('CGLinearSolver', iterations="100", name="linear solver", tolerance="1.0e-9", threshold="1.0e-9")
TorusSpring3.addObject('MeshGmshLoader', name="loader", filename="mesh/torus_low_res.msh", translation="7.5 0 0")
TorusSpring3.addObject('MeshTopology', src="@loader")
TorusSpring3.addObject('MechanicalObject', src="@loader")
TorusSpring3.addObject('UniformMass', totalMass="0.5")
TorusSpring3.addObject('MeshSpringForceField', name="Springs", tetrasStiffness="400", tetrasDamping="0")
Visu3 = TorusSpring3.addChild('Visu3')
Visu3.addObject('MeshOBJLoader', name="meshLoader_1", filename="mesh/torus.obj", translation="7.5 0 0", handleSeams="1")
Visu3.addObject('OglModel', name="Visual", src="@meshLoader_1", color="green")
Visu3.addObject('BarycentricMapping', input="@..", output="@Visual")
Surf3 = TorusSpring3.addChild('Surf3')
Surf3.addObject('MeshOBJLoader', name="loader", filename="mesh/torus_for_collision.obj", translation="7.5 0 0")
Surf3.addObject('MeshTopology', src="@loader")
Surf3.addObject('MechanicalObject', src="@loader")
Surf3.addObject('TriangleCollisionModel')
Surf3.addObject('BarycentricMapping')
TorusSpring4 = ChainSpring.addChild('TorusSpring4')
TorusSpring4.addObject('EulerImplicitSolver', name="cg_odesolver", printLog="false")
TorusSpring4.addObject('CGLinearSolver', iterations="100", name="linear solver", tolerance="1.0e-9", threshold="1.0e-9")
TorusSpring4.addObject('MeshGmshLoader', name="loader", filename="mesh/torus2_low_res.msh", translation="10 0 0")
TorusSpring4.addObject('MeshTopology', src="@loader")
TorusSpring4.addObject('MechanicalObject', src="@loader")
TorusSpring4.addObject('UniformMass', totalMass="0.5")
TorusSpring4.addObject('MeshSpringForceField', name="Springs", tetrasStiffness="400", tetrasDamping="0")
Visu4 = TorusSpring4.addChild('Visu4')
Visu4.addObject('MeshOBJLoader', name="meshLoader_4", filename="mesh/torus2.obj", translation="10 0 0", handleSeams="1")
Visu4.addObject('OglModel', name="Visual", src="@meshLoader_4", color="red")
Visu4.addObject('BarycentricMapping', input="@..", output="@Visual")
Surf4 = TorusSpring4.addChild('Surf4')
Surf4.addObject('MeshOBJLoader', name="loader", filename="mesh/torus2_for_collision.obj", translation="10 0 0")
Surf4.addObject('MeshTopology', src="@loader")
Surf4.addObject('MechanicalObject', src="@loader")
Surf4.addObject('TriangleCollisionModel')
Surf4.addObject('BarycentricMapping')