Hello, I am currently working on implementing a digital twin that reflects objects moving inside a building in real-time digitally.
Currently, I use AutoCAD to create the entire 3D model of the building and a CART that moves in real life, which I then convert to USD for use in OMNIVERSE.
Inside OMNIVERSE, I am successfully receiving UWB coordinates in real-time, and the carts are moving synchronously with their real-life movements every second. However, I am encountering several issues when trying to implement actual physical collisions.
For the building, I have set it as a Collider, and for the CART and another cube I created in OMNIVERSE for testing, I have applied both Collider and Rigid Body settings.
This is the collision-related configuration status of each USD file set using the API mentioned in the official documentation. I haven’t made any adjustments beyond the default settings.
UsdPhysics.CollisionAPI.Apply(prim)
UsdPhysics.RigidBodyAPI.Apply(prim)
The cart and cube have the same collider settings as the building and possess the following rigid body options. (And I’ve set only one cart as a collider for testing purposes.)
The biggest issue currently is that one side of the building wall accurately detects collisions, but the opposite side does not, resulting in a One-way collision scenario. Initially, I thought it was an issue with the wall’s thickness, but the same problem occurs even with very thick walls.
(For the cart, perhaps due to its complex shape, it doesn’t function correctly as a collider. It flies around like in a video, but I am currently focusing on resolving the building wall issue.)
I am looking for ways to address this. I’ve spent a considerable amount of time looking through the official USD documentation and Omniverse’s documents, but I couldn’t find any ideas or solutions to address this problem.
@inyong2327 just out of curiosity and for the sake of brainstorming - are the walls all built as one mesh? have you tried breaking the wall partitions up so the collision can have better definition? (though it won’t quite explain why it’s only detecting collision in one direction only)
Hello and thank you for your response. I’ve managed to find a solution, though I’m not sure if it’s the most efficient one. I noticed that in OMNIVERSE, the default setting for Mesh orientation is “RightHand”. When I change it to “LeftHand”, the direction of the one-way collision inverts.
I tried to find an option for bi-directional or double-sided orientation but unfortunately couldn’t locate any such feature. As a workaround, I duplicated the Mesh and inverted its orientation. I then applied both meshes to the same Xform wall, which enabled bi-directional collision detection.
This method means I’d need two copies of the mesh (with opposite orientations) for every wall. I wonder if there’s a more efficient way to achieve this?
Additionally, I’m attaching an image of the building’s layout in the simulation environment. Each wall is set as an individual Xform with a basic Mesh configuration. I’m not sure if these settings correspond to what you refer to as “partitions”.
Thank you.
i will have to try to repro on my end, but what i meant by partition pertains to how the walls were laid out, - whether it’s one continuous or made up of multiple pieces. not knowing how you created the CAD file, i wasn’t sure how the walls were put together; but, judging by the screenshots, it looks like the walls are separate pieces.
the other thing i wanted to point out pertains to the wall ‘thickness’. the walls shown in your screenshots aren’t exactly an enclosed volume. imported mesh from CAD seem to only made up of single planes (front and back side of a wall) with open ends (bottom and top). unfortunately, i am not familiar with simulation in Isaac to know whether the collisions are being evaluated differently (enclosed/watertight volume vs single sided planes) because each single plane would have a positive and negative ‘face’. they are what we consider the face ‘normal’ in other DCC terminology and they could cause problems if the faces aren’t orient the correct way (mostly in rendering). so i am only speculating that the collisions are only interacting with the positive normal (one of two sides). if i can find out a way to repro it, i’ll post my findings here.
one thing you could try, is to either…
- make a thin cube to resemble a wall directly in OV and see if the cube interacts from both sides
- create an enclosed solid in CAD before importing it into OV rather than an extruded spline
Thank you for the answer. I understood your response. Can I ask further questions via email? I recently started in this field and my understanding of 3D modeling and simulation is still lacking. I’ll attach the CAD file, and I’d appreciate any advice you can give.
As mentioned, I think the issue is do with the specific geometry you are importing. Physics and colliders work best when they are simple, convex objects, without a lot of internal gaps and complex geometry. You would be better off either bringing in the wall as seperate columns and flat wall sections and make EACH ONE a collider or just recreate the wall in Composer with separate geo primatives. One more idea is to keep the wall as is, but then build in simple rectangular primatives in Composer as hidden physics colliders. They work the same way but you can set their visibility to OFF, so they affect the scene only from a collider point of view.
The PhysX SDK simulation does not support both sides triangle meshes. So the winding order is a major factor in what the final triangle mesh (None approximation) will look like.
If you use both sides mesh there will be a warning produced. If you enable collision visualization - “eye” icon show by type - physics - collisions. Then you should see a small pink lines in the direction of the normals.
Another option is to use indeed different approximation like cube or convex mesh.
Regards,
Ales