-
Notifications
You must be signed in to change notification settings - Fork 54
Expand file tree
/
Copy pathcollision.py
More file actions
64 lines (48 loc) · 2.68 KB
/
collision.py
File metadata and controls
64 lines (48 loc) · 2.68 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
from stlib.core.basePrefab import BasePrefab
from stlib.core.baseParameters import BaseParameters, Optional, dataclasses
from stlib.geometries import Geometry, GeometryParameters
from stlib.geometries.file import FileParameters
from splib.core.enum_types import CollisionPrimitive
from splib.core.utils import DEFAULT_VALUE
from splib.mechanics.collision_model import addCollisionModels
from Sofa.Core import Object
@dataclasses.dataclass
class CollisionParameters(BaseParameters):
name : str = "Collision"
primitives : list[CollisionPrimitive] = dataclasses.field(default_factory = lambda :[CollisionPrimitive.TRIANGLES])
selfCollision : Optional[bool] = DEFAULT_VALUE
bothSide : Optional[bool] = DEFAULT_VALUE
group : Optional[int] = DEFAULT_VALUE
contactDistance : Optional[float] = DEFAULT_VALUE
geometry : GeometryParameters = dataclasses.field(default_factory = lambda : GeometryParameters())
class Collision(BasePrefab):
def __init__(self, parameters: CollisionParameters):
BasePrefab.__init__(self, parameters)
def init(self):
geom = self.add(Geometry, parameters=self.parameters.geometry)
self.addObject("MechanicalObject", template="Vec3", position=f"@{self.parameters.geometry.name}/container.position")
for primitive in self.parameters.primitives:
addCollisionModels(self, primitive,
topology=f"@{self.parameters.geometry.name}/container",
selfCollision=self.parameters.selfCollision,
group=self.parameters.group,
**self.parameters.kwargs)
@staticmethod
def getParameters(**kwargs) -> CollisionParameters:
return CollisionParameters(**kwargs)
def createScene(root):
root.addObject("VisualStyle", displayFlags="showCollisionModels")
# Create a visual from a mesh file
parameters = Collision.getParameters()
parameters.group = 1
parameters.geometry = FileParameters(filename="mesh/cube.obj")
# Expert parameters
# parameters.kwargs = {
# "TriangleCollisionModel":{"contactStiffness": 100.0, "contactFriction": 0.5}
# }
collision = root.add(Collision, parameters=parameters)
# OR set the parameters post creation
# collision.TriangleCollisionModel.contactStiffness = 100.0
# collision.TriangleCollisionModel.contactFriction = 0.5
# collision.TriangleCollisionModel.set(contactStiffness=100.0, contactFriction=0.5) # we have information of what is possible
# collision.TriangleCollisionModel.set({"contactStiffness": 100.0, "contactFriction": 0.5}) # we can do n'importe quoi