Interacting with a deformable object
While deformable objects sometimes refer to a broader class of objects, such as cloths, fluids and soft bodies,
Isaac Lab represents deformable objects as either surface or volume deformables. Unlike rigid objects, soft bodies can
deform under external forces and collisions. In this tutorial, we focus on volume deformable bodies. For an example of
surface deformables (cloth), run the deformables example.
The deformable object API and schema define/modify functions are shared across backends, while deformable
property and material configuration classes are backend-specific. PhysX simulates soft bodies using the Finite
Element Method (FEM); the Newton experimental backend uses the core VBD solver from
isaaclab_newton.physics with the deformable object integration from
isaaclab_newton.assets.
The volume deformable comprises of two tetrahedral meshes — a simulation mesh and a collision mesh. The simulation
mesh is used to simulate the deformations of the soft body, while the collision mesh is used to detect collisions
with other objects in the scene. For PhysX-specific details, please check the PhysX documentation.
This tutorial shows how to interact with a deformable object in the simulation. We will spawn a set of soft cubes and see how to set their nodal positions and velocities, along with apply kinematic commands to the mesh nodes to move the soft body.
This tutorial automatically tetrahedralizes volume deformables, and its default
visualizer is Kit. Run it with the isaacsim and tetrahedralization extras:
With the legacy installer, install the optional dependencies first:
The Code
The tutorial corresponds to the run_deformable_object.py script in the scripts/tutorials/01_assets directory.
The Code Explained
Designing the scene
We declare the ground plane, light, and deformable cube in a subclass of scene.InteractiveSceneCfg.
scene.InteractiveScene constructs the assets and handles replication internally.
DeformableSceneCfg(num_envs=4, env_spacing=0.5) selects four environment origins on a centered grid
with 0.5 m spacing.
In this tutorial, we create a cubical soft object using the spawn configuration similar to the deformable cube
in the Spawn Objects tutorial. The only difference is that now we wrap
the spawning configuration into the assets.DeformableObjectCfg class. This class contains information about
the asset’s spawning strategy and default initial state. When this class is passed to
the assets.DeformableObject class, it spawns the object and initializes the corresponding physics handles
when the simulation is played.
Deformable objects require a mesh object to be spawned with backend-specific deformable body physics
properties and a matching deformable physics material.
Use --backend physx for the PhysX implementation or --backend newton_vbd for the experimental Newton
implementation.
The scene constructs the deformable objects from their cfg and owns their clone lifecycle.
The simulation loop accesses the resulting asset through scene["cube_object"].
Running the simulation loop
Continuing from the rigid body tutorial, we reset the simulation at regular intervals, apply kinematic commands to the deformable body, step the simulation, and update the deformable object’s internal buffers.
Resetting the simulation state
Unlike rigid bodies and articulations, deformable objects have a different state representation. The state of a
deformable object is defined by the nodal positions and velocities of the mesh. The nodal positions and velocities
are defined in the simulation world frame and are stored in the assets.DeformableObject.data attribute.
We use the assets.DeformableObject.data.default_nodal_state_w attribute to get the default nodal state of the
spawned object prims. This default state can be configured from the assets.DeformableObjectCfg.init_state
attribute, which places the cube 1 m above its environment origin in this tutorial.
The initial state in the configuration assets.DeformableObjectCfg specifies the pose
of the deformable object at the time of spawning. Based on this initial state, the default nodal state is
obtained when the simulation is played for the first time.
We apply transformations to the nodal positions to randomize the initial state of the deformable object.
To reset the deformable object, we first set the nodal state by calling the assets.DeformableObject.write_nodal_state_to_sim
method. This method writes the nodal state of the deformable object prim into the simulation buffer.
Additionally, we free all the kinematic targets set for the nodes in the previous simulation step by calling
the assets.DeformableObject.write_nodal_kinematic_target_to_sim method. We explain the
kinematic targets in the next section.
Finally, we call the assets.DeformableObject.reset method to reset any internal buffers and caches.
Stepping the simulation
Deformable bodies support user-driven kinematic control where a user can specify position targets for some of the mesh nodes while the rest of the nodes are simulated by the active deformable solver. This partial kinematic control is useful for applications where the user wants to interact with the deformable object in a controlled manner.
In this tutorial, we apply kinematic commands to two out of the four cubes in the scene. We set the position targets for the node at index 0 (bottom-left corner) to move the cube along the z-axis.
At every step, we increment the kinematic position target for the node by a small value. Additionally,
we set the flag to indicate that the target is a kinematic target for that node in the simulation buffer.
These are set into the simulation buffer by calling the assets.DeformableObject.write_nodal_kinematic_target_to_sim
method.
Similar to the rigid object and articulation, we perform the assets.DeformableObject.write_data_to_sim method
before stepping the simulation. For deformable objects, this method does not apply any external forces to the object.
However, we keep this method for completeness and future extensions.
Updating the state
After stepping the simulation, we update the internal buffers of the deformable object prims to reflect their new state
inside the assets.DeformableObject.data attribute. This is done using the assets.DeformableObject.update method.
At a fixed interval, we print the root position of the deformable object to the terminal. As mentioned earlier, there is no concept of a root state for deformable objects. However, we compute the root position as the average position of all the nodes in the mesh.
The Code Execution
Now that we have gone through the code, let’s run the script and see the result:
uv (Recommended)
isaaclab.sh / isaaclab.bat
To run the same tutorial with the experimental Newton deformable backend:
uv (Recommended)
isaaclab.sh / isaaclab.bat
This should open a stage with a ground plane, lights, and several cubes. Two of the four cubes must be dropping
from a height and settling on to the ground. Meanwhile the other two cubes must be moving along the z-axis. You
should see a marker showing the kinematic target position for the nodes at the bottom-left corner of the cubes.
To stop the simulation, you can either close the window, or press Ctrl+C in the terminal

This tutorial showed how to spawn deformable objects and wrap them in a DeformableObject class to initialize their
physics handles which allows setting and obtaining their state. We also saw how to apply kinematic commands to the
deformable object to move the mesh nodes in a controlled manner. The deformables example provides a more advanced
example, including surface deformables, loading USD assets, and applying deformable materials.