VBD contact damping: one-sided vs bidirectional

Seven Franka and Allegro cloth manipulation cases from the collision benchmark, each run twice with the same source, settings, seeds and hand commands. The only difference is the new SolverVBD option contact_damping_bidirectional: False (one-sided: damping only while a contact gap closes; the constructor default when these runs were made) versus True (bidirectional: damping also while the gap opens, with the matching Hessian; the constructor default on the branch since the afternoon of 2026-11-04).

Standard VBD elasticity, fast math off, rigid-soft DAT on, merged OGC edge rule, contact stiffness capped at 10x the membrane coefficient, 30 Hz frames, ten substeps (dt = 1/300 s), 60 s hold. Contact damping coefficient kd = 0.1 in every scene. Single runs; they do not establish repeatability.

Update, 2026-11-04 afternoon

Anka decided to make the bidirectional damping the default. The branch now carries the option (b989e846c), the default change (36590004e) and the rebase onto upstream main 7f0c13af6. Two more commits followed: the tuning-guide additions (81fd7250a) and an objective gap rate for the self-contact and rigid-rigid dampers (68c18328a), which the repo's rigid-motion test required once the two-sided gate became the default. The arm labels on this page were changed to match: One-sided (closing only; previous default) is the run with contact_damping_bidirectional=False, Bidirectional (new default) the run with True. The runs themselves were made at commit c49851e53, before these follow-up commits, and are unchanged. The poker-card results below were added in the same update.

Poker cards: the issue #3494 scene

The shipped example_cloth_poker_cards is the scene behind issue #3494 (the card stack never settles). Two measurements, both at commit c49851e53, with the same two damping modes.

1. The demo itself with the ball disabled (issue-3494 harness)

52 cards, 60 Hz, 20 substeps, 10 iterations, soft_contact_ke 1e5, soft_contact_kd 100, sphere velocity set to zero. Settle score = mean over frames 40 to 79 of the largest card-vertex speed; lower is more settled, 0.1 m/s was the threshold of the 2026-07 investigation. Two runs per mode.

ModeRunSettle score m/sMean kinetic energy JStack height swing mVerdict
One-sided (closing only; previous default)10.6152.33e-30.0404bouncy
One-sided (closing only; previous default)20.6302.38e-30.0379bouncy
Bidirectional (new default)10.07055.12e-50.0026settled
Bidirectional (new default)20.07044.84e-50.0023settled

Reference values from the 2026-07 investigation with the same harness: Newton v1.3.0 0.0025 m/s, v1.4.0rc1 0.62 m/s, the fix proposed then 0.06 to 0.07 m/s. Re-run at the final commit 68c18328a (objective gap rate), one run per mode: one-sided 0.539 m/s, bidirectional 0.070 m/s (one-sided | bidirectional). Raw: default-run1.json | default-run2.json | bidirectional-run1.json | bidirectional-run2.json | analysis | schedule.

2. The benchmark's passive card scene s4_poker_cards_no_ball

Benchmark recipe: 60 Hz, ten substeps (dt 1/600 s), ten iterations, platform contact stiffness capped at 1e5, observation 5 to 65 s, no hold or release criteria. In both arms the deck spills off the platform within the first seconds and cards keep slipping later, as in the synced-main run. The J* and V* windows are dominated by those falls, so this scene does not separate the two modes.

ArmJ* mmV* m/sWindowsOverlap mmSubstep msFinite
One-sided (closing only; previous default)16.360.4211200.7824.53yes
Bidirectional (new default)15.610.4221200.8646.19yes
Synced-main campaign of 2026-11-04 (one-sided, different source revision)19.330.402n/a0.800n/an/a

One-sided (closing only; previous default)

J* 16.36 mm, V* 0.421 m/s, overlap 0.782 mm, solver 4.53 ms per substep, wall 239 s. Status completed, finite True, contact overflow False.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Bidirectional (new default)

J* 15.61 mm, V* 0.422 m/s, overlap 0.864 mm, solver 6.19 ms per substep, wall 289 s. Status completed, finite True, contact overflow False.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Overall

ArmCompleted runsRetained through holdMean J* mmMean V* m/sMean static overlap mmMean solver substep ms
One-sided (closing only; previous default)7/75/725.440.4950.78023.74
Bidirectional (new default)7/75/726.640.4971.09318.78

Means are arithmetic means of per-case worst values over the 7 cases completed in both arms. J* is the largest cloth-vertex displacement RMS after removing a fitted linear drift over complete 0.5 s hold windows; V* is the largest cloth-vertex speed RMS over the same windows; the static overlap is the largest sampled overlap of the cloth particle shell with the declared table or ground. Hold retention uses the benchmark's conservative sampled whole-hand separation test: 'retained' means no sampled state proved full separation during the hold. The tables are measurements, not pass or fail verdicts.

Per case

CaseRobotRowsArmHoldReleaseJ* mmV* m/sWindowsOverlap mmSubstep msFinite
m2_franka_pouchFranka512One-sided (closing only; previous default)separated at 4.5 shand clear at end (from 4.5 s)16.960.6951200.99857.66yes
m2_franka_pouchFranka512Bidirectional (new default)separated at 42.0 shand clear at end (from 42.0 s)28.340.5321200.99823.29yes
m3_franka_tote_emptyFranka128One-sided (closing only; previous default)separated at 7.3 shand clear at end (from 7.3 s)50.081.0721201.83810.47yes
m3_franka_tote_emptyFranka128Bidirectional (new default)separated at 17.9 shand clear at end (from 17.9 s)53.651.2331201.0069.97yes
r5_allegro_towelAllegro512One-sided (closing only; previous default)retained through holdhand clear at end (from 68.6 s)22.880.3711200.90111.11yes
r5_allegro_towelAllegro512Bidirectional (new default)retained through holdhand clear at end (from 68.7 s)21.610.3721202.93811.20yes
r5_franka_dressFranka512One-sided (closing only; previous default)retained through holdhand clear at end (from 68.6 s)24.550.3441200.20927.20yes
r5_franka_dressFranka512Bidirectional (new default)retained through holdhand clear at end (from 69.4 s)23.340.3481200.00030.73yes
r5_franka_patch_contact_v2Franka512One-sided (closing only; previous default)retained through holdhand clear at end (from 68.4 s)20.670.3241200.71215.44yes
r5_franka_patch_contact_v2Franka512Bidirectional (new default)retained through holdhand clear at end (from 68.4 s)21.160.3341202.71020.44yes
r5_franka_towel_contact_v2Franka512One-sided (closing only; previous default)retained through holdhand clear at end (from 68.3 s)24.450.3591200.79916.31yes
r5_franka_towel_contact_v2Franka512Bidirectional (new default)retained through holdhand clear at end (from 69.0 s)20.500.3551200.00012.46yes
r5_franka_trousersFranka64One-sided (closing only; previous default)retained through holdhand clear at end (from 68.7 s)18.520.3011200.00027.98yes
r5_franka_trousersFranka64Bidirectional (new default)retained through holdhand clear at end (from 69.4 s)17.850.3011200.00023.38yes

Rows: self-contact vertex and edge row storage per primitive. The towel cases stopped on the benchmark's 64-row capacity guard during release in one arm each (after a complete hold); the tables use their 512-row repeats in both arms, listed with every attempt below. The solver substep time is a secondary measure here: four cases ran at the same time on four GPUs of one host, and a dropped cloth changes the contact load.

All attempts

CaseArmStorageStatusStopped at sHoldJ* mmV* m/sWindows
m2_franka_pouchOne-sided (closing only; previous default)as selected by the synced-main campaigncompletedcompletedseparated at 4.5 s16.960.695120
m2_franka_pouchBidirectional (new default)as selected by the synced-main campaigncompletedcompletedseparated at 42.0 s28.340.532120
m3_franka_tote_emptyOne-sided (closing only; previous default)as selected by the synced-main campaigncompletedcompletedseparated at 7.3 s50.081.072120
m3_franka_tote_emptyBidirectional (new default)as selected by the synced-main campaigncompletedcompletedseparated at 17.9 s53.651.233120
r5_allegro_towelOne-sided (closing only; previous default)as selected by the synced-main campaigncompletedcompletedretained through hold22.910.374120
r5_allegro_towelOne-sided (closing only; previous default)512-row repeatcompletedcompletedretained through hold22.880.371120
r5_allegro_towelBidirectional (new default)as selected by the synced-main campaignerror67.90run error23.600.375120
r5_allegro_towelBidirectional (new default)512-row repeatcompletedcompletedretained through hold21.610.372120
r5_franka_dressOne-sided (closing only; previous default)as selected by the synced-main campaigncompletedcompletedretained through hold24.550.344120
r5_franka_dressBidirectional (new default)as selected by the synced-main campaigncompletedcompletedretained through hold23.340.348120
r5_franka_patch_contact_v2One-sided (closing only; previous default)as selected by the synced-main campaigncompletedcompletedretained through hold20.670.324120
r5_franka_patch_contact_v2Bidirectional (new default)as selected by the synced-main campaigncompletedcompletedretained through hold21.160.334120
r5_franka_towel_contact_v2One-sided (closing only; previous default)as selected by the synced-main campaignerror68.67run error24.110.358120
r5_franka_towel_contact_v2One-sided (closing only; previous default)512-row repeatcompletedcompletedretained through hold24.450.359120
r5_franka_towel_contact_v2Bidirectional (new default)as selected by the synced-main campaigncompletedcompletedretained through hold22.770.351120
r5_franka_towel_contact_v2Bidirectional (new default)512-row repeatcompletedcompletedretained through hold20.500.355120
r5_franka_trousersOne-sided (closing only; previous default)as selected by the synced-main campaigncompletedcompletedretained through hold18.520.301120
r5_franka_trousersBidirectional (new default)as selected by the synced-main campaigncompletedcompletedretained through hold17.850.301120

Context: the synced-main campaign (2026-11-02)

Same recipes, one-sided damping, upstream main 351b9d9f (43 commits before this branch's base), Warp 1.19.0+cu12. Shown only to judge run-to-run sensitivity; it is a different source revision.

CaseHoldJ* mmV* m/sOverlap mmSubstep ms
m2_franka_pouchseparated at 49.5 s27.720.4580.99814.18
m3_franka_tote_emptyseparated at 13.0 s53.471.3302.68311.68
r5_allegro_towelretained through hold23.050.3690.89211.00
r5_franka_dressretained through hold25.840.3830.09822.34
r5_franka_patch_contact_v2retained through hold20.470.3280.82212.30
r5_franka_towel_contact_v2retained through hold24.670.3560.59211.64
r5_franka_trousersretained through hold18.210.3010.27719.17

m2_franka_pouch (Franka)

M2 | Franka hand and pouch: prepared rim hold, carry, release

One-sided (closing only; previous default)

Hold: separated at 4.5 s. Release: hand clear at end (from 4.5 s). J* 16.96 mm, V* 0.695 m/s, overlap 0.998 mm, solver 57.66 ms per substep, wall 1266 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Bidirectional (new default)

Hold: separated at 42.0 s. Release: hand clear at end (from 42.0 s). J* 28.34 mm, V* 0.532 m/s, overlap 0.998 mm, solver 23.29 ms per substep, wall 533 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Scene physics parameters
{
 "frame_dt_s": 0.03333333333333333,
 "substeps": 10,
 "substep_dt_s": 0.003333333333333333,
 "iterations": 40,
 "gravity_m_s2": [
  0.0,
  0.0,
  -9.81
 ],
 "density_kg_m2": 0.22,
 "mass_kg": 0.01537800021469593,
 "tri_ke": 3000.0,
 "tri_ka": 3000.0,
 "tri_kd": 0.025,
 "edge_ke": 0.025,
 "edge_kd": 0.0005,
 "particle_radius_m": 0.001,
 "effective_shell_thickness_m": 0.002,
 "self_contact_enabled": true,
 "self_contact_interaction_margin_m": 0.002,
 "self_contact_extra_detection_gap_m": 0.0015,
 "topological_contact_filter_rings": 2,
 "rest_shape_contact_exclusion_radius_m": 0.0,
 "soft_contact_ke": 50000.0,
 "soft_contact_kd": 0.1,
 "soft_contact_mu": 1.5,
 "robot_shape_mu": 1.5,
 "table_shape_mu": 0.6,
 "rigid_shape_margin_m": 0.0,
 "robot_shape_gap_m": 0.002,
 "ground_shape_gap_m": 0.002,
 "table_shape_gap_m": 0.1,
 "rigid_soft_extra_detection_gap_m": 0.003,
 "rigid_soft_full_surface_contact": true,
 "friction_epsilon": 0.001,
 "mesh_dimensions_xyz_m": [
  0.15,
  0.018,
  0.2
 ],
 "mesh_cells_xyz": [
  24,
  4,
  24
 ],
 "mesh_vertex_count": 1469,
 "mesh_triangle_count": 2880,
 "nominal_closed_finger_opening_m": 0.0015,
 "robot_pose_integration": "Input FK at t; output FK at t+substep_dt"
}

m3_franka_tote_empty (Franka)

M3 | Franka hands: tote | 0 payloads

One-sided (closing only; previous default)

Hold: separated at 7.3 s. Release: hand clear at end (from 7.3 s). J* 50.08 mm, V* 1.072 m/s, overlap 1.838 mm, solver 10.47 ms per substep, wall 268 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Bidirectional (new default)

Hold: separated at 17.9 s. Release: hand clear at end (from 17.9 s). J* 53.65 mm, V* 1.233 m/s, overlap 1.006 mm, solver 9.97 ms per substep, wall 257 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Scene physics parameters
{
 "frame_dt_s": 0.03333333333333333,
 "substeps": 10,
 "substep_dt_s": 0.003333333333333333,
 "iterations": 40,
 "density_kg_m2": 0.22,
 "tri_ke": 3000.0,
 "tri_ka": 3000.0,
 "tri_kd": 0.025,
 "edge_ke": 0.025,
 "edge_kd": 0.0005,
 "particle_radius_m": 0.003,
 "payload_density_kg_m3": 180.0,
 "payload_k_mu": 8000.0,
 "payload_k_lambda": 8000.0,
 "payload_k_damp": 0.5,
 "payload_particle_radius_m": 0.0025,
 "self_contact_enabled": true,
 "self_contact_interaction_margin_m": 0.005,
 "self_contact_extra_detection_gap_m": 0.005,
 "topological_contact_filter_rings": 2,
 "rest_shape_contact_exclusion_radius_m": 0.0,
 "soft_contact_ke": 50000.0,
 "soft_contact_kd": 0.1,
 "soft_contact_mu": 1.5,
 "robot_shape_mu": 1.5,
 "table_shape_mu": 0.6,
 "robot_shape_gap_m": 0.002,
 "table_shape_gap_m": 0.1,
 "rigid_shape_margin_m": 0.0,
 "rigid_soft_extra_detection_gap_m": 0.01,
 "rigid_soft_full_surface_contact": true,
 "nominal_closed_finger_opening_m": 0.004,
 "robot_pose_integration": "External rigid VBD: input FK at t; output FK at t+dt"
}

r5_allegro_towel (Allegro)

R5 | Allegro: original-size towel

One-sided (closing only; previous default)

Hold: retained through hold. Release: hand clear at end (from 68.6 s). J* 22.88 mm, V* 0.371 m/s, overlap 0.901 mm, solver 11.11 ms per substep, wall 301 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Bidirectional (new default)

Hold: retained through hold. Release: hand clear at end (from 68.7 s). J* 21.61 mm, V* 0.372 m/s, overlap 2.938 mm, solver 11.20 ms per substep, wall 302 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Scene physics parameters
{
 "frame_dt_s": 0.03333333333333333,
 "substeps": 10,
 "substep_dt_s": 0.003333333333333333,
 "iterations": 30,
 "density_kg_m2": 0.22,
 "membrane_stretch_coefficient_N_m": 1800.0,
 "membrane_area_coefficient_N_m": 1800.0,
 "membrane_damping": 0.025,
 "bending_coefficient_N": 0.08,
 "bending_damping": 0.0005,
 "bending_rest_angles": "unchanged original source",
 "particle_radius_m": 0.003,
 "self_contact_enabled": true,
 "self_contact_margin_m": 0.002,
 "self_contact_gap_m": 0.001,
 "self_contact_rest_exclusion_m": 0.005,
 "self_contact_topological_rings": 1,
 "friction_robot": 1.0,
 "friction_table": 1.0,
 "friction_soft_self": 1.0,
 "contact_stiffness_N_m": 50000.0,
 "contact_damping": 0.1,
 "shape_margin_m": 0.001,
 "rigid_soft_detection_gap_m": 0.005,
 "full_surface_rigid_soft_contact": true,
 "mesh_vertices": 2180,
 "mesh_triangles": 4228,
 "original_scene_mesh_scale": 1.0
}

r5_franka_dress (Franka)

R5 | Franka: original-size dress

One-sided (closing only; previous default)

Hold: retained through hold. Release: hand clear at end (from 68.6 s). J* 24.55 mm, V* 0.344 m/s, overlap 0.209 mm, solver 27.20 ms per substep, wall 701 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Bidirectional (new default)

Hold: retained through hold. Release: hand clear at end (from 69.4 s). J* 23.34 mm, V* 0.348 m/s, overlap 0.000 mm, solver 30.73 ms per substep, wall 756 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Scene physics parameters
{
 "frame_dt_s": 0.03333333333333333,
 "substeps": 10,
 "substep_dt_s": 0.003333333333333333,
 "iterations": 30,
 "density_kg_m2": 0.22,
 "membrane_stretch_coefficient_N_m": 1800.0,
 "membrane_area_coefficient_N_m": 1800.0,
 "membrane_damping": 0.025,
 "bending_coefficient_N": 0.08,
 "bending_damping": 0.0005,
 "bending_rest_angles": "unchanged original source",
 "particle_radius_m": 0.003,
 "self_contact_enabled": true,
 "self_contact_margin_m": 0.002,
 "self_contact_gap_m": 0.001,
 "self_contact_rest_exclusion_m": 0.005,
 "self_contact_topological_rings": 1,
 "friction_robot": 1.0,
 "friction_table": 1.0,
 "friction_soft_self": 1.0,
 "contact_stiffness_N_m": 50000.0,
 "contact_damping": 0.1,
 "shape_margin_m": 0.001,
 "rigid_soft_detection_gap_m": 0.005,
 "full_surface_rigid_soft_contact": true,
 "mesh_vertices": 4602,
 "mesh_triangles": 8972,
 "original_scene_mesh_scale": 0.6000000238418579
}

r5_franka_patch_contact_v2 (Franka)

R5 | Franka: original-size patch

One-sided (closing only; previous default)

Hold: retained through hold. Release: hand clear at end (from 68.4 s). J* 20.67 mm, V* 0.324 m/s, overlap 0.712 mm, solver 15.44 ms per substep, wall 435 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Bidirectional (new default)

Hold: retained through hold. Release: hand clear at end (from 68.4 s). J* 21.16 mm, V* 0.334 m/s, overlap 2.710 mm, solver 20.44 ms per substep, wall 532 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Scene physics parameters
{
 "frame_dt_s": 0.03333333333333333,
 "substeps": 10,
 "substep_dt_s": 0.003333333333333333,
 "iterations": 30,
 "density_kg_m2": 0.22,
 "membrane_stretch_coefficient_N_m": 1800.0,
 "membrane_area_coefficient_N_m": 1800.0,
 "membrane_damping": 0.025,
 "bending_coefficient_N": 0.08,
 "bending_damping": 0.0005,
 "bending_rest_angles": "unchanged original source",
 "particle_radius_m": 0.003,
 "self_contact_enabled": true,
 "self_contact_margin_m": 0.002,
 "self_contact_gap_m": 0.001,
 "self_contact_rest_exclusion_m": 0.005,
 "self_contact_topological_rings": 1,
 "friction_robot": 1.0,
 "friction_table": 1.0,
 "friction_soft_self": 1.0,
 "contact_stiffness_N_m": 50000.0,
 "contact_damping": 0.1,
 "shape_margin_m": 0.001,
 "rigid_soft_detection_gap_m": 0.005,
 "full_surface_rigid_soft_contact": true,
 "mesh_vertices": 3205,
 "mesh_triangles": 6244,
 "original_scene_mesh_scale": 6.0
}

r5_franka_towel_contact_v2 (Franka)

R5 | Franka: original-size towel

One-sided (closing only; previous default)

Hold: retained through hold. Release: hand clear at end (from 68.3 s). J* 24.45 mm, V* 0.359 m/s, overlap 0.799 mm, solver 16.31 ms per substep, wall 421 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Bidirectional (new default)

Hold: retained through hold. Release: hand clear at end (from 69.0 s). J* 20.50 mm, V* 0.355 m/s, overlap 0.000 mm, solver 12.46 ms per substep, wall 331 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Scene physics parameters
{
 "frame_dt_s": 0.03333333333333333,
 "substeps": 10,
 "substep_dt_s": 0.003333333333333333,
 "iterations": 30,
 "density_kg_m2": 0.22,
 "membrane_stretch_coefficient_N_m": 1800.0,
 "membrane_area_coefficient_N_m": 1800.0,
 "membrane_damping": 0.025,
 "bending_coefficient_N": 0.08,
 "bending_damping": 0.0005,
 "bending_rest_angles": "unchanged original source",
 "particle_radius_m": 0.003,
 "self_contact_enabled": true,
 "self_contact_margin_m": 0.002,
 "self_contact_gap_m": 0.001,
 "self_contact_rest_exclusion_m": 0.005,
 "self_contact_topological_rings": 1,
 "friction_robot": 1.0,
 "friction_table": 1.0,
 "friction_soft_self": 1.0,
 "contact_stiffness_N_m": 50000.0,
 "contact_damping": 0.1,
 "shape_margin_m": 0.001,
 "rigid_soft_detection_gap_m": 0.005,
 "full_surface_rigid_soft_contact": true,
 "mesh_vertices": 2767,
 "mesh_triangles": 5384,
 "original_scene_mesh_scale": 1.0
}

r5_franka_trousers (Franka)

R5 | Franka: original-size trousers

One-sided (closing only; previous default)

Hold: retained through hold. Release: hand clear at end (from 68.7 s). J* 18.52 mm, V* 0.301 m/s, overlap 0.000 mm, solver 27.98 ms per substep, wall 723 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Bidirectional (new default)

Hold: retained through hold. Release: hand clear at end (from 69.4 s). J* 17.85 mm, V* 0.301 m/s, overlap 0.000 mm, solver 23.38 ms per substep, wall 596 s. Status completed, finite True, contact overflow False, source guard unchanged True.

Contact sheetcontact sheet

Raw: results.json | task-observations.json | dat-ogc-provenance.json

Scene physics parameters
{
 "frame_dt_s": 0.03333333333333333,
 "substeps": 10,
 "substep_dt_s": 0.003333333333333333,
 "iterations": 30,
 "density_kg_m2": 0.22,
 "membrane_stretch_coefficient_N_m": 1800.0,
 "membrane_area_coefficient_N_m": 1800.0,
 "membrane_damping": 0.025,
 "bending_coefficient_N": 0.08,
 "bending_damping": 0.0005,
 "bending_rest_angles": "unchanged original source",
 "particle_radius_m": 0.003,
 "self_contact_enabled": true,
 "self_contact_margin_m": 0.002,
 "self_contact_gap_m": 0.001,
 "self_contact_rest_exclusion_m": 0.005,
 "self_contact_topological_rings": 1,
 "friction_robot": 1.0,
 "friction_table": 1.0,
 "friction_soft_self": 1.0,
 "contact_stiffness_N_m": 50000.0,
 "contact_damping": 0.1,
 "shape_margin_m": 0.001,
 "rigid_soft_detection_gap_m": 0.005,
 "full_surface_rigid_soft_contact": true,
 "mesh_vertices": 4570,
 "mesh_triangles": 8990,
 "original_scene_mesh_scale": 0.7058823704719543
}