Skip to content

Commit 423a484

Browse files
committed
Finished collisions
1 parent 00fd16b commit 423a484

File tree

4 files changed

+70
-22
lines changed

4 files changed

+70
-22
lines changed

splib/core/enum_types.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ class ConstraintType(Enum):
2323
WEAK = 2
2424
LAGRANGIAN = 3
2525

26-
26+
class CollisionPrimitive(Enum):
27+
POINTS = 1
28+
LINES = 2
29+
TRIANGLES = 3
30+
SPHERES = 4
2731

2832
class ElementType(Enum):
2933
POINTS = 1

splib/mechanics/collision_model.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
from splib.core.node_wrapper import ReusableMethod
22
from splib.core.utils import DEFAULT_VALUE
3-
from splib.core.enum_types import ElementType
3+
from splib.core.enum_types import CollisionPrimitive
44

55

66

77
@ReusableMethod
8-
def addCollisionModels(node,points=False, edges=False,triangles=False, spheres=False,tetrahedron=False,selfCollision=DEFAULT_VALUE, proximity=DEFAULT_VALUE, group=DEFAULT_VALUE, contactStiffness=DEFAULT_VALUE, contactFriction=DEFAULT_VALUE,spheresRadius=DEFAULT_VALUE,**kwargs):
9-
if(points):
10-
node.addObject("PointCollisionModel",name="PointCollision", selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group, **kwargs)
11-
if(edges):
12-
node.addObject("LineCollisionModel",name="EdgeCollision", selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group,**kwargs)
13-
if(triangles):
14-
node.addObject("TriangleCollisionModel",name="TriangleCollision", selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group,**kwargs)
15-
if(spheres):
16-
node.addObject("SphereCollisionModel",name="SphereCollision", selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group, radius=spheresRadius, **kwargs)
17-
if(tetrahedron):
18-
node.addObject("TetrahedronCollisionModel",name="TetraCollision", selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group,**kwargs)
8+
def addCollisionModels(node, primitive : CollisionPrimitive, topology=DEFAULT_VALUE, selfCollision=DEFAULT_VALUE, proximity=DEFAULT_VALUE, group=DEFAULT_VALUE, contactStiffness=DEFAULT_VALUE, contactFriction=DEFAULT_VALUE,spheresRadius=DEFAULT_VALUE,**kwargs):
9+
match primitive:
10+
case CollisionPrimitive.POINTS:
11+
node.addObject("PointCollisionModel",name="PointCollision", topology=topology, selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group, **kwargs)
12+
return
13+
case CollisionPrimitive.LINES:
14+
node.addObject("LineCollisionModel",name="EdgeCollision", topology=topology, selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group,**kwargs)
15+
return
16+
case CollisionPrimitive.TRIANGLES:
17+
node.addObject("TriangleCollisionModel",name="TriangleCollision", topology=topology, selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group,**kwargs)
18+
return
19+
case CollisionPrimitive.SPHERES:
20+
node.addObject("SphereCollisionModel",name="SphereCollision", topology=topology, selfCollision=selfCollision, proximity=proximity, contactStiffness=contactStiffness, contactFriction=contactFriction, group=group, radius=spheresRadius, **kwargs)
21+
return
22+
case _:
23+
return
24+
25+
#Cube and tetra are missing.
26+
27+

stlib/prefabs/collision.py

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,56 @@
11
from stlib.core.basePrefab import BasePrefab
22
from stlib.core.baseParameters import BaseParameters, Callable, Optional, dataclasses, Any
3-
from stlib.geometry import GeometryParameters
3+
from stlib.geometry import Geometry, GeometryParameters
4+
from stlib.geometry.file import FileParameters
5+
from splib.core.enum_types import CollisionPrimitive
6+
from splib.core.utils import DEFAULT_VALUE
7+
from splib.mechanics.collision_model import addCollisionModels
48
from Sofa.Core import Object
59

610
@dataclasses.dataclass
711
class CollisionParameters(BaseParameters):
8-
primitives : list[Any] #TODO: add enum type in splib
12+
primitives : list[CollisionPrimitive] = dataclasses.field(default_factory = lambda :[CollisionPrimitive.POINTS])
913

10-
geometry : GeometryParameters
11-
addMapping : Callable
14+
selfCollision : Optional[bool] = DEFAULT_VALUE
15+
proximity : Optional[float] = DEFAULT_VALUE
16+
group : Optional[int] = DEFAULT_VALUE
17+
contactStiffness : Optional[float] = DEFAULT_VALUE
18+
contactFriction : Optional[float] = DEFAULT_VALUE
19+
spheresRadius : Optional[float] = DEFAULT_VALUE
1220

21+
geometry : GeometryParameters = dataclasses.field(default_factory = lambda : GeometryParameters())
22+
addMapping : Optional[Callable] = None
1323

14-
class Collision(BasePrefab):
1524

16-
def __init__(self, params: GeometryParameters):
25+
class Collision(BasePrefab):
26+
def __init__(self, params: CollisionParameters):
1727
BasePrefab.__init__(self, params)
1828

29+
geom = self.add(Geometry, params.geometry)
30+
31+
self.addObject("MechanicalObject",template="Vec3", position=f"@{params.geometry.name}/container.position")
32+
for primitive in params.primitives:
33+
addCollisionModels(self,primitive,
34+
topology=f"@{params.geometry.name}/container",
35+
selfCollision=params.selfCollision,
36+
proximity=params.proximity,
37+
group=params.group,
38+
contactStiffness=params.contactStiffness,
39+
contactFriction=params.contactFriction,
40+
spheresRadius=params.spheresRadius,
41+
**params.kwargs)
42+
43+
if params.addMapping is not None:
44+
params.addMapping(self)
45+
46+
@staticmethod
47+
def getParameters(**kwargs) -> CollisionParameters:
48+
return CollisionParameters(**kwargs)
49+
50+
51+
def createScene(root):
52+
53+
# Create a visual from a mesh file
54+
params = Collision.getParameters()
55+
params.geometry = FileParameters(filename="mesh/cube.obj")
56+
root.add(Collision, params)

stlib/prefabs/visual.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ class VisualParameters(BaseParameters):
1414

1515

1616
class Visual(BasePrefab):
17-
container : Object # This should be more specialized into the right SOFA type
18-
modifier : Optional[Object]
19-
2017
def __init__(self, params: VisualParameters):
2118
BasePrefab.__init__(self, params)
2219

0 commit comments

Comments
 (0)