Blender rigid bodies falling through the floor or floating: what to check first

If a Blender rigid body falls through a thin floor, inspect the collision shape and increase Substeps Per Frame in a small copy of the scene. If it stops above a visible surface, inspect the collision shape and margin first. Those symptoms can have different causes. In our Blender 5.2.2 tests, a convex hull closed a ring’s hole, an active Mesh body’s margin produced a visible gap, and one simulation substep missed a thin floor that twenty substeps caught.

These were AI-operated digital tests, not measurements of a physical robot or a validation of Bullet’s contact accuracy. The useful result is a way to isolate a setting before changing a complex scene.

Choose the first change from the symptom

Work in a copy of the scene. Add a simple Active cube and a Passive obstacle, run from frame 1, and change one setting at a time:

What you see First thing to inspect Useful comparison
An object stops over a visible hole The obstacle’s Collision Shape Convex Hull versus a suitable concave Mesh or simpler collision pieces
A small gap remains above a surface The moving body’s shape and enabled margin Reduce the margin in the test copy; check whether the gap follows it
A small, fast object crosses a thin floor Rigid Body World → Substeps Per Frame Increase substeps while leaving solver iterations and geometry fixed
A changed setting appears to have no effect Rigid Body World → Cache Delete the test copy’s bake, return to the start and evaluate forward

For the thin-floor example below, start with a 20 mm Box cube at center height 2 m and a 10 mm thick Passive Box floor with its top at z = 0. At 24 fps and 10 solver iterations, compare 1 and 20 substeps through frame 120. This isolates time stepping; it does not prescribe 20 substeps for every scene. The other two pairs isolate shape and margin.

A visible hole can be solid to the collision solver

We dropped a 100 mm cube through the center of a ring. The ring had a 0.4 m major radius and 0.1 m minor radius, with a separate catch floor whose top was at z = −1 m. Changing the passive ring’s collision shape from Convex Hull to Mesh changed where the cube stopped.

With Convex Hull, the bottom of the cube settled at z = 0.100 m, over the visible opening. With Mesh, it passed through and settled on the catch floor at z = −1.000 m. The visible ring geometry had not changed; the collision representation had.

The Blender 5.2 collision-shape documentation describes the available shapes and their tradeoffs. A convex hull cannot retain a concave opening. For a stationary concave obstacle, test a passive Mesh representation or build the obstacle from suitable simpler collision pieces. A detailed mesh is not automatically the best choice for every moving object.

Before increasing solver settings, confirm which representation Blender is using in the rigid body’s Physics properties. A stronger solver cannot recover a hole that the chosen collision shape does not contain. Our separate AABB overlap example explains another representation problem; this test concerns an actual rigid-body simulation rather than a static overlap calculation.

A margin can explain a small, consistent gap

For the margin pair, we dropped a 0.2 m cube onto a passive Box floor with its top at z = 0. The active cube used Mesh, with custom collision margin enabled. At a 0.040 m margin its lowest evaluated corner settled about 40 mm above the floor. Changing only that margin to 0.002 m reduced the final gap to about 2 mm.

That result is specific to the chosen shape. Blender’s documentation distinguishes shapes with an embedded margin, including Box and Sphere, from shapes with a non-embedded margin, including an active triangle mesh. Do not read the margin value as a universal visible gap for every shape.

Use a nonzero starting value appropriate to the scene’s dimensions and adjust it in the small test. Setting every margin to zero can trade a visible gap for less robust contacts. In the other experiments here, zero margins were a deliberate test condition that made the shape and time-step comparisons easier to interpret, not a recommended global preset.

More substeps caught the thin floor in this scene

We then dropped a 20 mm Box cube from a center height of 2 m onto a 10 mm thick passive Box floor. At 24 frames per second, one substep per frame allowed it to pass through. At frame 120 its lowest corner was about 111.873 m below the floor. With twenty substeps per frame, it settled at the floor surface; the lowest recorded corner briefly reached about 0.231 mm below that surface during contact.

The Rigid Body World documentation separates Substeps Per Frame from Solver Iterations. Substeps divide the frame into smaller simulation intervals. Solver iterations do more constraint-solving work within an interval and can help stacking or constrained systems. Increasing iterations does not create the same experiment as increasing substeps.

Twenty was sufficient for this particular drop. It is not a universal setting for every object size, speed, floor thickness or Blender version. If increasing substeps resolves the failure, reduce the value carefully while checking the complete motion to find a useful cost/accuracy tradeoff for that scene.

Reproduce the three pairs without changing several causes at once

The tests used Blender 5.2.2 LTS, build d13f752e3b9c, on Windows. One Blender unit represented one metre. Object scale was applied, gravity was (0, 0, -9.81), frame rate was 24 fps, Solver Iterations was 10, and each case ran sequentially from frame 1 through 120 in a fresh scene. Friction was 0.5 and restitution was zero. Objects began separated. The script left mass and damping at Blender defaults; it did not test those settings.

Pair Setting changed Final lowest cube corner What happened
Ring opening Passive ring: Convex Hull z = 0.100 m Cube stopped above the visible hole
Ring opening Passive ring: Mesh z = −1.000 m Cube reached the lower catch floor
Contact gap Active Mesh cube margin: 0.040 m z ≈ 0.040 m A roughly 40 mm gap remained
Contact gap Active Mesh cube margin: 0.002 m z ≈ 0.002 m Gap shrank to roughly 2 mm
Thin floor Substeps Per Frame: 1 z ≈ −111.873 m Cube passed through the floor
Thin floor Substeps Per Frame: 20 z ≈ 0 m Cube settled on the floor

The ring and margin cases used twenty substeps. All passive floors used Box shape and zero margin. The margin floor measured 4 × 4 × 0.1 m; the thin floor measured 4 × 4 × 0.01 m. Both were positioned so their top was z = 0. The ring’s catch floor measured 4 × 4 × 0.1 m with its center at z = −1.05 m. The ring used 64 major and 16 minor segments. The ring and margin cubes started with their centers at z = 1 m; the thin-floor cube started at z = 2 m.

For each pair, create the baseline, save it, then change only the listed setting in a separate copy. Use Passive for the floor and ring, and Active for the falling cube. Start from frame 1 and let the simulation advance; jumping directly to the last frame is not the same procedure as evaluating the intervening frames.

Measure the lowest evaluated corner, not just the object’s original Location field. For a rotated object, center height minus half its original size is not generally its lowest point. Our saved results use the evaluated object’s bounding-box corners transformed into world space at every frame.

Carry back the change that fixed the isolated case

A baked cache can preserve an old result after a setting changes. The Rigid Body World cache reference documents Delete Bake in Scene Properties → Rigid Body World → Cache. Clear the bake in the test copy, return to the start and evaluate forward before comparing the two outcomes.

Stop when you have isolated the cause: a filled-in collision shape, a shape-specific margin, or a missed thin contact. Only then carry the smallest useful change back to the larger scene and check it over the required motion. A successful cube drop does not establish that a robot’s full mechanism, mass properties or real contact behavior is correct.

Documentation checked and experiments executed October 13, 2026. Six separate scenes and per-frame measurements were retained with the experiment script. These tests use simple geometry and do not claim hardware accuracy.