This skill should be used when the user asks to "add physics", "make it a rigid body", "add a collider", "add collision", "set physics material", "configure physics", "add gravity", "set mass", "create a joint", "add articulation", or needs to configure physics properties on scene objects in Isaac Sim.
Isaac Sim physics is built on top of USD physics schemas (UsdPhysics) with NVIDIA PhysX as the backend (PhysxSchema). The MCP tools wrap the most common operations. Use execute_isaac_script for joint creation, articulation setup, and advanced PhysxSchema properties.
Physics simulation requires a UsdPhysics.Scene prim on the stage. Without it, simulation starts but no physics forces are applied.
mcp__simul__get_isaac_physics_scene
If the result shows no physics scene, create one:
mcp__simul__execute_isaac_script
script: |
import json, traceback
try:
from pxr import UsdPhysics
import omni.usd
stage = omni.usd.get_context().get_stage()
scene_prim = stage.GetPrimAtPath("/physicsScene")
if not scene_prim.IsValid():
scene = UsdPhysics.Scene.Define(stage, "/physicsScene")
scene.CreateGravityDirectionAttr().Set((0, 0, -1))
scene.CreateGravityMagnitudeAttr().Set(9.81)
result = {"success": True, "created": True}
else:
result = {"success": True, "created": False, "note": "already exists"}
except Exception as e:
import traceback
result = {"success": False, "error": str(e), "traceback": traceback.format_exc()}
print(json.dumps(result))
A rigid body makes an object participate in physics simulation — it will respond to gravity, collisions, and applied forces.
mcp__simul__add_isaac_rigid_body
prim_path: "/World/Box"
This applies UsdPhysics.RigidBodyAPI to the prim. The prim must already exist. After adding, verify:
mcp__simul__get_isaac_rigid_body_info
prim_path: "/World/Box"
Returns: enabled state, linear velocity, angular velocity, and whether the body is kinematic.
Kinematic vs dynamic: A dynamic rigid body is fully simulated (gravity, forces, contacts). A kinematic body is driven by animation or script — physics will react to it but it ignores forces. To make a body kinematic, use execute_isaac_script to set the physics:kinematicEnabled attribute to True via UsdPhysics.RigidBodyAPI.
A rigid body without a collision shape passes through other objects. Add a collider:
mcp__simul__add_isaac_collision
prim_path: "/World/Box"
collision_type: "convexHull"
Collision type selection:
| collision_type | Use when |
|---|---|
"convexHull" | Simple convex objects (boxes, capsules, most single-part assets). Fast and stable. |
"meshSimplification" | Complex concave meshes that need moderate accuracy. Slower than convexHull. |
"none" | Planes and analytic primitives (Sphere, Cylinder, Cube) — they use their exact shape automatically. |
For articulated robots with per-link geometry, apply collision to each link prim individually using the appropriate type for that link's shape.
Verify collision was applied:
mcp__simul__get_isaac_collision_info
prim_path: "/World/Box"
By default, PhysX estimates mass from geometry and density. Override explicitly when you know the true mass:
mcp__simul__set_isaac_mass_properties
prim_path: "/World/Box"
mass: 2.5
center_of_mass: [0, 0, 0]
mass is in kilograms. center_of_mass is in local prim coordinates (meters). Omit center_of_mass to let PhysX estimate it from geometry.
Read back the applied values:
mcp__simul__get_isaac_mass_properties
prim_path: "/World/Box"
For inertia tensor control (advanced), use execute_isaac_script with UsdPhysics.MassAPI:
import json, traceback