CompositeCollisionPipeline
Multiple collision pipelines in one.
Target: Sofa.Component.Collision.Detection.Algorithm
namespace: sofa::component::collision::detection::algorithm
parents:
- Pipeline
- Base
Data
| Name | Description | Default value |
|---|---|---|
| name | object name | unnamed |
| printLog | if true, emits extra messages at runtime. | 0 |
| tags | list of the subsets the object 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 |
| nbThreads | If not yet initialized, the main task scheduler is initialized with this number of threads. 0 corresponds to the number of available cores on the CPU. -n (minus) corresponds to the number of available cores on the CPU minus the provided number. | 0 |
| taskSchedulerType | Type of task scheduler to use. | _default |
| parallelDetection | Parallelize collision detection. | 0 |
Links
| Name | Description | Destination type name |
|---|---|---|
| context | Graph Node containing this object (or BaseContext::getDefault() if no graph is used) | BaseContext |
| slaves | Sub-objects used internally by this object | BaseObject |
| master | nullptr for regular objects, or master object for which this object is one sub-objects | BaseObject |
| subCollisionPipelines | List of sub collision pipelines to handle. | BaseSubCollisionPipeline |
Examples
CompositeCollisionPipeline.scn
<?xml version="1.0"?>
<Node name="root" dt="0.01">
<RequiredPlugin name="Sofa.Component.Collision.Detection.Algorithm"/> <!-- Needed to use components [BruteForceBroadPhase,CollisionPipeline,RayTraceNarrowPhase] -->
<RequiredPlugin name="Sofa.Component.Collision.Detection.Intersection"/> <!-- Needed to use components [NewProximityIntersection] -->
<RequiredPlugin name="Sofa.Component.Collision.Geometry"/> <!-- Needed to use components [LineCollisionModel,PointCollisionModel,SphereCollisionModel,TriangleCollisionModel] -->
<RequiredPlugin name="Sofa.Component.Collision.Response.Contact"/> <!-- Needed to use components [CollisionResponse] -->
<RequiredPlugin name="Sofa.Component.IO.Mesh"/> <!-- Needed to use components [MeshOBJLoader] -->
<RequiredPlugin name="Sofa.Component.LinearSolver.Iterative"/> <!-- Needed to use components [CGLinearSolver] -->
<RequiredPlugin name="Sofa.Component.Mapping.Linear"/> <!-- Needed to use components [IdentityMapping] -->
<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.StateContainer"/> <!-- Needed to use components [MechanicalObject] -->
<RequiredPlugin name="Sofa.Component.Topology.Container.Constant"/> <!-- Needed to use components [MeshTopology] -->
<RequiredPlugin name="Sofa.Component.Visual"/> <!-- Needed to use components [VisualStyle] -->
<DefaultAnimationLoop/>
<VisualStyle displayFlags="showVisualModels hideBehaviorModels showCollisionModels hideMappings hideForceFields" />
<MeshOBJLoader name="torus_loader" filename="mesh/torus.obj" />
<Node name="FixedTorusAndFallingSphere_1" >
<Node name="FallingSphere" >
<EulerImplicitSolver name="odesolver" />
<CGLinearSolver name="linear_solver" iterations="250" tolerance="1.0e-9" threshold="1.0e-9" />
<MechanicalObject name="rigid" template="Rigid3d" position="-5 10 0 0 0 0 1" />
<UniformMass totalMass="1.0" />
<Node name="Collision" >
<MechanicalObject name="collision_rigid"/>
<SphereCollisionModel name="sphere" radius="1" contactStiffness="1"/>
<IdentityMapping input="@../rigid" output="@collision_rigid" />
</Node>
</Node>
<Node name="FixedTorus" >
<Node name="Collision" >
<MechanicalObject name="collision_torus" src="@../../../torus_loader" translation="-5 0 0" scale3d="0.8 0.8 0.8"/>
<MeshTopology name="topology" src="@../../../torus_loader"/>
<TriangleCollisionModel name="triangle_collision" simulated="0" moving="0" contactStiffness="1" />
<LineCollisionModel name="line_collision" simulated="0" moving="0" contactStiffness="1" />
<PointCollisionModel name="point_collision" simulated="0" moving="0" contactStiffness="1" />
</Node>
</Node>
</Node>
<Node name="FixedTorusAndFallingSphere_2" >
<Node name="FallingSphere" >
<EulerImplicitSolver name="odesolver" />
<CGLinearSolver name="linear_solver" iterations="250" tolerance="1.0e-9" threshold="1.0e-9" />
<MechanicalObject name="rigid" template="Rigid3d" position="5 10 0 0 0 0 1" />
<UniformMass totalMass="1.0" />
<Node name="Collision" >
<MechanicalObject name="collision_rigid"/>
<SphereCollisionModel name="sphere" radius="0.7" contactStiffness="1" />
<IdentityMapping input="@../rigid" output="@collision_rigid" />
</Node>
</Node>
<Node name="FixedTorus" >
<Node name="Collision" >
<MechanicalObject name="collision_torus" src="@../../../torus_loader" translation="5 0 0" scale3d="0.5 0.5 0.5"/>
<MeshTopology name="topology" src="@../../../torus_loader"/>
<TriangleCollisionModel name="triangle_collision" simulated="0" moving="0" contactStiffness="1" />
<LineCollisionModel name="line_collision" simulated="0" moving="0" contactStiffness="1" />
<PointCollisionModel name="point_collision" simulated="0" moving="0" contactStiffness="1" />
</Node>
</Node>
</Node>
<BruteForceBroadPhase name="broad_phase_large"/>
<BVHNarrowPhase name="narrow_phase_large"/>
<NewProximityIntersection name="intersection_large" alarmDistance="5" contactDistance="1" />
<CollisionResponse name="response_large" response="PenalityContactForceField" />
<SubCollisionPipeline name="collision_pipeline_large"
collisionModels="@/FixedTorusAndFallingSphere_1/FallingSphere/Collision/sphere
@FixedTorusAndFallingSphere_1/FixedTorus/Collision/triangle_collision @FixedTorusAndFallingSphere_1/FixedTorus/Collision/line_collision @FixedTorusAndFallingSphere_1/FixedTorus/Collision/point_collision"
broadPhaseDetection="@broad_phase_large"
narrowPhaseDetection="@narrow_phase_large"
intersectionMethod="@intersection_large"
contactManager="@response_large"
/>
<BruteForceBroadPhase name="broad_phase_small"/>
<BVHNarrowPhase name="narrow_phase_small"/>
<NewProximityIntersection name="intersection_small" alarmDistance="2.5" contactDistance="0.6" />
<CollisionResponse name="response_small" response="PenalityContactForceField" />
<SubCollisionPipeline name="collision_pipeline_small"
collisionModels="@FixedTorusAndFallingSphere_2/FallingSphere/Collision/sphere
@FixedTorusAndFallingSphere_2/FixedTorus/Collision/triangle_collision @FixedTorusAndFallingSphere_2/FixedTorus/Collision/line_collision @FixedTorusAndFallingSphere_2/FixedTorus/Collision/point_collision"
broadPhaseDetection="@broad_phase_small"
narrowPhaseDetection="@narrow_phase_small"
intersectionMethod="@intersection_small"
contactManager="@response_small"
/>
<CompositeCollisionPipeline name="composite_pipeline" subCollisionPipelines="@collision_pipeline_large @collision_pipeline_small"/>
</Node>
def createScene(root_node):
root = root_node.addChild('root', dt="0.01")
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.StateContainer")
root.addObject('RequiredPlugin', name="Sofa.Component.Topology.Container.Constant")
root.addObject('RequiredPlugin', name="Sofa.Component.Visual")
root.addObject('DefaultAnimationLoop', )
root.addObject('VisualStyle', displayFlags="showVisualModels hideBehaviorModels showCollisionModels hideMappings hideForceFields")
root.addObject('MeshOBJLoader', name="torus_loader", filename="mesh/torus.obj")
fixed_torus_and_falling_sphere_1 = root.addChild('FixedTorusAndFallingSphere_1')
falling_sphere = FixedTorusAndFallingSphere_1.addChild('FallingSphere')
falling_sphere.addObject('EulerImplicitSolver', name="odesolver")
falling_sphere.addObject('CGLinearSolver', name="linear_solver", iterations="250", tolerance="1.0e-9", threshold="1.0e-9")
falling_sphere.addObject('MechanicalObject', name="rigid", template="Rigid3d", position="-5 10 0 0 0 0 1")
falling_sphere.addObject('UniformMass', totalMass="1.0")
collision = FallingSphere.addChild('Collision')
collision.addObject('MechanicalObject', name="collision_rigid")
collision.addObject('SphereCollisionModel', name="sphere", radius="1", contactStiffness="1")
collision.addObject('IdentityMapping', input="@../rigid", output="@collision_rigid")
fixed_torus = FixedTorusAndFallingSphere_1.addChild('FixedTorus')
collision = FixedTorus.addChild('Collision')
collision.addObject('MechanicalObject', name="collision_torus", src="@../../../torus_loader", translation="-5 0 0", scale3d="0.8 0.8 0.8")
collision.addObject('MeshTopology', name="topology", src="@../../../torus_loader")
collision.addObject('TriangleCollisionModel', name="triangle_collision", simulated="0", moving="0", contactStiffness="1")
collision.addObject('LineCollisionModel', name="line_collision", simulated="0", moving="0", contactStiffness="1")
collision.addObject('PointCollisionModel', name="point_collision", simulated="0", moving="0", contactStiffness="1")
fixed_torus_and_falling_sphere_2 = root.addChild('FixedTorusAndFallingSphere_2')
falling_sphere = FixedTorusAndFallingSphere_2.addChild('FallingSphere')
falling_sphere.addObject('EulerImplicitSolver', name="odesolver")
falling_sphere.addObject('CGLinearSolver', name="linear_solver", iterations="250", tolerance="1.0e-9", threshold="1.0e-9")
falling_sphere.addObject('MechanicalObject', name="rigid", template="Rigid3d", position="5 10 0 0 0 0 1")
falling_sphere.addObject('UniformMass', totalMass="1.0")
collision = FallingSphere.addChild('Collision')
collision.addObject('MechanicalObject', name="collision_rigid")
collision.addObject('SphereCollisionModel', name="sphere", radius="0.7", contactStiffness="1")
collision.addObject('IdentityMapping', input="@../rigid", output="@collision_rigid")
fixed_torus = FixedTorusAndFallingSphere_2.addChild('FixedTorus')
collision = FixedTorus.addChild('Collision')
collision.addObject('MechanicalObject', name="collision_torus", src="@../../../torus_loader", translation="5 0 0", scale3d="0.5 0.5 0.5")
collision.addObject('MeshTopology', name="topology", src="@../../../torus_loader")
collision.addObject('TriangleCollisionModel', name="triangle_collision", simulated="0", moving="0", contactStiffness="1")
collision.addObject('LineCollisionModel', name="line_collision", simulated="0", moving="0", contactStiffness="1")
collision.addObject('PointCollisionModel', name="point_collision", simulated="0", moving="0", contactStiffness="1")
root.addObject('BruteForceBroadPhase', name="broad_phase_large")
root.addObject('BVHNarrowPhase', name="narrow_phase_large")
root.addObject('NewProximityIntersection', name="intersection_large", alarmDistance="5", contactDistance="1")
root.addObject('CollisionResponse', name="response_large", response="PenalityContactForceField")
root.addObject('SubCollisionPipeline', name="collision_pipeline_large", collisionModels="@/FixedTorusAndFallingSphere_1/FallingSphere/Collision/sphere @FixedTorusAndFallingSphere_1/FixedTorus/Collision/triangle_collision @FixedTorusAndFallingSphere_1/FixedTorus/Collision/line_collision @FixedTorusAndFallingSphere_1/FixedTorus/Collision/point_collision", broadPhaseDetection="@broad_phase_large", narrowPhaseDetection="@narrow_phase_large", intersectionMethod="@intersection_large", contactManager="@response_large")
root.addObject('BruteForceBroadPhase', name="broad_phase_small")
root.addObject('BVHNarrowPhase', name="narrow_phase_small")
root.addObject('NewProximityIntersection', name="intersection_small", alarmDistance="2.5", contactDistance="0.6")
root.addObject('CollisionResponse', name="response_small", response="PenalityContactForceField")
root.addObject('SubCollisionPipeline', name="collision_pipeline_small", collisionModels="@FixedTorusAndFallingSphere_2/FallingSphere/Collision/sphere @FixedTorusAndFallingSphere_2/FixedTorus/Collision/triangle_collision @FixedTorusAndFallingSphere_2/FixedTorus/Collision/line_collision @FixedTorusAndFallingSphere_2/FixedTorus/Collision/point_collision", broadPhaseDetection="@broad_phase_small", narrowPhaseDetection="@narrow_phase_small", intersectionMethod="@intersection_small", contactManager="@response_small")
root.addObject('CompositeCollisionPipeline', name="composite_pipeline", subCollisionPipelines="@collision_pipeline_large @collision_pipeline_small")
CompositeCollisionPipeline_none.scn
<?xml version="1.0"?>
<Node name="root" dt="0.01">
<RequiredPlugin name="Sofa.Component.Collision.Detection.Algorithm"/> <!-- Needed to use components [BruteForceBroadPhase,CollisionPipeline,RayTraceNarrowPhase] -->
<RequiredPlugin name="Sofa.Component.Collision.Detection.Intersection"/> <!-- Needed to use components [NewProximityIntersection] -->
<RequiredPlugin name="Sofa.Component.Collision.Geometry"/> <!-- Needed to use components [LineCollisionModel,PointCollisionModel,SphereCollisionModel,TriangleCollisionModel] -->
<RequiredPlugin name="Sofa.Component.Collision.Response.Contact"/> <!-- Needed to use components [CollisionResponse] -->
<RequiredPlugin name="Sofa.Component.IO.Mesh"/> <!-- Needed to use components [MeshOBJLoader] -->
<RequiredPlugin name="Sofa.Component.LinearSolver.Iterative"/> <!-- Needed to use components [CGLinearSolver] -->
<RequiredPlugin name="Sofa.Component.Mapping.Linear"/> <!-- Needed to use components [IdentityMapping] -->
<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.StateContainer"/> <!-- Needed to use components [MechanicalObject] -->
<RequiredPlugin name="Sofa.Component.Topology.Container.Constant"/> <!-- Needed to use components [MeshTopology] -->
<RequiredPlugin name="Sofa.Component.Visual"/> <!-- Needed to use components [VisualStyle] -->
<DefaultAnimationLoop/>
<CollisionPipeline />
<BruteForceBroadPhase/>
<BVHNarrowPhase/>
<NewProximityIntersection name="Proximity" alarmDistance="5" contactDistance="1" />
<CollisionResponse name="Response" response="PenalityContactForceField" />
<VisualStyle displayFlags="showVisualModels hideBehaviorModels showCollisionModels hideMappings hideForceFields" />
<MeshOBJLoader name="torus_loader" filename="mesh/torus.obj" />
<Node name="FixedTorusAndFallingSphere_1" >
<Node name="FallingSphere" >
<EulerImplicitSolver name="odesolver" />
<CGLinearSolver name="linear_solver" iterations="250" tolerance="1.0e-9" threshold="1.0e-9" />
<MechanicalObject name="rigid" template="Rigid3d" position="-5 10 0 0 0 0 1" />
<UniformMass totalMass="1.0" />
<Node name="Collision" >
<MechanicalObject name="collision_rigid"/>
<SphereCollisionModel name="sphere" radius="1" contactStiffness="1"/>
<IdentityMapping input="@../rigid" output="@collision_rigid" />
</Node>
</Node>
<Node name="FixedTorus" >
<Node name="Collision" >
<MechanicalObject name="collision_torus" src="@../../../torus_loader" translation="-5 0 0" scale3d="0.8 0.8 0.8"/>
<MeshTopology name="topology" src="@../../../torus_loader"/>
<TriangleCollisionModel simulated="0" moving="0" contactStiffness="1" />
<LineCollisionModel simulated="0" moving="0" contactStiffness="1" />
<PointCollisionModel simulated="0" moving="0" contactStiffness="1" />
</Node>
</Node>
</Node>
<Node name="FixedTorusAndFallingSphere_2" >
<Node name="FallingSphere" >
<EulerImplicitSolver name="odesolver" />
<CGLinearSolver name="linear_solver" iterations="250" tolerance="1.0e-9" threshold="1.0e-9" />
<MechanicalObject name="rigid" template="Rigid3d" position="5 10 0 0 0 0 1" />
<UniformMass totalMass="1.0" />
<Node name="Collision" >
<MechanicalObject name="collision_rigid"/>
<SphereCollisionModel name="sphere" radius="0.7" contactStiffness="1" />
<IdentityMapping input="@../rigid" output="@collision_rigid" />
</Node>
</Node>
<Node name="FixedTorus" >
<Node name="Collision" >
<MechanicalObject name="collision_torus" src="@../../../torus_loader" translation="5 0 0" scale3d="0.5 0.5 0.5"/>
<MeshTopology name="topology" src="@../../../torus_loader"/>
<TriangleCollisionModel simulated="0" moving="0" contactStiffness="1"/>
<LineCollisionModel simulated="0" moving="0" contactStiffness="1" />
<PointCollisionModel simulated="0" moving="0" contactStiffness="1" />
</Node>
</Node>
</Node>
</Node>
def createScene(root_node):
root = root_node.addChild('root', dt="0.01")
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.StateContainer")
root.addObject('RequiredPlugin', name="Sofa.Component.Topology.Container.Constant")
root.addObject('RequiredPlugin', name="Sofa.Component.Visual")
root.addObject('DefaultAnimationLoop', )
root.addObject('CollisionPipeline', )
root.addObject('BruteForceBroadPhase', )
root.addObject('BVHNarrowPhase', )
root.addObject('NewProximityIntersection', name="Proximity", alarmDistance="5", contactDistance="1")
root.addObject('CollisionResponse', name="Response", response="PenalityContactForceField")
root.addObject('VisualStyle', displayFlags="showVisualModels hideBehaviorModels showCollisionModels hideMappings hideForceFields")
root.addObject('MeshOBJLoader', name="torus_loader", filename="mesh/torus.obj")
fixed_torus_and_falling_sphere_1 = root.addChild('FixedTorusAndFallingSphere_1')
falling_sphere = FixedTorusAndFallingSphere_1.addChild('FallingSphere')
falling_sphere.addObject('EulerImplicitSolver', name="odesolver")
falling_sphere.addObject('CGLinearSolver', name="linear_solver", iterations="250", tolerance="1.0e-9", threshold="1.0e-9")
falling_sphere.addObject('MechanicalObject', name="rigid", template="Rigid3d", position="-5 10 0 0 0 0 1")
falling_sphere.addObject('UniformMass', totalMass="1.0")
collision = FallingSphere.addChild('Collision')
collision.addObject('MechanicalObject', name="collision_rigid")
collision.addObject('SphereCollisionModel', name="sphere", radius="1", contactStiffness="1")
collision.addObject('IdentityMapping', input="@../rigid", output="@collision_rigid")
fixed_torus = FixedTorusAndFallingSphere_1.addChild('FixedTorus')
collision = FixedTorus.addChild('Collision')
collision.addObject('MechanicalObject', name="collision_torus", src="@../../../torus_loader", translation="-5 0 0", scale3d="0.8 0.8 0.8")
collision.addObject('MeshTopology', name="topology", src="@../../../torus_loader")
collision.addObject('TriangleCollisionModel', simulated="0", moving="0", contactStiffness="1")
collision.addObject('LineCollisionModel', simulated="0", moving="0", contactStiffness="1")
collision.addObject('PointCollisionModel', simulated="0", moving="0", contactStiffness="1")
fixed_torus_and_falling_sphere_2 = root.addChild('FixedTorusAndFallingSphere_2')
falling_sphere = FixedTorusAndFallingSphere_2.addChild('FallingSphere')
falling_sphere.addObject('EulerImplicitSolver', name="odesolver")
falling_sphere.addObject('CGLinearSolver', name="linear_solver", iterations="250", tolerance="1.0e-9", threshold="1.0e-9")
falling_sphere.addObject('MechanicalObject', name="rigid", template="Rigid3d", position="5 10 0 0 0 0 1")
falling_sphere.addObject('UniformMass', totalMass="1.0")
collision = FallingSphere.addChild('Collision')
collision.addObject('MechanicalObject', name="collision_rigid")
collision.addObject('SphereCollisionModel', name="sphere", radius="0.7", contactStiffness="1")
collision.addObject('IdentityMapping', input="@../rigid", output="@collision_rigid")
fixed_torus = FixedTorusAndFallingSphere_2.addChild('FixedTorus')
collision = FixedTorus.addChild('Collision')
collision.addObject('MechanicalObject', name="collision_torus", src="@../../../torus_loader", translation="5 0 0", scale3d="0.5 0.5 0.5")
collision.addObject('MeshTopology', name="topology", src="@../../../torus_loader")
collision.addObject('TriangleCollisionModel', simulated="0", moving="0", contactStiffness="1")
collision.addObject('LineCollisionModel', simulated="0", moving="0", contactStiffness="1")
collision.addObject('PointCollisionModel', simulated="0", moving="0", contactStiffness="1")