# Using scenes in simulators

> Load the 3D scenes reconstructed from your recordings into Isaac Sim, Isaac Lab or MuJoCo.

Source: https://rayform.world/docs/guides/simulators
Last updated: 2026-10-18
Status: Rayform is in private preview. APIs, formats and the SDK described here may change before general availability.

Every segment carries the scene it was recorded in: Gaussian splats for appearance and meshes for collision, in the site's world frame at metric scale. Export them to evaluate policies in the places your robots actually work.

## Isaac Sim and Isaac Lab

```python
scene = client.segments.get("seg_4f0a").scene_at(t=0.0)
scene.to_usd("kitchen_lab2.usdz")
```

Or export a whole slice:

```bash
rayform export slc_7c1e04aa --format usd --out ./scenes/
```

The USD file contains:

| Prim | Contents |
| --- | --- |
| `/World/Background` | Gaussian splats of the static scene |
| `/World/Collision` | Collision meshes, with convex decomposition for physics |
| `/World/Objects/*` | Moved objects as separate prims, posed at time `t` |
| `/World/Cameras/*` | The recording's cameras with their intrinsics |

## MuJoCo

```python
scene.to_mjcf("kitchen_lab2/")   # writes scene.xml plus meshes/
```

```python
import mujoco

model = mujoco.MjModel.from_xml_path("kitchen_lab2/scene.xml")
data = mujoco.MjData(model)
```

MJCF holds the collision geometry only; MuJoCo does not render Gaussian splats.

## Posing objects at any moment

Objects that moved during the recording are separate entities with trajectories. `scene_at(t)` places them where they were at time `t`, so you can start a simulation from any moment of a real episode:

```python
seg = client.segments.get("seg_4f0a")
before = seg.scene_at(t=seg.events()[0].t_ns - 500_000_000)   # half a second before the first grasp
```

> Simulated scenes are built from your recordings, but simulated behaviour is still simulation. Keep the recorded segments as the ground truth to check policies against.
