Overlapping bounding boxes do not prove a mesh collision

Two rotated parts can have overlapping world-axis bounding boxes while their solid geometry remains separated. An axis-aligned bounding box (AABB) test asks whether enclosing coordinate intervals overlap. It does not ask whether the material inside those enclosures occupies the same space. Treat a positive result as a candidate for a more specific geometry test.

The distinction is visible with two thin cuboids. Each is 1 m long, 0.125 m wide and 0.0625 m high, rotated 45 degrees about the world z axis. Keep the first center at the origin and put the second at (−0.125, 0.125, 0) m. Their world AABBs overlap on x, y and z, yet the parts have approximately 51.777 mm of separation along their shared width direction. Empty regions inside the axis-aligned enclosures create the false positive.

An AI-operated Blender 5.2.2 LTS experiment on October 6, 2026 compared three static cuboid pairs. An independent 3D check confirmed the approximately 51.777 mm separating-axis gap in the first arrangement. The dimensions were assigned for this geometric counterexample; no Blender collision engine, Bullet simulation or physical assembly was tested.

Three finite rotated cuboid pairs show overlapping world AABBs with separated solids, true solid overlap, and a pair rejected by its separated AABBs
Blue and orange show the two cuboids; dashed boxes are their world AABBs. Panel axis ranges differ. These XY projections illustrate the arrangements; solid classifications use a separate full 3D convex check, not the projected overlap.

Rotate the enclosure back into the actual question

At 45 degrees, a long narrow cuboid occupies a diagonal strip inside its world AABB. Translating another parallel cuboid across that strip changes their material separation much faster than it removes overlap between the large axis-aligned enclosures.

Resolve the second center offset into the cuboid’s own directions. In the first arrangement, the length-direction offset is zero and the width-direction offset is approximately 0.176777 m. Two identical cuboids span a combined 0.125 m from one center toward the other along that width direction. Their projected intervals therefore have a positive gap of 0.176777−0.125, or approximately 0.051777 m. One separating direction is enough to rule out solid intersection.

Move only the second center to make two useful controls:

Second center, metres World AABBs overlap? Declared solid geometry
(−0.125, 0.125, 0) Yes Separated along shared width direction
(−0.03125, 0.03125, 0) Yes Positive volume overlap
(1, 1, 0) No Separated along shared length direction

The middle row shows why an AABB positive result cannot simply be discarded either. Its width-direction center offset is only about 44.194 mm, below the 125 mm combined half-widths. Its length and height intervals overlap too, so these parallel solids intersect. The last row supplies the easier rejection: if correct enclosing AABBs are separated on any world axis, the enclosed solids cannot intersect.

The approximately 51.777 mm value is a separating-axis gap for this declared arrangement. Projection margins in a general separating-axis test are not automatically a global closest distance or a penetration-depth measurement. In particular, the middle row is an overlap classification, not a contact-force or physical-interference measurement.

Check the enclosure’s coordinate system first

Blender’s Object API describes bound_box as eight corners in object-space coordinates. It also specifies an unavailable-data state with all values equal to −1. Transform every valid corner by the evaluated world matrix before computing world x, y and z minima and maxima. Rotating only a local minimum and maximum corner does not, in general, produce a correct world AABB.

In this study, world AABBs reconstructed from the evaluated mesh vertices agreed with the transformed local corners within the declared numerical bounds. This checks the coordinate conversion separately from the solid-intersection test: a wrong enclosure and a correct enclosure that happens to overlap are different problems.

The examined Bullet 3.25 compound-collision source provides a concrete example of the distinction: an AABB check gates later collision-algorithm processing. That code also has a distance-threshold expansion, which this zero-margin geometric example does not model. This is a reading of that published code, not a claim about an installed Blender implementation or an executed Bullet result.

Reproduce the counterexample without a collision engine

This executed standard-library example builds all eight corners of each cuboid and checks the world AABBs. It then uses a separate analytic test valid for this same-orientation pair: compare the center separation against the combined half-extents along the common cuboid axes.

import itertools
import math

size = (1.0, 1/8, 1/16)
c = math.sqrt(0.5)
def corners(center):
    points = []
    for sx, sy, sz in itertools.product((-1, 1), repeat=3):
        x, y, z = sx*size[0]/2, sy*size[1]/2, sz*size[2]/2
        points.append((center[0]+c*(x-y), center[1]+c*(x+y), center[2]+z))
    return points

def box(points):
    return [(min(p[j] for p in points), max(p[j] for p in points)) for j in range(3)]

A = box(corners((0, 0, 0)))
for name, offset in [("AABB false positive", (-1/8, 1/8, 0)),
                     ("solid overlap", (-1/32, 1/32, 0)),
                     ("AABB separated", (1, 1, 0))]:
    B = box(corners(offset))
    aabb_overlap = all(max(a[0], b[0]) <= min(a[1], b[1]) for a, b in zip(A, B))
    # Only for this same-orientation pair: resolve center spacing in its own axes.
    local = (c*(offset[0]+offset[1]), c*(-offset[0]+offset[1]), offset[2])
    gaps = [abs(v)-length for v, length in zip(local, size)]
    separated = any(gap > 0 for gap in gaps)
    print(f"{name}: AABB overlap={aabb_overlap}, solid separated={separated}")
    print("  signed own-axis gaps (m):", ", ".join(f"{gap:.6f}" for gap in gaps))

The independent 3D checker used the face normals and edge cross-products of the actual evaluated cuboids as separating axes, after checking that each mesh was closed and convex. A separate calculation along the cuboids’ common axes agreed with all three classifications. Neither the short example nor this study is a general algorithm for arbitrary concave meshes.

The geometric comparison used a predeclared 1 µm coordinate-component allowance and a 0.005 mm separating-axis classification band. These are calculation tolerances, not measured physical accuracy or a manufacturing allowance. Complete geometry, inputs and validation records remain preserved with the experiment.

Touching deserves its own state. The checker distinguishes a positive projection gap, a near-zero boundary within that band, and strict overlap. Separate synthetic controls covered exact touch and nearby ±0.1 mm changes, separation in z and a nonparallel 3D arrangement. Those controls supplement the three actual Blender arrangements; they are not additional native tests or proof that touching parts are stable.

The three retained arrangements are alternatives in separate collections at frame 1, sharing world coordinates and shown separately. They do not represent six simultaneous parts, motion between poses or a collision-free route. A related query boundary appears in ray casting versus point containment: a surface hit and an inside/outside classification answer different questions, just as enclosure overlap and solid intersection do here.

When debugging a reported collision, first establish what representation was tested. A correct AABB overlap may be doing its screening job perfectly while a later finite-geometry test correctly rejects the pair.