Spurious collision box from prototype when spawning instanceable assets during active simulation

Isaac Sim Version

4.5.0

Operating System

Ubuntu 25.04 (development branch)

GPU Information

  • Model: RTX 3080 Ti Mobile
  • Driver Version: 570.86.15

Topic Description

Detailed Description

My use case involves spawning many clones of the same asset during the simulation. Therefore, I’m using instanceable assets to reduce memory overhead.

However, when spawning a new clone of the instanceable asset (i.e. an Xform with reference to that asset) in the stage for the first time during active simulation, I observe a 1x1x1 collision box at the origin that physically displaces other objects in the stage. This collision shape:

  • Does not show up in the stage hierarchy UI.
  • Is not listed in Stage.Traverse().
  • Does not appear visually.
  • Only seems to exist within the physics simulation.
  • Disappears if the simulation is stopped and restarted.

This issue occurs only when the object is added while the simulation is running. It does not occur if you first add the object and then start the simulation.

From debugging, it appears that the phantom collider is inside the automatically generated prototype prim (e.g., /__Prototype_1/...). Once the stage already has at least one of that same instance reference (added while the simulation was not running), spawning subsequent copies at runtime does not trigger this phantom box.

Steps to Reproduce

Assets: resources.zip (12.9 KB)

  1. Create an instanceable asset. In my case, it’s a LEGO brick 4x2x3_Pink.usd, an Xform with instanceable attribute set and RigidBodyAPI. It contains a collider box and some visual geometries.
  2. Load the demo stage demo.usd.
  3. Start physics simulation.
  4. Add the asset to the stage either from UI (add Xform then add reference) or using Python code:
    brick = UsdGeom.Xform.Define(stage, "/World/Brick_01")
    brick.GetPrim().GetReferences().AddReference("/path/to/4x2x3_Pink.usd", "/Brick")
    
  5. Observe the collision. Try dragging objects to the origin and you will find there is an invisible 1x1x1 box over there pushing you away.
  6. Stop the simulation and restart it. The issue disappears. Now if you add more references to the same asset while the simulation runs, they behave normally and no phantom box reappears.

Additional Information

Observations

  • The spurious collider can be identified by adding collision reporters to track contact points. You see collisions involving /__Prototype_1/BodyCollider (sometimes the name is slightly different, like __Prototype_2, etc.).
  • The collision shape seems to correspond to a box in the referenced USD. However, the shape is not scaled or is defaulting to 1x1x1 at the origin in PhysX.
  • Although the prototype is not listed in Stage.Traverse(). Calling Stage.GetPrimAtPath('/__Prototype_1') returns a valid prim.

Workaround

Calling omni.physx.get_physx_interface().release_physics_objects() after adding the asset seems to solve the issue. However, I’m concerned about its potential side effects such as performance degradation or loss of physical states.

Hypothesis

Based on the USD Scenegraph Instancing documentation, we know that when a new instanceable prim is introduced, USD internally creates a prototype prim (e.g. /__Prototype_1). Inside Isaac Sim, it seems that PhysX sees that prototype’s collider as a valid collision object at the origin before it gets properly recognized or transformed for the real instance. Once the simulation is rebuilt or at least one instance is already in the stage, PhysX no longer spawns the incorrect collision at the origin.

In other words, PhysX might be failing to skip prototype colliders if that prototype prim is added to USD during a running simulation. When the sim restarts, all prototypes are properly recognized as not physically relevant. Alternatively, it may be a default bounding box from the referenced geometry that gets loaded incorrectly.

Hi @yushijinhun,

Thank you for posting your issue. This behavior is definitely not supposed to happen. I will look into this soon, try to reproduce it and get back to you on as soon as possible.

Thanks,
Michael

FYI, we have opened a ticket to investigate this bug. Hopefully you are unblocked with your temporary fix.

Thanks for the update! While the workaround using release_physics_objects() helps, it’s not compatible with Fabric. Releasing and re-initializing physics objects makes existing simulation views invalidated, leading to a crash when I try to access them. Just wondering, is there any ETA for when this bug might be fixed?

The fix will be out together with Isaac Sim 5.0.0 which may be released sometime in June.

This topic was automatically closed after 12 days. New replies are no longer allowed.