Merge pull request #3466 from smallquail:flex-implicit-contact

PiperOrigin-RevId: 960804180
Change-Id: Ic3eb203ca0d9cf19c9043b46127db342678d94f9
This commit is contained in:
Copybara-Service
2026-08-07 02:36:26 -07:00
12 changed files with 425 additions and 61 deletions
+18 -3
View File
@@ -4543,9 +4543,24 @@ extensions specific to flexes.
.. _flex-contact-passive:
:at:`passive`: :at-val:`[true, false], "false"`
When enabled, the contact is not added to the contact solver but it is instead used to compute passive
(spring-damper) contact forces. All contacts, regardless of the specified condim, are frictionless (condim 1). This
is an experimental feature.
When enabled, contact of this flex with another flex, with itself, or with static geometry is not added to the
contact solver and is instead applied as a passive normal force. Contact with a body that can move is left on the
constraint solver.
Friction is not modelled on this path: every passive contact is frictionless (condim 1) regardless of the
specified condim, and the force is purely normal. A flex therefore slides freely over static geometry, so a cloth
will not stay draped over a fixed shape and will not come to rest on a slope. Where friction matters more than
non-penetration, leave this option off.
The force is a penalty on penetration depth whose stiffness is chosen as a natural frequency scaled by the
participating vertex mass, so a single value is appropriate across model scales; it is not user-specified. That
stiffness is integrated implicitly, its curvature being carried by the effective metric, and is therefore far
stiffer than an explicit force at the same timestep could be. It follows that the feature requires an integrator
whose constraint solve runs in that metric: :at:`implicit` or :at:`implicitfast` with the CG solver, pyramidal
friction cones and sleep disabled. A model requesting passive flex collisions otherwise is rejected with an error.
Being a penalty force, it does not guarantee non-penetration: a thin flex moving fast enough to cross another
within one step will pass through it. This is an experimental feature.
.. _deformable-skin: