Opt-in (InspectSceneModelParams.checkSimilarGeometries).
Pose-invariant shape match — two geometries are flagged similar
when they share the same primitive, vertex / triangle count, and
triangle edge-length distribution (a 64-bin log₂ histogram).
Edge lengths are translation-, rotation-, and reflection-
invariant, so two byte-different SceneGeometries that represent
the same shape under any of those transforms produce the same
histogram. NOT scale-invariant: a 1 m cube and a 5 m cube
fingerprint differently.
Pairs with mergeSimilarGeometries, which fits a rigid
transform from each similar geometry to the canonical via
Kabsch (Horn's quaternion method) under same-vertex-order
correspondence and bakes the inverse into each referencing
mesh's matrix. Geometries whose vertex orders don't line up
with the canonical fail the residual gate and stay in place
rather than mis-align silently. The issue carries
context.similar listing the redundant ids.
Two-pass: first bucket by topology — that's free, and a topology
mismatch means the shapes can't be the same regardless of
histogram. Then within each multi-element topology bucket,
compute the edge-length histogram and bucket again.
Opt-in (InspectSceneModelParams.checkSimilarGeometries). Pose-invariant shape match — two geometries are flagged similar when they share the same primitive, vertex / triangle count, and triangle edge-length distribution (a 64-bin log₂ histogram).
Edge lengths are translation-, rotation-, and reflection- invariant, so two byte-different SceneGeometries that represent the same shape under any of those transforms produce the same histogram. NOT scale-invariant: a 1 m cube and a 5 m cube fingerprint differently.
Pairs with mergeSimilarGeometries, which fits a rigid transform from each similar geometry to the canonical via Kabsch (Horn's quaternion method) under same-vertex-order correspondence and bakes the inverse into each referencing mesh's matrix. Geometries whose vertex orders don't line up with the canonical fail the residual gate and stay in place rather than mis-align silently. The issue carries
context.similarlisting the redundant ids.Two-pass: first bucket by topology — that's free, and a topology mismatch means the shapes can't be the same regardless of histogram. Then within each multi-element topology bucket, compute the edge-length histogram and bucket again.