Skip to content

Material Options

A material selects the solver that simulates an entity and that solver's physical parameters: rigid (and kinematic) bodies, MPM, SPH, PBD and FEM deformables, and the Eden-hosted Mochi solver. Set it as an entity's material field. The physics guide explains each solver.

from eden.options.materials import RigidMaterialOptions

RigidMaterialOptions(gravity_compensation=1.0)  # gravity compensation is a material field

A Mochi scene is all-Mochi: every entity, the ground plane included, takes a Mochi*MaterialOptions.

Material options for rigid, MPM, SPH, FEM, PBD, and Mochi entities.

Attributes

Classes

MaterialOptions

MaterialOptions(**data)

Bases: ConfigurableOptions

Options for Genesis materials.

Subclasses set _genesis_material_cls to the corresponding gs.materials.* class; to_genesis_material then forwards every declared field through.

PARAMETER DESCRIPTION
use_visual_raycasting

If True, the entity's visual mesh is included in the raycaster BVH used by Lidar / DepthCamera sensors, and by a viewer plugin casting against visual geometry (MeshPointSelectorPlugin(use_visual_geom=True)). Required for non-colliding background meshes (e.g. photogrammetry GLBs with collision=False) to be hit by lidar rays. Must be set before scene.build(). Default is False.

TYPE: bool

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

use_visual_raycasting class-attribute instance-attribute
use_visual_raycasting: bool = False

Methods:

to_genesis_material
to_genesis_material()
Source code in eden/options/materials.py
def to_genesis_material(self):
    cls = self._genesis_material_cls
    if cls is None:
        raise NotImplementedError(f"{type(self).__name__} does not implement to_genesis_material()")
    # Drop None-valued fields so Genesis applies its own (often lazily-resolved)
    # defaults rather than seeing an explicit ``None``. Several Genesis materials
    # reject an explicit ``sampler=None`` even though it is their ``__init__``
    # default (e.g. ``gs.materials.MPM.Elastic``), so forwarding None would make
    # ``MPMElasticMaterialOptions()`` unusable.
    return cls(**{k: v for k, v in self.dict().items() if v is not None})

KinematicMaterialOptions

KinematicMaterialOptions(**data)

Bases: MaterialOptions

Options for Genesis kinematic materials.

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

RigidMaterialOptions

RigidMaterialOptions(**data)

Bases: MaterialOptions

Options for Genesis rigid materials.

PARAMETER DESCRIPTION
rho

The density of the material used to compute mass. Default is 200.0.

TYPE: float

friction

Friction coefficient within the rigid solver. If None, a default of 1.0 may be used or parsed from file.

TYPE: float

friction_torsional

Torsional friction coefficient: how strongly a contact resists relative spin about its normal. Expressed in meters — it is the effective contact-patch radius, and it bounds the resisting torque at friction_torsional * normal_force. Requires EnvOptions.enable_torsional_friction (Eden raises at build if the switch is off) and costs one extra constraint axis per contact. If None, parsed from the asset when available (MJCF friction[1], only for geoms declaring condim >= 4), otherwise genesis' 0.005. Default is None.

TYPE: float

friction_rolling

Rolling friction coefficient: how strongly a contact resists rolling about its two tangent axes. In meters like friction_torsional. Requires EnvOptions.enable_rolling_friction (which itself requires enable_torsional_friction) and costs two extra constraint axes per contact. If None, parsed from the asset when available (MJCF friction[2], only for geoms declaring condim >= 6), otherwise genesis' 0.0001. Default is None.

TYPE: float

needs_coup

Whether the material participates in coupling with other solvers. Default is True.

TYPE: bool

coup_friction

Friction used during coupling. Must be non-negative. Default is 0.1.

TYPE: float

coup_softness

Softness of coupling interaction. Must be non-negative. Default is 0.002.

TYPE: float

coup_restitution

Restitution coefficient in collision coupling. Should be between 0 and 1. Default is 0.0.

TYPE: float

sdf_cell_size

Cell size in SDF grid in meters. Defines grid resolution. Default is 0.005.

TYPE: float

sdf_min_res

Minimum resolution of the SDF grid. Must be at least 16. Default is 32.

TYPE: int

sdf_max_res

Maximum resolution of the SDF grid. Must be >= sdf_min_res. Default is 128.

TYPE: int

gravity_compensation

Compensation factor for gravity. 1.0 cancels gravity. Default is 0.

TYPE: float

coup_type

Coupling mode for this entity. Only used by the IPC coupler. Requires needs_coup=True. If None, auto-selected based on entity type: 'external_articulation' for fixed-base articulated robots, 'two_way_soft_constraint' for floating-base robots, and 'ipc_only' for non-articulated objects. Valid values: - 'two_way_soft_constraint': Two-way soft coupling. - 'external_articulation': Joint-level coupling for articulated bodies. Joint positions will be coupled at the DOF level. - 'ipc_only': IPC controls entity, transforms copied to Genesis (one-way). Only supported by rigid non-articulated objects. Default is None.

TYPE: str or None

coup_links

Link names to include in coupling. When set, only the named links participate in coupling; other links are excluded. Only supported with needs_coup=True and two_way_soft_constraint type in IPC. Default is None.

TYPE: list of str or None

enable_coup_collision

Whether coupler collision is enabled for this entity's links. Only used by the IPC coupler. Unlike needs_coup=False (which removes the entity from the coupler entirely), setting this to False keeps the entity in the coupler for coupling forces but disables contact response. Default is True.

TYPE: bool

coup_collision_links

Link names whose geoms participate in coupler collision. Only used by the IPC coupler. Only effective when enable_coup_collision=True. If None, all coupled links have collision. When set, only the named links get coupler collision; other links are marked no-collision. Default is None.

TYPE: list of str or None

contact_resistance

IPC coupling contact resistance/stiffness override for this entity. None means use IPCCouplerOptions.contact_resistance. Default is None.

TYPE: float or None

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

rho class-attribute instance-attribute
rho: float = 200.0
friction class-attribute instance-attribute
friction: float | None = None
friction_torsional class-attribute instance-attribute
friction_torsional: float | None = Field(default=None, ge=0.0)
friction_rolling class-attribute instance-attribute
friction_rolling: float | None = Field(default=None, ge=0.0)
needs_coup class-attribute instance-attribute
needs_coup: bool = True
coup_friction class-attribute instance-attribute
coup_friction: float = 0.1
coup_softness class-attribute instance-attribute
coup_softness: float = 0.002
coup_restitution class-attribute instance-attribute
coup_restitution: float = 0.0
sdf_cell_size class-attribute instance-attribute
sdf_cell_size: float = 0.005
sdf_min_res class-attribute instance-attribute
sdf_min_res: int = 32
sdf_max_res class-attribute instance-attribute
sdf_max_res: int = 128
gravity_compensation class-attribute instance-attribute
gravity_compensation: float = 0.0
coup_type class-attribute instance-attribute
coup_type: Literal['two_way_soft_constraint', 'external_articulation', 'ipc_only'] | None = None
coup_links: list[str] | None = None
enable_coup_collision class-attribute instance-attribute
enable_coup_collision: bool = True
coup_collision_links: list[str] | None = None
contact_resistance class-attribute instance-attribute
contact_resistance: float | None = None

MPMElasticMaterialOptions

MPMElasticMaterialOptions(**data)

Bases: MaterialOptions

Options for Genesis MPM elastic materials.

PARAMETER DESCRIPTION
E

Young's modulus. Default is 3e5.

nu

Poisson ratio. Default is 0.2.

rho

Density (kg/m^3). Default is 1000.

lam

The first Lame's parameter. Default is None, computed by E and nu.

mu

The second Lame's parameter. Default is None, computed by E and nu.

sampler

Particle sampler ('pbs', 'regular', 'random'). Note that 'pbs' is only supported on Linux x86 for now. Defaults to 'pbs' on supported platforms, 'random' otherwise.

model

Stress model ('corotation', 'neohooken'). Default is 'corotation'.

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

E class-attribute instance-attribute
E: float = 300000.0
nu class-attribute instance-attribute
nu: float = 0.2
rho class-attribute instance-attribute
rho: float = 1000.0
lam class-attribute instance-attribute
lam: float | None = None
mu class-attribute instance-attribute
mu: float | None = None
sampler class-attribute instance-attribute
sampler: str | None = None
model class-attribute instance-attribute
model: Literal['corotation', 'neohooken'] = 'corotation'

MPMElastoPlasticMaterialOptions

MPMElastoPlasticMaterialOptions(**data)

Bases: MaterialOptions

Options for an MPM elasto-plastic material.

PARAMETER DESCRIPTION
E

Young's modulus. Default is 1e6.

nu

Poisson ratio. Default is 0.2.

rho

Density (kg/m^3). Default is 1000.

lam

The first Lame's parameter. Default is None, computed by E and nu.

mu

The second Lame's parameter. Default is None, computed by E and nu.

sampler

Particle sampler ('pbs', 'regular', 'random'). Note that 'pbs' is only supported on Linux x86 for now. Defaults to 'pbs' on supported platforms, 'random' otherwise.

yield_lower

Lower bound for the yield clamp (ignored if using von Mises). Default is 2.5e-2.

yield_higher

Upper bound for the yield clamp (ignored if using von Mises). Default is 4.5e-2.

use_von_mises

Whether to use von Mises yield criterion. Default is True.

von_mises_yield_stress

Yield stress for von Mises criterion. Default is 10000.

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

E class-attribute instance-attribute
E: float = 1000000.0
nu class-attribute instance-attribute
nu: float = 0.2
rho class-attribute instance-attribute
rho: float = 1000.0
lam class-attribute instance-attribute
lam: float | None = None
mu class-attribute instance-attribute
mu: float | None = None
sampler class-attribute instance-attribute
sampler: str | None = None
yield_lower class-attribute instance-attribute
yield_lower: float = 0.025
yield_higher class-attribute instance-attribute
yield_higher: float = 0.045
use_von_mises class-attribute instance-attribute
use_von_mises: bool = True
von_mises_yield_stress class-attribute instance-attribute
von_mises_yield_stress: float = 10000.0

MPMLiquidMaterialOptions

MPMLiquidMaterialOptions(**data)

Bases: MaterialOptions

Options for an MPM liquid material.

PARAMETER DESCRIPTION
E

Young's modulus. Default is 1e6.

nu

Poisson ratio. Default is 0.2.

rho

Density (kg/m^3). Default is 1000.

lam

The first Lame's parameter. Default is None, computed by E and nu.

mu

The second Lame's parameter. Default is None, computed by E and nu.

viscous

Whether the liquid is viscous. Simply set mu to zero when non-viscous. Default is False.

sampler

Particle sampler ('pbs', 'regular', 'random'). Note that 'pbs' is only supported on Linux x86 for now. Defaults to 'pbs' on supported platforms, 'random' otherwise.

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

E class-attribute instance-attribute
E: float = 1000000.0
nu class-attribute instance-attribute
nu: float = 0.2
rho class-attribute instance-attribute
rho: float = 1000.0
lam class-attribute instance-attribute
lam: float | None = None
mu class-attribute instance-attribute
mu: float | None = None
viscous class-attribute instance-attribute
viscous: bool = False
sampler class-attribute instance-attribute
sampler: str | None = None

MPMSandMaterialOptions

MPMSandMaterialOptions(**data)

Bases: MaterialOptions

Options for an MPM sand (granular) material.

PARAMETER DESCRIPTION
E

Young's modulus. Default is 1e6.

nu

Poisson ratio. Default is 0.2.

rho

Density (kg/m^3). Default is 1000.

lam

The first Lame's parameter. Default is None, computed by E and nu.

mu

The second Lame's parameter. Default is None, computed by E and nu.

friction_angle

Internal friction angle of the granular material (degrees). Default is 45.

sampler

Particle sampler ('pbs', 'regular', 'random'). Note that 'pbs' is only supported on Linux x86 for now. Defaults to 'pbs' on supported platforms, 'random' otherwise.

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

E class-attribute instance-attribute
E: float = 1000000.0
nu class-attribute instance-attribute
nu: float = 0.2
rho class-attribute instance-attribute
rho: float = 1000.0
lam class-attribute instance-attribute
lam: float | None = None
mu class-attribute instance-attribute
mu: float | None = None
friction_angle class-attribute instance-attribute
friction_angle: float = 45.0
sampler class-attribute instance-attribute
sampler: str | None = None

SPHLiquidMaterialOptions

SPHLiquidMaterialOptions(**data)

Bases: MaterialOptions

Options for an SPH liquid material.

PARAMETER DESCRIPTION
rho

The rest density (kg/m^3) the material tends to maintain in equilibrium. Default is 1000.

stiffness

State stiffness (N/m^2): how pressure increases with compression. Default is 50000.0.

exponent

State exponent: how nonlinearly pressure scales with density. Larger values mean a stiffer response to compression. Default is 7.0.

mu

The viscosity of the liquid. Default is 0.005.

gamma

The surface tension of the liquid: how strongly the material "clumps" together at boundaries. Default is 0.01.

sampler

Particle sampler ('pbs', 'regular', 'random'). 'pbs' is only supported on Linux x86. Default is 'regular': SPH is sensitive to the initial particle distribution, which sets the initial density and pressure fields. Irregular samplers ('pbs', 'random') introduce local density fluctuations at initialization, which cause large spurious pressure forces and can make the simulation unstable or diverge.

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

rho class-attribute instance-attribute
rho: float = 1000.0
stiffness class-attribute instance-attribute
stiffness: float = 50000.0
exponent class-attribute instance-attribute
exponent: float = 7.0
mu class-attribute instance-attribute
mu: float = 0.005
gamma class-attribute instance-attribute
gamma: float = 0.01
sampler class-attribute instance-attribute
sampler: str = 'regular'

PBDLiquidMaterialOptions

PBDLiquidMaterialOptions(**data)

Bases: MaterialOptions

Options for Genesis PBD (Position-Based Dynamics) liquid materials.

Particle-based fluid simulated with the PBD solver. The PBD solver's simulation domain (lower_bound/upper_bound) and iteration counts are configured via EnvOptions.pbd_options (a gs.options.PBDOptions). If left unset, genesis uses its PBD defaults (a (-100, -100, 0)..(100, 100, 100) domain) — set it to bound the domain to the working volume. Position/orientation are baked into the morph at creation time (set_pos/set_quat raise on the resulting entity).

PARAMETER DESCRIPTION
rho

Rest density of the fluid. Default is 1000.0.

TYPE: float

sampler

Particle sampler ('pbs', 'random', 'regular'). 'pbs' is only supported on Linux x86. Default is 'pbs'.

TYPE: str

density_relaxation

Relaxation factor for the density (incompressibility) constraint. Larger values enforce incompressibility more strongly per iteration. Default is 0.2.

TYPE: float

viscosity_relaxation

Relaxation factor for the XSPH viscosity constraint. Larger values make the fluid more viscous. Default is 0.01.

TYPE: float

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

rho class-attribute instance-attribute
rho: float = 1000.0
sampler class-attribute instance-attribute
sampler: Literal['pbs', 'random', 'regular'] = 'pbs'
density_relaxation class-attribute instance-attribute
density_relaxation: float = 0.2
viscosity_relaxation class-attribute instance-attribute
viscosity_relaxation: float = 0.01

PBDClothMaterialOptions

PBDClothMaterialOptions(**data)

Bases: MaterialOptions

Options for Genesis PBD (Position-Based Dynamics) cloth materials.

Thin-shell cloth simulated as a particle/edge network with the PBD solver. Built from a triangle mesh morph (e.g. EntityOptions(file="meshes/cloth.obj")). The PBD solver iteration counts are configured via EnvOptions.pbd_options (genesis defaults are used if unset). Individual particles can be pinned via the underlying Genesis entity's fix_particles / find_closest_particle (accessible through entity.entity).

PARAMETER DESCRIPTION
rho

Surface density of the cloth. Default is 4.0.

TYPE: float

static_friction

Static friction coefficient for particle contact. Default is 0.15.

TYPE: float

kinetic_friction

Kinetic friction coefficient for particle contact. Default is 0.15.

TYPE: float

stretch_compliance

Compliance (inverse stiffness) of the stretch constraint. Smaller values make the cloth less stretchy. Default is 1e-7.

TYPE: float

bending_compliance

Compliance (inverse stiffness) of the bending constraint. Smaller values make the cloth resist folding more. Default is 1e-5.

TYPE: float

stretch_relaxation

Relaxation factor for the stretch constraint per iteration. Default is 0.3.

TYPE: float

bending_relaxation

Relaxation factor for the bending constraint per iteration. Default is 0.1.

TYPE: float

air_resistance

Air drag applied to the cloth particles. Default is 0.001.

TYPE: float

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

rho class-attribute instance-attribute
rho: float = 4.0
static_friction class-attribute instance-attribute
static_friction: float = 0.15
kinetic_friction class-attribute instance-attribute
kinetic_friction: float = 0.15
stretch_compliance class-attribute instance-attribute
stretch_compliance: float = 1e-07
bending_compliance class-attribute instance-attribute
bending_compliance: float = 1e-05
stretch_relaxation class-attribute instance-attribute
stretch_relaxation: float = 0.3
bending_relaxation class-attribute instance-attribute
bending_relaxation: float = 0.1
air_resistance class-attribute instance-attribute
air_resistance: float = 0.001

PBDElasticMaterialOptions

PBDElasticMaterialOptions(**data)

Bases: MaterialOptions

Options for Genesis PBD (Position-Based Dynamics) elastic (soft-body) materials.

Volumetric soft body simulated with the PBD solver, governed by stretch, bending, and volume-preservation constraints. The PBD solver is configured via EnvOptions.pbd_options (genesis defaults are used if unset).

PARAMETER DESCRIPTION
rho

Material density. Default is 1000.0.

TYPE: float

static_friction

Static friction coefficient for particle contact. Default is 0.15.

TYPE: float

kinetic_friction

Kinetic friction coefficient for particle contact. Default is 0.15.

TYPE: float

stretch_compliance

Compliance (inverse stiffness) of the stretch constraint. Default is 0.0.

TYPE: float

bending_compliance

Compliance (inverse stiffness) of the bending constraint. Default is 0.0.

TYPE: float

volume_compliance

Compliance (inverse stiffness) of the volume-preservation constraint. Default is 0.0.

TYPE: float

stretch_relaxation

Relaxation factor for the stretch constraint per iteration. Default is 0.1.

TYPE: float

bending_relaxation

Relaxation factor for the bending constraint per iteration. Default is 0.1.

TYPE: float

volume_relaxation

Relaxation factor for the volume constraint per iteration. Default is 0.1.

TYPE: float

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

rho class-attribute instance-attribute
rho: float = 1000.0
static_friction class-attribute instance-attribute
static_friction: float = 0.15
kinetic_friction class-attribute instance-attribute
kinetic_friction: float = 0.15
stretch_compliance class-attribute instance-attribute
stretch_compliance: float = 0.0
bending_compliance class-attribute instance-attribute
bending_compliance: float = 0.0
volume_compliance class-attribute instance-attribute
volume_compliance: float = 0.0
stretch_relaxation class-attribute instance-attribute
stretch_relaxation: float = 0.1
bending_relaxation class-attribute instance-attribute
bending_relaxation: float = 0.1
volume_relaxation class-attribute instance-attribute
volume_relaxation: float = 0.1

PBDParticleMaterialOptions

PBDParticleMaterialOptions(**data)

Bases: MaterialOptions

Options for Genesis PBD (Position-Based Dynamics) free-particle materials.

Bare particles driven by the PBD solver with no internal constraints (collide and respond to gravity only). The PBD solver is configured via EnvOptions.pbd_options (genesis defaults are used if unset).

PARAMETER DESCRIPTION
rho

Material density. Default is 1000.0.

TYPE: float

sampler

Particle sampler ('pbs', 'random', 'regular'). 'pbs' is only supported on Linux x86. Default is 'pbs'.

TYPE: str

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

rho class-attribute instance-attribute
rho: float = 1000.0
sampler class-attribute instance-attribute
sampler: Literal['pbs', 'random', 'regular'] = 'pbs'

FEMElasticMaterialOptions

FEMElasticMaterialOptions(**data)

Bases: MaterialOptions

Options for Genesis FEM elastic materials.

Used for volumetric deformable bodies (tetrahedralized meshes) simulated with the FEM solver. When an IPC coupler is active, these entities participate in penetration-free frictional contact.

PARAMETER DESCRIPTION
E

Young's modulus controlling stiffness. Default is 1e6.

TYPE: float

nu

Poisson ratio describing volume change under stress. Default is 0.2.

TYPE: float

rho

Material density (kg/m^3). Default is 1000.

TYPE: float

model

Constitutive model ('linear', 'stable_neohookean', 'linear_corotated'). Default is 'linear'.

TYPE: str

friction_mu

Friction coefficient. Default is 0.1.

TYPE: float

contact_resistance

IPC contact resistance/stiffness override. None uses the coupler global default. Default is None.

TYPE: float or None

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

E class-attribute instance-attribute
E: float = 1000000.0
nu class-attribute instance-attribute
nu: float = 0.2
rho class-attribute instance-attribute
rho: float = 1000.0
model class-attribute instance-attribute
model: Literal['linear', 'stable_neohookean', 'linear_corotated'] = 'linear'
friction_mu class-attribute instance-attribute
friction_mu: float = 0.1
contact_resistance class-attribute instance-attribute
contact_resistance: float | None = None

FEMClothMaterialOptions

FEMClothMaterialOptions(**data)

Bases: MaterialOptions

Options for Genesis FEM cloth (thin shell) materials.

Used for cloth, fabric, and thin flexible surfaces simulated as 2D shells in the IPC backend. Requires an IPC coupler and GPU backend.

PARAMETER DESCRIPTION
E

Young's modulus (Pa) controlling stiffness. Default is 1e4.

TYPE: float

nu

Poisson ratio. Default is 0.49 (nearly incompressible).

TYPE: float

rho

Material density (kg/m^3). Default is 200.

TYPE: float

thickness

Shell thickness in meters. Default is 0.001 (1mm).

TYPE: float

bending_stiffness

Bending resistance. None disables bending. Default is None.

TYPE: float or None

model

FEM material model. Default is 'stable_neohookean'.

TYPE: str

friction_mu

Friction coefficient. Default is 0.1.

TYPE: float

contact_resistance

IPC contact resistance/stiffness override. None uses the coupler global default. Default is None.

TYPE: float or None

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

E class-attribute instance-attribute
E: float = 10000.0
nu class-attribute instance-attribute
nu: float = 0.49
rho class-attribute instance-attribute
rho: float = 200.0
thickness class-attribute instance-attribute
thickness: float = 0.001
bending_stiffness class-attribute instance-attribute
bending_stiffness: float | None = None
model class-attribute instance-attribute
model: Literal['linear', 'stable_neohookean', 'linear_corotated'] = 'stable_neohookean'
friction_mu class-attribute instance-attribute
friction_mu: float = 0.1
contact_resistance class-attribute instance-attribute
contact_resistance: float | None = None

FEMMuscleMaterialOptions

FEMMuscleMaterialOptions(**data)

Bases: MaterialOptions

Options for Genesis FEM muscle materials.

Extends FEM elastic material with muscle activation support for soft-body actuation.

PARAMETER DESCRIPTION
E

Young's modulus. Default is 1e6.

TYPE: float

nu

Poisson ratio. Default is 0.2.

TYPE: float

rho

Material density (kg/m^3). Default is 1000.

TYPE: float

model

Constitutive model. Default is 'linear'.

TYPE: str

n_groups

Number of muscle groups. Default is 1.

TYPE: int

friction_mu

Friction coefficient. Default is 0.1.

TYPE: float

contact_resistance

IPC contact resistance/stiffness override. Default is None.

TYPE: float or None

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

E class-attribute instance-attribute
E: float = 1000000.0
nu class-attribute instance-attribute
nu: float = 0.2
rho class-attribute instance-attribute
rho: float = 1000.0
model class-attribute instance-attribute
model: Literal['linear', 'stable_neohookean', 'linear_corotated'] = 'linear'
n_groups class-attribute instance-attribute
n_groups: int = 1
friction_mu class-attribute instance-attribute
friction_mu: float = 0.1
contact_resistance class-attribute instance-attribute
contact_resistance: float | None = None

MochiMaterialOptions

MochiMaterialOptions(**data)

Bases: MaterialOptions

Base of every Mochi (implicit multi-physics solver) material.

Not usable directly — pick :class:MochiRigidMaterialOptions, :class:MochiElasticMaterialOptions, :class:MochiShellMaterialOptions or :class:MochiRodMaterialOptions. A scene holding one Mochi entity must hold only Mochi (and kinematic) entities: the MochiSolver assembles every body and the penalty contact into one Newton system and refuses to run beside another physics solver. The shared contact parameters below are combined per contact pair as documented on each field.

PARAMETER DESCRIPTION
use_visual_raycasting

See :class:MaterialOptions. Default is False.

TYPE: bool

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

friction class-attribute instance-attribute
friction: float = 0.5
penalty_coefficient class-attribute instance-attribute
penalty_coefficient: float = 1000000000.0
penalty_smoothing_half_distance class-attribute instance-attribute
penalty_smoothing_half_distance: float = 0.005
penalty_threshold class-attribute instance-attribute
penalty_threshold: float = 0.001
friction_falloff_vel class-attribute instance-attribute
friction_falloff_vel: float = 0.01
viscous_friction class-attribute instance-attribute
viscous_friction: float = 0.0
normal_viscous_damping class-attribute instance-attribute
normal_viscous_damping: float = 0.0
max_alignment_normals class-attribute instance-attribute
max_alignment_normals: float = 0.0
has_gravity class-attribute instance-attribute
has_gravity: bool = True
contact_layer class-attribute instance-attribute
contact_layer: str = 'default'

MochiRigidMaterialOptions

MochiRigidMaterialOptions(**data)

Bases: MochiMaterialOptions

Options for Mochi rigid and articulated bodies (eden.engine.solvers.mochi.materials.Rigid).

Deliberately not a :class:RigidMaterialOptions: the Mochi solver has no coupler, so the coup_* / gravity_compensation / needs_coup fields do not exist here (Genesis rejects them on Mochi.Rigid; gravity is switched per body with has_gravity). Entities carrying this material build as :class:~eden.entities.mochi.MochiRigidEntity, which keeps the whole rigid-entity API (DOFs, PD control, IK, attach_to) minus force ranges, friction loss and constraint-solver parameters, which the solver never reads.

PARAMETER DESCRIPTION
use_visual_raycasting

See :class:MaterialOptions. Default is False.

TYPE: bool

rho

Density (kg/m^3) used to derive mass and inertia when the asset gives none; overrides per-geometry densities declared in the asset. Default is 1000.0.

TYPE: float

collider_type

How other bodies collide against this one: an analytic plane/sphere/box, a signed distance field of the mesh, or nothing. "auto" picks from the morph. An analytic field needs the matching primitive morph (the solver raises at build otherwise). Default is "auto".

TYPE: ('auto', 'plane', 'sphere', 'box', 'sdf', 'none') DEFAULT: "auto"

sdf_cell_size

Cell size (m) of the SDF grid built for collider_type="sdf". Default is 2.5e-3.

TYPE: float

sdf_min_res

Minimum SDF grid resolution. Default is 32.

TYPE: int

sdf_max_res

Maximum SDF grid resolution. Default is 128.

TYPE: int

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

rho class-attribute instance-attribute
rho: float = 1000.0
collider_type class-attribute instance-attribute
collider_type: Literal['auto', 'plane', 'sphere', 'box', 'sdf', 'none'] = 'auto'
sdf_cell_size class-attribute instance-attribute
sdf_cell_size: float = 0.0025
sdf_min_res class-attribute instance-attribute
sdf_min_res: int = 32
sdf_max_res class-attribute instance-attribute
sdf_max_res: int = 128

MochiElasticMaterialOptions

MochiElasticMaterialOptions(**data)

Bases: MochiMaterialOptions

Options for Mochi volumetric soft bodies (eden.engine.solvers.mochi.materials.Elastic).

Linear tetrahedra with a stable neo-Hookean, Saint Venant-Kirchhoff or linear material, solved fully implicitly together with contact. Box / Sphere / Cylinder / Mesh morphs are tetrahedralized by tetgen (pass morph={"maxvolume": ..., "nobisect": False} on the primitive to refine); a .node (tetgen) or .vtk (legacy ASCII unstructured grid) file is read as-is. Entities build as :class:~eden.entities.mochi.MochiSoftEntity.

PARAMETER DESCRIPTION
use_visual_raycasting

See :class:MaterialOptions. Default is False.

TYPE: bool

E

Young's modulus (Pa). Default is 1e5.

TYPE: float

nu

Poisson ratio. Default is 0.45.

TYPE: float

rho

Density (kg/m^3). Default is 1000.0.

TYPE: float

model

Constitutive model. Default is "stable_neohookean".

TYPE: ('stable_neohookean', 'stvk', 'linear') DEFAULT: "stable_neohookean"

mass_damping

Rayleigh mass-proportional damping (1/s). Default is 0.0.

TYPE: float

stiffness_damping

Rayleigh stiffness-proportional damping (s). Default is 0.0.

TYPE: float

collider_type

How other bodies collide against this body: a signed distance field of the rest shape queried through the deformed tetrahedra (no contact skin — a few millimeters of interpenetration remain), or nothing. Default is "auto".

TYPE: ('auto', 'sdf', 'none') DEFAULT: "auto"

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

E class-attribute instance-attribute
E: float = 100000.0
nu class-attribute instance-attribute
nu: float = 0.45
rho class-attribute instance-attribute
rho: float = 1000.0
model class-attribute instance-attribute
model: Literal['stable_neohookean', 'stvk', 'linear'] = 'stable_neohookean'
mass_damping class-attribute instance-attribute
mass_damping: float = 0.0
stiffness_damping class-attribute instance-attribute
stiffness_damping: float = 0.0
collider_type class-attribute instance-attribute
collider_type: Literal['auto', 'sdf', 'none'] = 'auto'

MochiShellMaterialOptions

MochiShellMaterialOptions(**data)

Bases: MochiMaterialOptions

Options for Mochi thin shells / cloth (eden.engine.solvers.mochi.materials.Shell).

The surface triangles of a Mesh (or primitive) morph become a Saint Venant-Kirchhoff membrane plus a Koiter-type bending term, both thickness-integrated from E, nu, rho and thickness unless overridden. Shells act as colliders through spheres of collider_radius at their vertices, which only other point-cloud bodies (cloths, rods) and — with self_contact — the shell itself feel; rigid bodies and solids touch the shell through its own contact samples. Consistently wound meshes are required. Light cloth has little inertia: use penalty_coefficient=1e7. Entities build as :class:~eden.entities.mochi.MochiSoftEntity.

PARAMETER DESCRIPTION
use_visual_raycasting

See :class:MaterialOptions. Default is False.

TYPE: bool

E

Young's modulus (Pa). Default is 1e4.

TYPE: float

nu

Poisson ratio. Default is 0.3.

TYPE: float

rho

Density (kg/m^3); areal density is rho * thickness. Default is 200.0.

TYPE: float

thickness

Shell thickness (m). Default is 1e-3.

TYPE: float

membrane_mu

Membrane shear stiffness override; None derives thickness * mu. Default is None.

TYPE: float or None

membrane_lambda

Membrane Lame lambda override (plane stress); None derives it. Default is None.

TYPE: float or None

bending_alpha

Bending stiffness override, D * nu when None. Default is None.

TYPE: float or None

bending_beta

Bending stiffness override, D * (1 - nu) when None. Default is None.

TYPE: float or None

mass_damping

Rayleigh mass-proportional damping (1/s). Default is 0.0.

TYPE: float

stiffness_damping

Rayleigh stiffness-proportional damping (s). Default is 0.0.

TYPE: float

collider_type

Whether the shell carries vertex spheres other point-cloud bodies collide with. Default is "auto".

TYPE: ('auto', 'point_cloud', 'none') DEFAULT: "auto"

collider_radius

Radius (m) of the vertex spheres. Default is 1e-2.

TYPE: float

self_contact

Let the shell's samples collide with its own vertex spheres. Default is False.

TYPE: bool

self_contact_exclusion_ratio

Vertices within collider_radius * ratio (plus the penalty threshold) of a sample in the rest configuration are excluded from self-contact. Default is 1.5.

TYPE: float

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

E class-attribute instance-attribute
E: float = 10000.0
nu class-attribute instance-attribute
nu: float = 0.3
rho class-attribute instance-attribute
rho: float = 200.0
thickness class-attribute instance-attribute
thickness: float = 0.001
membrane_mu class-attribute instance-attribute
membrane_mu: float | None = None
membrane_lambda class-attribute instance-attribute
membrane_lambda: float | None = None
bending_alpha class-attribute instance-attribute
bending_alpha: float | None = None
bending_beta class-attribute instance-attribute
bending_beta: float | None = None
mass_damping class-attribute instance-attribute
mass_damping: float = 0.0
stiffness_damping class-attribute instance-attribute
stiffness_damping: float = 0.0
collider_type class-attribute instance-attribute
collider_type: Literal['auto', 'point_cloud', 'none'] = 'auto'
collider_radius class-attribute instance-attribute
collider_radius: float = 0.01
self_contact class-attribute instance-attribute
self_contact: bool = False
self_contact_exclusion_ratio class-attribute instance-attribute
self_contact_exclusion_ratio: float = 1.5

MochiRodMaterialOptions

MochiRodMaterialOptions(**data)

Bases: MochiMaterialOptions

Options for Mochi discrete elastic rods (eden.engine.solvers.mochi.materials.Rod).

A Kirchhoff rod (stretch, bend, twist; no shear) on the polyline of a :class:~eden.options.entities.RodOptions morph — the only morph this material accepts. The five stiffness / inertia quantities derive from E, nu, rho and the rod radius unless given explicitly. Clamp a rod by fixing its first two nodes. Rods collide through samples on their centerline and act as colliders through node spheres of the rod radius, which only other point-cloud bodies (and the rod itself under self_contact) feel. Entities build as :class:~eden.entities.mochi.MochiSoftEntity.

PARAMETER DESCRIPTION
use_visual_raycasting

See :class:MaterialOptions. Default is False.

TYPE: bool

E

Young's modulus (Pa). Default is 1e7.

TYPE: float

nu

Poisson ratio (shear modulus G = E / (2 (1 + nu))). Default is 0.3.

TYPE: float

rho

Density (kg/m^3). Default is 1000.0.

TYPE: float

axial_stiffness

E * A override. Default is None.

TYPE: float or None

flexural_stiffness

E * I override. Default is None.

TYPE: float or None

torsional_stiffness

G * J override. Default is None.

TYPE: float or None

linear_density

rho * A override (kg/m). Default is None.

TYPE: float or None

linear_rotational_inertia

rho * J override (kg m). Default is None.

TYPE: float or None

mass_damping

Rayleigh mass-proportional damping (1/s). Default is 0.0.

TYPE: float

stiffness_damping

Rayleigh stiffness-proportional damping (s). Default is 0.0.

TYPE: float

collider_type

Whether the rod carries node spheres other point-cloud bodies collide with. Default is "auto".

TYPE: ('auto', 'point_cloud', 'none') DEFAULT: "auto"

self_contact

Let the rod's samples collide with its own node spheres. Default is False.

TYPE: bool

self_contact_exclusion_ratio

Nodes within radius * ratio (plus the penalty threshold) of a sample in the rest configuration are excluded from self-contact; e.g. 3 for segments twice the radius. Default is 1.5.

TYPE: float

Source code in eden/options/options.py
def __init__(self, **data):
    # Seed type metadata as construction data so BaseModel validates it into
    # __pydantic_extra__ (no-op for extra="forbid" classes, which use
    # the serialization envelope instead).
    data.update(option_metadata(self))
    # NOTE: all of the option modifications/validations should be done in the __init__ method
    try:
        BaseModel.__init__(self, **data)
    except ValidationError as exc:
        # A misspelled field on an extra="forbid" class should teach the field set, not just
        # name the typo. Only rewritten when every error is extra_forbidden.
        enriched = _enrich_extra_forbidden(type(self), exc)
        if enriched is None:
            raise
        raise enriched from None

Attributes

E class-attribute instance-attribute
E: float = 10000000.0
nu class-attribute instance-attribute
nu: float = 0.3
rho class-attribute instance-attribute
rho: float = 1000.0
axial_stiffness class-attribute instance-attribute
axial_stiffness: float | None = None
flexural_stiffness class-attribute instance-attribute
flexural_stiffness: float | None = None
torsional_stiffness class-attribute instance-attribute
torsional_stiffness: float | None = None
linear_density class-attribute instance-attribute
linear_density: float | None = None
linear_rotational_inertia class-attribute instance-attribute
linear_rotational_inertia: float | None = None
mass_damping class-attribute instance-attribute
mass_damping: float = 0.0
stiffness_damping class-attribute instance-attribute
stiffness_damping: float = 0.0
collider_type class-attribute instance-attribute
collider_type: Literal['auto', 'point_cloud', 'none'] = 'auto'
self_contact class-attribute instance-attribute
self_contact: bool = False
self_contact_exclusion_ratio class-attribute instance-attribute
self_contact_exclusion_ratio: float = 1.5

See also