Fix missing contacts for deeply penetrating boxes.

When penetration exceeds a box's smallest half-size, the midpoint
between the contact surfaces can land outside both boxes. The outside-
box filter in mjc_BoxBox then removed every contact of the manifold,
returning nothing for a visibly overlapping pair, letting boxes fall
through each other. Fixes #1800.

If the filter would remove all contacts, restore the penetrating ones.
This is strictly additive: configurations where any contact survives
the filter are unchanged.

The removed midpoints are bitwise-identical to the witness midpoints
computed by mj_geomDistance for these configurations, so the positions
follow the engine-wide contact position convention; re-anchoring them
onto a box surface would not.

Fixes #1800

PiperOrigin-RevId: 957867315
Change-Id: Ia9c858661d4badeb2a832d25455e33402936011d
This commit is contained in:
Yuval Tassa
2026-08-02 01:34:24 -07:00
committed by Copybara-Service
parent 8655446f25
commit fb07a9ca50
3 changed files with 80 additions and 0 deletions
+2
View File
@@ -52,6 +52,8 @@ Bug fixes
- Fixed a bug in the box-box collider where near-degenerate face clipping could generate contacts with spuriously
large penetration depth between nearly touching thin boxes with positive margin, causing resting stacks to explode.
- Fixed a bug in the box-box collider where penetrations deeper than a box's smallest half-size could produce no
contacts, letting boxes tunnel through thin boxes. Fixes :issue:`1800`.
Version 3.11.0 (July 27, 2026)
------------------------------