Repository files navigation

Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats

Official code release for Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats.

Project Page | arXiv

Overview

This project couples Genesis physics simulation with NVIDIA Omniverse RTX rendering for heterogeneous scenes that combine 3D Gaussian Splats, deformable objects, fluids, cloth, and rigid geometry.

The paper discusses a UE5 rendering backend for high-end production rendering. This release provides an Omniverse RTX backend for easier setup and reproducibility; the heterogeneous simulation components can also be connected to UE5 for more advanced water and production rendering effects.

This repository provides two runnable examples:

ScriptDemoOutput
scripts/run_donut_chocolate.sh3DGS donuts with viscous chocolate drizzleoutputs/donut_chocolate/omniverse_render.mp4
scripts/run_cloth_statue.shTextured cloth sliding over a 3DGS statue sceneoutputs/cloth_statue_3dgs/omniverse_render.mp4

Preview media are included under media/:

  • media/donut_chocolate_preview.mp4
  • media/donut_chocolate_preview.gif
  • media/cloth_statue_3dgs_preview.mp4
  • media/cloth_statue_3dgs_preview.gif

Repository Layout

third_party/genesis-world/ Bundled Genesis simulator source used by the demos
src/genesis_omniverse_bridge/ Genesis-to-Omniverse bridge implementation
src/genesis_omniverse_bridge/omni/
Omniverse Kit launch and RTX rendering code
scripts/ Runnable demo entry points
configs/ Demo simulation and rendering configurations
media/ Lightweight preview videos and GIFs
assets/ Demo assets after extracting the asset archive

Quick Start

Clone the repository:

git clone https://github.com/xiaoyangliu137/raf.git scene-level-heterogeneous-physics-simulation
cd scene-level-heterogeneous-physics-simulation

Create and activate the Python environment:

conda create -n scene-physics-3dgs python=3.11 -y
conda activate scene-physics-3dgs

Install PyTorch and the Python packages:

pip install torch --index-url https://download.pytorch.org/whl/cu124
pip install -e third_party/genesis-world
pip install -e .

The third_party/genesis-world package is the bundled Genesis simulator source used by these demos. Do not replace it with the official upstream Genesis package when reproducing these examples.

Download the demo asset archive from Google Drive, then extract it into the repository root:

unzip ~/Downloads/scene-level-heterogeneous-physics-simulation-assets.zip -d .
ls assets/donuts assets/cloth_statue

Set up NVIDIA Omniverse Kit. This project uses Kit as the RTX renderer runtime; the rendering code is included in this repository, but the NVIDIA Kit runtime must be installed separately.

Requirements:

  • Linux x86_64.
  • NVIDIA RTX GPU with a recent NVIDIA driver.
  • An Omniverse Kit runtime containing kit and apps/omni.app.viewport.kit.

Recommended setup using NVIDIA's official Kit App Template:

cd ..
git clone https://github.com/NVIDIA-Omniverse/kit-app-template.git
cd kit-app-template
./repo.sh template new
./repo.sh build
export OMNI_KIT_ROOT="$(pwd)/_build/linux-x86_64/release/kit"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES
cd ../scene-level-heterogeneous-physics-simulation

When ./repo.sh template new prompts for a template, choose an Application template and select Kit Base Editor. The ./repo.sh build step creates the local Kit runtime used by this project.

Alternative setup using NGC:

  • Open the Omniverse Kit SDK Linux package.
  • Install the NGC CLI and run ngc config set.
  • Use the download command shown on the NGC Kit SDK page for the current Linux Kit SDK version.
  • Extract/build the SDK package, then set OMNI_KIT_ROOT to the folder that contains both kit and apps/omni.app.viewport.kit.

If Kit is already installed somewhere on the machine, locate it and set OMNI_KIT_ROOT manually:

KIT_EXE=$(find "$HOME" /opt /tmp -type f -name kit -path '*kit*'2>/dev/null | head -n 1)export OMNI_KIT_ROOT="$(dirname "$KIT_EXE")"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES

Useful official references:

The NVIDIA runtime itself is not vendored in this repository; the bundled Genesis source and the Omniverse rendering bridge code are included.

Omniverse Version and 3DGS Compatibility

Use the newest Omniverse Kit SDK available for your machine when possible. Native 3D Gaussian Splat rendering in this project relies on OpenUSD ParticleField support and Omniverse RTX Particle Field imaging. OpenUSD 26.03 introduced the ParticleField schema family for 3D Gaussian Splats, and Omniverse RTX 110.1 documents native Particle Field rendering with path tracing, shadows, reflections, and refractions. In practice, use a Kit/RTX build that includes the OpenUSD ParticleField3DGaussianSplat schema and the omni.usd.schema.usd_particle_field extension.

The launcher in this repository enables the required extensions explicitly:

omni.usd
omni.usd.schema.usd_particle_field
omni.hydra.rtx
omni.kit.renderer.capture

The renderer also handles schema namespace differences across Kit builds. It first tries UsdParticleField.ParticleField3DGaussianSplat, then UsdVol.ParticleField3DGaussianSplat, and finally authors a ParticleField3DGaussianSplat prim directly. This compatibility path helps with Kit/OpenUSD version differences, but it does not replace a renderer that lacks ParticleField imaging support.

If the latest Kit starts correctly on your GPU, use it. If the latest Kit fails because of driver/runtime compatibility on your system, use an older Kit runtime that still includes ParticleField support and run a smoke test:

FRAME_LIST=0,last ./scripts/run_donut_chocolate.sh

For driver-limited systems where Path Tracing is unstable but RTX rendering works, try the real-time RTX mode without changing the YAML files:

RENDER_OVERRIDE='{"path_tracing": false, "spp": 128, "frame_settle_frames": 64}' \
FRAME_LIST=0,last \
./scripts/run_donut_chocolate.sh

This fallback uses RaytracedLighting instead of PathTracing. It is useful for compatibility testing, while the default donut/chocolate demo remains configured for higher-quality path-traced rendering.

Relevant ParticleField references:

Select a GPU and run the demos:

export CUDA_VISIBLE_DEVICES=0
./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

The output videos are written to:

outputs/donut_chocolate/omniverse_render.mp4
outputs/cloth_statue_3dgs/omniverse_render.mp4

For a short smoke test, render only three frames:

FRAME_LIST=0,60,last ./scripts/run_donut_chocolate.sh
FRAME_LIST=0,120,last ./scripts/run_cloth_statue.sh

Remove FRAME_LIST for full video rendering.

Omniverse Rendering Code

The Omniverse rendering implementation is included in this repository:

src/genesis_omniverse_bridge/omni/run_kit.py
src/genesis_omniverse_bridge/omni/render_demo.py
src/genesis_omniverse_bridge/gaussian.py
src/genesis_omniverse_bridge/donut_3dgs.py

run_kit.py launches Omniverse Kit in headless RTX mode. render_demo.py builds the USD stage, creates the camera, lights, mesh tracks, chocolate surface mesh, cloth mesh, and OpenUSD ParticleField 3DGS prims, then renders PNG frames. The final MP4 is encoded by the Python CLI after rendering.

Each demo run performs:

Genesis simulation
-> genesis_native.mp4
-> simulation_tracks.npz
-> manifest.json
Omniverse RTX rendering
-> stage.usdc
-> rtx_frames/
-> omniverse_render.mp4

Run Demos

The main entry points are:

./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

Each run writes:

outputs/<demo>/
├── genesis_native.mp4
├── manifest.json
├── omniverse_render.mp4
├── rtx_frames/
├── simulation_tracks.npz
└── stage.usdc

Preview

The animations below show representative outputs from the default configurations. Click a preview to open the higher-quality MP4.

3DGS donuts with viscous chocolate drizzle

3DGS donuts with viscous chocolate drizzle

Textured cloth sliding over a 3DGS statue scene

Textured cloth sliding over a 3DGS statue scene

Configuration

Default demo parameters are in:

configs/donut_chocolate.yaml
configs/cloth_statue_3dgs.yaml

Commonly edited sections include:

  • simulation: timestep, duration, gravity, and solver settings.
  • camera: resolution, pose, field of view, and orbit settings.
  • donuts: initial object placement and material settings.
  • donut_3dgs_render: 3DGS asset paths and render alignment.
  • emitter: chocolate source position, motion, and material settings.
  • cloth: cloth size, material, texture, and initial pose.
  • gaussian: 3DGS scene path and display parameters.
  • render_settings: Omniverse resolution, sampling, bounces, and lights.

Paths in YAML files are relative to the config file location.

Citation

If you find this code useful, please cite:

@inproceedings{liu2026scenelevel,
title = {Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats},
author = {Liu, Xiaoyang and Wu, Shangzhe and Han, Kai},
booktitle = {CVPR Findings},
year = {2026}
}

License

The source code is released under the MIT License. See LICENSE for details. Demo assets and external runtimes are governed by their own licenses.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats

Official code release for Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats.

Project Page | arXiv

Overview

This project couples Genesis physics simulation with NVIDIA Omniverse RTX rendering for heterogeneous scenes that combine 3D Gaussian Splats, deformable objects, fluids, cloth, and rigid geometry.

The paper discusses a UE5 rendering backend for high-end production rendering. This release provides an Omniverse RTX backend for easier setup and reproducibility; the heterogeneous simulation components can also be connected to UE5 for more advanced water and production rendering effects.

This repository provides two runnable examples:

ScriptDemoOutput
scripts/run_donut_chocolate.sh3DGS donuts with viscous chocolate drizzleoutputs/donut_chocolate/omniverse_render.mp4
scripts/run_cloth_statue.shTextured cloth sliding over a 3DGS statue sceneoutputs/cloth_statue_3dgs/omniverse_render.mp4

Preview media are included under media/:

  • media/donut_chocolate_preview.mp4
  • media/donut_chocolate_preview.gif
  • media/cloth_statue_3dgs_preview.mp4
  • media/cloth_statue_3dgs_preview.gif

Repository Layout

third_party/genesis-world/ Bundled Genesis simulator source used by the demos
src/genesis_omniverse_bridge/ Genesis-to-Omniverse bridge implementation
src/genesis_omniverse_bridge/omni/
Omniverse Kit launch and RTX rendering code
scripts/ Runnable demo entry points
configs/ Demo simulation and rendering configurations
media/ Lightweight preview videos and GIFs
assets/ Demo assets after extracting the asset archive

Quick Start

Clone the repository:

git clone https://github.com/xiaoyangliu137/raf.git scene-level-heterogeneous-physics-simulation
cd scene-level-heterogeneous-physics-simulation

Create and activate the Python environment:

conda create -n scene-physics-3dgs python=3.11 -y
conda activate scene-physics-3dgs

Install PyTorch and the Python packages:

pip install torch --index-url https://download.pytorch.org/whl/cu124
pip install -e third_party/genesis-world
pip install -e .

The third_party/genesis-world package is the bundled Genesis simulator source used by these demos. Do not replace it with the official upstream Genesis package when reproducing these examples.

Download the demo asset archive from Google Drive, then extract it into the repository root:

unzip ~/Downloads/scene-level-heterogeneous-physics-simulation-assets.zip -d .
ls assets/donuts assets/cloth_statue

Set up NVIDIA Omniverse Kit. This project uses Kit as the RTX renderer runtime; the rendering code is included in this repository, but the NVIDIA Kit runtime must be installed separately.

Requirements:

  • Linux x86_64.
  • NVIDIA RTX GPU with a recent NVIDIA driver.
  • An Omniverse Kit runtime containing kit and apps/omni.app.viewport.kit.

Recommended setup using NVIDIA's official Kit App Template:

cd ..
git clone https://github.com/NVIDIA-Omniverse/kit-app-template.git
cd kit-app-template
./repo.sh template new
./repo.sh build
export OMNI_KIT_ROOT="$(pwd)/_build/linux-x86_64/release/kit"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES
cd ../scene-level-heterogeneous-physics-simulation

When ./repo.sh template new prompts for a template, choose an Application template and select Kit Base Editor. The ./repo.sh build step creates the local Kit runtime used by this project.

Alternative setup using NGC:

  • Open the Omniverse Kit SDK Linux package.
  • Install the NGC CLI and run ngc config set.
  • Use the download command shown on the NGC Kit SDK page for the current Linux Kit SDK version.
  • Extract/build the SDK package, then set OMNI_KIT_ROOT to the folder that contains both kit and apps/omni.app.viewport.kit.

If Kit is already installed somewhere on the machine, locate it and set OMNI_KIT_ROOT manually:

KIT_EXE=$(find "$HOME" /opt /tmp -type f -name kit -path '*kit*'2>/dev/null | head -n 1)export OMNI_KIT_ROOT="$(dirname "$KIT_EXE")"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES

Useful official references:

The NVIDIA runtime itself is not vendored in this repository; the bundled Genesis source and the Omniverse rendering bridge code are included.

Omniverse Version and 3DGS Compatibility

Use the newest Omniverse Kit SDK available for your machine when possible. Native 3D Gaussian Splat rendering in this project relies on OpenUSD ParticleField support and Omniverse RTX Particle Field imaging. OpenUSD 26.03 introduced the ParticleField schema family for 3D Gaussian Splats, and Omniverse RTX 110.1 documents native Particle Field rendering with path tracing, shadows, reflections, and refractions. In practice, use a Kit/RTX build that includes the OpenUSD ParticleField3DGaussianSplat schema and the omni.usd.schema.usd_particle_field extension.

The launcher in this repository enables the required extensions explicitly:

omni.usd
omni.usd.schema.usd_particle_field
omni.hydra.rtx
omni.kit.renderer.capture

The renderer also handles schema namespace differences across Kit builds. It first tries UsdParticleField.ParticleField3DGaussianSplat, then UsdVol.ParticleField3DGaussianSplat, and finally authors a ParticleField3DGaussianSplat prim directly. This compatibility path helps with Kit/OpenUSD version differences, but it does not replace a renderer that lacks ParticleField imaging support.

If the latest Kit starts correctly on your GPU, use it. If the latest Kit fails because of driver/runtime compatibility on your system, use an older Kit runtime that still includes ParticleField support and run a smoke test:

FRAME_LIST=0,last ./scripts/run_donut_chocolate.sh

For driver-limited systems where Path Tracing is unstable but RTX rendering works, try the real-time RTX mode without changing the YAML files:

RENDER_OVERRIDE='{"path_tracing": false, "spp": 128, "frame_settle_frames": 64}' \
FRAME_LIST=0,last \
./scripts/run_donut_chocolate.sh

This fallback uses RaytracedLighting instead of PathTracing. It is useful for compatibility testing, while the default donut/chocolate demo remains configured for higher-quality path-traced rendering.

Relevant ParticleField references:

Select a GPU and run the demos:

export CUDA_VISIBLE_DEVICES=0
./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

The output videos are written to:

outputs/donut_chocolate/omniverse_render.mp4
outputs/cloth_statue_3dgs/omniverse_render.mp4

For a short smoke test, render only three frames:

FRAME_LIST=0,60,last ./scripts/run_donut_chocolate.sh
FRAME_LIST=0,120,last ./scripts/run_cloth_statue.sh

Remove FRAME_LIST for full video rendering.

Omniverse Rendering Code

The Omniverse rendering implementation is included in this repository:

src/genesis_omniverse_bridge/omni/run_kit.py
src/genesis_omniverse_bridge/omni/render_demo.py
src/genesis_omniverse_bridge/gaussian.py
src/genesis_omniverse_bridge/donut_3dgs.py

run_kit.py launches Omniverse Kit in headless RTX mode. render_demo.py builds the USD stage, creates the camera, lights, mesh tracks, chocolate surface mesh, cloth mesh, and OpenUSD ParticleField 3DGS prims, then renders PNG frames. The final MP4 is encoded by the Python CLI after rendering.

Each demo run performs:

Genesis simulation
-> genesis_native.mp4
-> simulation_tracks.npz
-> manifest.json
Omniverse RTX rendering
-> stage.usdc
-> rtx_frames/
-> omniverse_render.mp4

Run Demos

The main entry points are:

./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

Each run writes:

outputs/<demo>/
├── genesis_native.mp4
├── manifest.json
├── omniverse_render.mp4
├── rtx_frames/
├── simulation_tracks.npz
└── stage.usdc

Preview

The animations below show representative outputs from the default configurations. Click a preview to open the higher-quality MP4.

3DGS donuts with viscous chocolate drizzle

3DGS donuts with viscous chocolate drizzle

Textured cloth sliding over a 3DGS statue scene

Textured cloth sliding over a 3DGS statue scene

Configuration

Default demo parameters are in:

configs/donut_chocolate.yaml
configs/cloth_statue_3dgs.yaml

Commonly edited sections include:

  • simulation: timestep, duration, gravity, and solver settings.
  • camera: resolution, pose, field of view, and orbit settings.
  • donuts: initial object placement and material settings.
  • donut_3dgs_render: 3DGS asset paths and render alignment.
  • emitter: chocolate source position, motion, and material settings.
  • cloth: cloth size, material, texture, and initial pose.
  • gaussian: 3DGS scene path and display parameters.
  • render_settings: Omniverse resolution, sampling, bounces, and lights.

Paths in YAML files are relative to the config file location.

Citation

If you find this code useful, please cite:

@inproceedings{liu2026scenelevel,
title = {Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats},
author = {Liu, Xiaoyang and Wu, Shangzhe and Han, Kai},
booktitle = {CVPR Findings},
year = {2026}
}

License

The source code is released under the MIT License. See LICENSE for details. Demo assets and external runtimes are governed by their own licenses.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats

Official code release for Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats.

Project Page | arXiv

Overview

This project couples Genesis physics simulation with NVIDIA Omniverse RTX rendering for heterogeneous scenes that combine 3D Gaussian Splats, deformable objects, fluids, cloth, and rigid geometry.

The paper discusses a UE5 rendering backend for high-end production rendering. This release provides an Omniverse RTX backend for easier setup and reproducibility; the heterogeneous simulation components can also be connected to UE5 for more advanced water and production rendering effects.

This repository provides two runnable examples:

ScriptDemoOutput
scripts/run_donut_chocolate.sh3DGS donuts with viscous chocolate drizzleoutputs/donut_chocolate/omniverse_render.mp4
scripts/run_cloth_statue.shTextured cloth sliding over a 3DGS statue sceneoutputs/cloth_statue_3dgs/omniverse_render.mp4

Preview media are included under media/:

  • media/donut_chocolate_preview.mp4
  • media/donut_chocolate_preview.gif
  • media/cloth_statue_3dgs_preview.mp4
  • media/cloth_statue_3dgs_preview.gif

Repository Layout

third_party/genesis-world/ Bundled Genesis simulator source used by the demos
src/genesis_omniverse_bridge/ Genesis-to-Omniverse bridge implementation
src/genesis_omniverse_bridge/omni/
Omniverse Kit launch and RTX rendering code
scripts/ Runnable demo entry points
configs/ Demo simulation and rendering configurations
media/ Lightweight preview videos and GIFs
assets/ Demo assets after extracting the asset archive

Quick Start

Clone the repository:

git clone https://github.com/xiaoyangliu137/raf.git scene-level-heterogeneous-physics-simulation
cd scene-level-heterogeneous-physics-simulation

Create and activate the Python environment:

conda create -n scene-physics-3dgs python=3.11 -y
conda activate scene-physics-3dgs

Install PyTorch and the Python packages:

pip install torch --index-url https://download.pytorch.org/whl/cu124
pip install -e third_party/genesis-world
pip install -e .

The third_party/genesis-world package is the bundled Genesis simulator source used by these demos. Do not replace it with the official upstream Genesis package when reproducing these examples.

Download the demo asset archive from Google Drive, then extract it into the repository root:

unzip ~/Downloads/scene-level-heterogeneous-physics-simulation-assets.zip -d .
ls assets/donuts assets/cloth_statue

Set up NVIDIA Omniverse Kit. This project uses Kit as the RTX renderer runtime; the rendering code is included in this repository, but the NVIDIA Kit runtime must be installed separately.

Requirements:

  • Linux x86_64.
  • NVIDIA RTX GPU with a recent NVIDIA driver.
  • An Omniverse Kit runtime containing kit and apps/omni.app.viewport.kit.

Recommended setup using NVIDIA's official Kit App Template:

cd ..
git clone https://github.com/NVIDIA-Omniverse/kit-app-template.git
cd kit-app-template
./repo.sh template new
./repo.sh build
export OMNI_KIT_ROOT="$(pwd)/_build/linux-x86_64/release/kit"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES
cd ../scene-level-heterogeneous-physics-simulation

When ./repo.sh template new prompts for a template, choose an Application template and select Kit Base Editor. The ./repo.sh build step creates the local Kit runtime used by this project.

Alternative setup using NGC:

  • Open the Omniverse Kit SDK Linux package.
  • Install the NGC CLI and run ngc config set.
  • Use the download command shown on the NGC Kit SDK page for the current Linux Kit SDK version.
  • Extract/build the SDK package, then set OMNI_KIT_ROOT to the folder that contains both kit and apps/omni.app.viewport.kit.

If Kit is already installed somewhere on the machine, locate it and set OMNI_KIT_ROOT manually:

KIT_EXE=$(find "$HOME" /opt /tmp -type f -name kit -path '*kit*'2>/dev/null | head -n 1)export OMNI_KIT_ROOT="$(dirname "$KIT_EXE")"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES

Useful official references:

The NVIDIA runtime itself is not vendored in this repository; the bundled Genesis source and the Omniverse rendering bridge code are included.

Omniverse Version and 3DGS Compatibility

Use the newest Omniverse Kit SDK available for your machine when possible. Native 3D Gaussian Splat rendering in this project relies on OpenUSD ParticleField support and Omniverse RTX Particle Field imaging. OpenUSD 26.03 introduced the ParticleField schema family for 3D Gaussian Splats, and Omniverse RTX 110.1 documents native Particle Field rendering with path tracing, shadows, reflections, and refractions. In practice, use a Kit/RTX build that includes the OpenUSD ParticleField3DGaussianSplat schema and the omni.usd.schema.usd_particle_field extension.

The launcher in this repository enables the required extensions explicitly:

omni.usd
omni.usd.schema.usd_particle_field
omni.hydra.rtx
omni.kit.renderer.capture

The renderer also handles schema namespace differences across Kit builds. It first tries UsdParticleField.ParticleField3DGaussianSplat, then UsdVol.ParticleField3DGaussianSplat, and finally authors a ParticleField3DGaussianSplat prim directly. This compatibility path helps with Kit/OpenUSD version differences, but it does not replace a renderer that lacks ParticleField imaging support.

If the latest Kit starts correctly on your GPU, use it. If the latest Kit fails because of driver/runtime compatibility on your system, use an older Kit runtime that still includes ParticleField support and run a smoke test:

FRAME_LIST=0,last ./scripts/run_donut_chocolate.sh

For driver-limited systems where Path Tracing is unstable but RTX rendering works, try the real-time RTX mode without changing the YAML files:

RENDER_OVERRIDE='{"path_tracing": false, "spp": 128, "frame_settle_frames": 64}' \
FRAME_LIST=0,last \
./scripts/run_donut_chocolate.sh

This fallback uses RaytracedLighting instead of PathTracing. It is useful for compatibility testing, while the default donut/chocolate demo remains configured for higher-quality path-traced rendering.

Relevant ParticleField references:

Select a GPU and run the demos:

export CUDA_VISIBLE_DEVICES=0
./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

The output videos are written to:

outputs/donut_chocolate/omniverse_render.mp4
outputs/cloth_statue_3dgs/omniverse_render.mp4

For a short smoke test, render only three frames:

FRAME_LIST=0,60,last ./scripts/run_donut_chocolate.sh
FRAME_LIST=0,120,last ./scripts/run_cloth_statue.sh

Remove FRAME_LIST for full video rendering.

Omniverse Rendering Code

The Omniverse rendering implementation is included in this repository:

src/genesis_omniverse_bridge/omni/run_kit.py
src/genesis_omniverse_bridge/omni/render_demo.py
src/genesis_omniverse_bridge/gaussian.py
src/genesis_omniverse_bridge/donut_3dgs.py

run_kit.py launches Omniverse Kit in headless RTX mode. render_demo.py builds the USD stage, creates the camera, lights, mesh tracks, chocolate surface mesh, cloth mesh, and OpenUSD ParticleField 3DGS prims, then renders PNG frames. The final MP4 is encoded by the Python CLI after rendering.

Each demo run performs:

Genesis simulation
-> genesis_native.mp4
-> simulation_tracks.npz
-> manifest.json
Omniverse RTX rendering
-> stage.usdc
-> rtx_frames/
-> omniverse_render.mp4

Run Demos

The main entry points are:

./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

Each run writes:

outputs/<demo>/
├── genesis_native.mp4
├── manifest.json
├── omniverse_render.mp4
├── rtx_frames/
├── simulation_tracks.npz
└── stage.usdc

Preview

The animations below show representative outputs from the default configurations. Click a preview to open the higher-quality MP4.

3DGS donuts with viscous chocolate drizzle

3DGS donuts with viscous chocolate drizzle

Textured cloth sliding over a 3DGS statue scene

Textured cloth sliding over a 3DGS statue scene

Configuration

Default demo parameters are in:

configs/donut_chocolate.yaml
configs/cloth_statue_3dgs.yaml

Commonly edited sections include:

  • simulation: timestep, duration, gravity, and solver settings.
  • camera: resolution, pose, field of view, and orbit settings.
  • donuts: initial object placement and material settings.
  • donut_3dgs_render: 3DGS asset paths and render alignment.
  • emitter: chocolate source position, motion, and material settings.
  • cloth: cloth size, material, texture, and initial pose.
  • gaussian: 3DGS scene path and display parameters.
  • render_settings: Omniverse resolution, sampling, bounces, and lights.

Paths in YAML files are relative to the config file location.

Citation

If you find this code useful, please cite:

@inproceedings{liu2026scenelevel,
title = {Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats},
author = {Liu, Xiaoyang and Wu, Shangzhe and Han, Kai},
booktitle = {CVPR Findings},
year = {2026}
}

License

The source code is released under the MIT License. See LICENSE for details. Demo assets and external runtimes are governed by their own licenses.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats

Official code release for Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats.

Project Page | arXiv

Overview

This project couples Genesis physics simulation with NVIDIA Omniverse RTX rendering for heterogeneous scenes that combine 3D Gaussian Splats, deformable objects, fluids, cloth, and rigid geometry.

The paper discusses a UE5 rendering backend for high-end production rendering. This release provides an Omniverse RTX backend for easier setup and reproducibility; the heterogeneous simulation components can also be connected to UE5 for more advanced water and production rendering effects.

This repository provides two runnable examples:

ScriptDemoOutput
scripts/run_donut_chocolate.sh3DGS donuts with viscous chocolate drizzleoutputs/donut_chocolate/omniverse_render.mp4
scripts/run_cloth_statue.shTextured cloth sliding over a 3DGS statue sceneoutputs/cloth_statue_3dgs/omniverse_render.mp4

Preview media are included under media/:

  • media/donut_chocolate_preview.mp4
  • media/donut_chocolate_preview.gif
  • media/cloth_statue_3dgs_preview.mp4
  • media/cloth_statue_3dgs_preview.gif

Repository Layout

third_party/genesis-world/ Bundled Genesis simulator source used by the demos
src/genesis_omniverse_bridge/ Genesis-to-Omniverse bridge implementation
src/genesis_omniverse_bridge/omni/
Omniverse Kit launch and RTX rendering code
scripts/ Runnable demo entry points
configs/ Demo simulation and rendering configurations
media/ Lightweight preview videos and GIFs
assets/ Demo assets after extracting the asset archive

Quick Start

Clone the repository:

git clone https://github.com/xiaoyangliu137/raf.git scene-level-heterogeneous-physics-simulation
cd scene-level-heterogeneous-physics-simulation

Create and activate the Python environment:

conda create -n scene-physics-3dgs python=3.11 -y
conda activate scene-physics-3dgs

Install PyTorch and the Python packages:

pip install torch --index-url https://download.pytorch.org/whl/cu124
pip install -e third_party/genesis-world
pip install -e .

The third_party/genesis-world package is the bundled Genesis simulator source used by these demos. Do not replace it with the official upstream Genesis package when reproducing these examples.

Download the demo asset archive from Google Drive, then extract it into the repository root:

unzip ~/Downloads/scene-level-heterogeneous-physics-simulation-assets.zip -d .
ls assets/donuts assets/cloth_statue

Set up NVIDIA Omniverse Kit. This project uses Kit as the RTX renderer runtime; the rendering code is included in this repository, but the NVIDIA Kit runtime must be installed separately.

Requirements:

  • Linux x86_64.
  • NVIDIA RTX GPU with a recent NVIDIA driver.
  • An Omniverse Kit runtime containing kit and apps/omni.app.viewport.kit.

Recommended setup using NVIDIA's official Kit App Template:

cd ..
git clone https://github.com/NVIDIA-Omniverse/kit-app-template.git
cd kit-app-template
./repo.sh template new
./repo.sh build
export OMNI_KIT_ROOT="$(pwd)/_build/linux-x86_64/release/kit"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES
cd ../scene-level-heterogeneous-physics-simulation

When ./repo.sh template new prompts for a template, choose an Application template and select Kit Base Editor. The ./repo.sh build step creates the local Kit runtime used by this project.

Alternative setup using NGC:

  • Open the Omniverse Kit SDK Linux package.
  • Install the NGC CLI and run ngc config set.
  • Use the download command shown on the NGC Kit SDK page for the current Linux Kit SDK version.
  • Extract/build the SDK package, then set OMNI_KIT_ROOT to the folder that contains both kit and apps/omni.app.viewport.kit.

If Kit is already installed somewhere on the machine, locate it and set OMNI_KIT_ROOT manually:

KIT_EXE=$(find "$HOME" /opt /tmp -type f -name kit -path '*kit*'2>/dev/null | head -n 1)export OMNI_KIT_ROOT="$(dirname "$KIT_EXE")"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES

Useful official references:

The NVIDIA runtime itself is not vendored in this repository; the bundled Genesis source and the Omniverse rendering bridge code are included.

Omniverse Version and 3DGS Compatibility

Use the newest Omniverse Kit SDK available for your machine when possible. Native 3D Gaussian Splat rendering in this project relies on OpenUSD ParticleField support and Omniverse RTX Particle Field imaging. OpenUSD 26.03 introduced the ParticleField schema family for 3D Gaussian Splats, and Omniverse RTX 110.1 documents native Particle Field rendering with path tracing, shadows, reflections, and refractions. In practice, use a Kit/RTX build that includes the OpenUSD ParticleField3DGaussianSplat schema and the omni.usd.schema.usd_particle_field extension.

The launcher in this repository enables the required extensions explicitly:

omni.usd
omni.usd.schema.usd_particle_field
omni.hydra.rtx
omni.kit.renderer.capture

The renderer also handles schema namespace differences across Kit builds. It first tries UsdParticleField.ParticleField3DGaussianSplat, then UsdVol.ParticleField3DGaussianSplat, and finally authors a ParticleField3DGaussianSplat prim directly. This compatibility path helps with Kit/OpenUSD version differences, but it does not replace a renderer that lacks ParticleField imaging support.

If the latest Kit starts correctly on your GPU, use it. If the latest Kit fails because of driver/runtime compatibility on your system, use an older Kit runtime that still includes ParticleField support and run a smoke test:

FRAME_LIST=0,last ./scripts/run_donut_chocolate.sh

For driver-limited systems where Path Tracing is unstable but RTX rendering works, try the real-time RTX mode without changing the YAML files:

RENDER_OVERRIDE='{"path_tracing": false, "spp": 128, "frame_settle_frames": 64}' \
FRAME_LIST=0,last \
./scripts/run_donut_chocolate.sh

This fallback uses RaytracedLighting instead of PathTracing. It is useful for compatibility testing, while the default donut/chocolate demo remains configured for higher-quality path-traced rendering.

Relevant ParticleField references:

Select a GPU and run the demos:

export CUDA_VISIBLE_DEVICES=0
./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

The output videos are written to:

outputs/donut_chocolate/omniverse_render.mp4
outputs/cloth_statue_3dgs/omniverse_render.mp4

For a short smoke test, render only three frames:

FRAME_LIST=0,60,last ./scripts/run_donut_chocolate.sh
FRAME_LIST=0,120,last ./scripts/run_cloth_statue.sh

Remove FRAME_LIST for full video rendering.

Omniverse Rendering Code

The Omniverse rendering implementation is included in this repository:

src/genesis_omniverse_bridge/omni/run_kit.py
src/genesis_omniverse_bridge/omni/render_demo.py
src/genesis_omniverse_bridge/gaussian.py
src/genesis_omniverse_bridge/donut_3dgs.py

run_kit.py launches Omniverse Kit in headless RTX mode. render_demo.py builds the USD stage, creates the camera, lights, mesh tracks, chocolate surface mesh, cloth mesh, and OpenUSD ParticleField 3DGS prims, then renders PNG frames. The final MP4 is encoded by the Python CLI after rendering.

Each demo run performs:

Genesis simulation
-> genesis_native.mp4
-> simulation_tracks.npz
-> manifest.json
Omniverse RTX rendering
-> stage.usdc
-> rtx_frames/
-> omniverse_render.mp4

Run Demos

The main entry points are:

./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

Each run writes:

outputs/<demo>/
├── genesis_native.mp4
├── manifest.json
├── omniverse_render.mp4
├── rtx_frames/
├── simulation_tracks.npz
└── stage.usdc

Preview

The animations below show representative outputs from the default configurations. Click a preview to open the higher-quality MP4.

3DGS donuts with viscous chocolate drizzle

3DGS donuts with viscous chocolate drizzle

Textured cloth sliding over a 3DGS statue scene

Textured cloth sliding over a 3DGS statue scene

Configuration

Default demo parameters are in:

configs/donut_chocolate.yaml
configs/cloth_statue_3dgs.yaml

Commonly edited sections include:

  • simulation: timestep, duration, gravity, and solver settings.
  • camera: resolution, pose, field of view, and orbit settings.
  • donuts: initial object placement and material settings.
  • donut_3dgs_render: 3DGS asset paths and render alignment.
  • emitter: chocolate source position, motion, and material settings.
  • cloth: cloth size, material, texture, and initial pose.
  • gaussian: 3DGS scene path and display parameters.
  • render_settings: Omniverse resolution, sampling, bounces, and lights.

Paths in YAML files are relative to the config file location.

Citation

If you find this code useful, please cite:

@inproceedings{liu2026scenelevel,
title = {Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats},
author = {Liu, Xiaoyang and Wu, Shangzhe and Han, Kai},
booktitle = {CVPR Findings},
year = {2026}
}

License

The source code is released under the MIT License. See LICENSE for details. Demo assets and external runtimes are governed by their own licenses.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats

Official code release for Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats.

Project Page | arXiv

Overview

This project couples Genesis physics simulation with NVIDIA Omniverse RTX rendering for heterogeneous scenes that combine 3D Gaussian Splats, deformable objects, fluids, cloth, and rigid geometry.

The paper discusses a UE5 rendering backend for high-end production rendering. This release provides an Omniverse RTX backend for easier setup and reproducibility; the heterogeneous simulation components can also be connected to UE5 for more advanced water and production rendering effects.

This repository provides two runnable examples:

ScriptDemoOutput
scripts/run_donut_chocolate.sh3DGS donuts with viscous chocolate drizzleoutputs/donut_chocolate/omniverse_render.mp4
scripts/run_cloth_statue.shTextured cloth sliding over a 3DGS statue sceneoutputs/cloth_statue_3dgs/omniverse_render.mp4

Preview media are included under media/:

  • media/donut_chocolate_preview.mp4
  • media/donut_chocolate_preview.gif
  • media/cloth_statue_3dgs_preview.mp4
  • media/cloth_statue_3dgs_preview.gif

Repository Layout

third_party/genesis-world/ Bundled Genesis simulator source used by the demos
src/genesis_omniverse_bridge/ Genesis-to-Omniverse bridge implementation
src/genesis_omniverse_bridge/omni/
Omniverse Kit launch and RTX rendering code
scripts/ Runnable demo entry points
configs/ Demo simulation and rendering configurations
media/ Lightweight preview videos and GIFs
assets/ Demo assets after extracting the asset archive

Quick Start

Clone the repository:

git clone https://github.com/xiaoyangliu137/raf.git scene-level-heterogeneous-physics-simulation
cd scene-level-heterogeneous-physics-simulation

Create and activate the Python environment:

conda create -n scene-physics-3dgs python=3.11 -y
conda activate scene-physics-3dgs

Install PyTorch and the Python packages:

pip install torch --index-url https://download.pytorch.org/whl/cu124
pip install -e third_party/genesis-world
pip install -e .

The third_party/genesis-world package is the bundled Genesis simulator source used by these demos. Do not replace it with the official upstream Genesis package when reproducing these examples.

Download the demo asset archive from Google Drive, then extract it into the repository root:

unzip ~/Downloads/scene-level-heterogeneous-physics-simulation-assets.zip -d .
ls assets/donuts assets/cloth_statue

Set up NVIDIA Omniverse Kit. This project uses Kit as the RTX renderer runtime; the rendering code is included in this repository, but the NVIDIA Kit runtime must be installed separately.

Requirements:

  • Linux x86_64.
  • NVIDIA RTX GPU with a recent NVIDIA driver.
  • An Omniverse Kit runtime containing kit and apps/omni.app.viewport.kit.

Recommended setup using NVIDIA's official Kit App Template:

cd ..
git clone https://github.com/NVIDIA-Omniverse/kit-app-template.git
cd kit-app-template
./repo.sh template new
./repo.sh build
export OMNI_KIT_ROOT="$(pwd)/_build/linux-x86_64/release/kit"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES
cd ../scene-level-heterogeneous-physics-simulation

When ./repo.sh template new prompts for a template, choose an Application template and select Kit Base Editor. The ./repo.sh build step creates the local Kit runtime used by this project.

Alternative setup using NGC:

  • Open the Omniverse Kit SDK Linux package.
  • Install the NGC CLI and run ngc config set.
  • Use the download command shown on the NGC Kit SDK page for the current Linux Kit SDK version.
  • Extract/build the SDK package, then set OMNI_KIT_ROOT to the folder that contains both kit and apps/omni.app.viewport.kit.

If Kit is already installed somewhere on the machine, locate it and set OMNI_KIT_ROOT manually:

KIT_EXE=$(find "$HOME" /opt /tmp -type f -name kit -path '*kit*'2>/dev/null | head -n 1)export OMNI_KIT_ROOT="$(dirname "$KIT_EXE")"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES

Useful official references:

The NVIDIA runtime itself is not vendored in this repository; the bundled Genesis source and the Omniverse rendering bridge code are included.

Omniverse Version and 3DGS Compatibility

Use the newest Omniverse Kit SDK available for your machine when possible. Native 3D Gaussian Splat rendering in this project relies on OpenUSD ParticleField support and Omniverse RTX Particle Field imaging. OpenUSD 26.03 introduced the ParticleField schema family for 3D Gaussian Splats, and Omniverse RTX 110.1 documents native Particle Field rendering with path tracing, shadows, reflections, and refractions. In practice, use a Kit/RTX build that includes the OpenUSD ParticleField3DGaussianSplat schema and the omni.usd.schema.usd_particle_field extension.

The launcher in this repository enables the required extensions explicitly:

omni.usd
omni.usd.schema.usd_particle_field
omni.hydra.rtx
omni.kit.renderer.capture

The renderer also handles schema namespace differences across Kit builds. It first tries UsdParticleField.ParticleField3DGaussianSplat, then UsdVol.ParticleField3DGaussianSplat, and finally authors a ParticleField3DGaussianSplat prim directly. This compatibility path helps with Kit/OpenUSD version differences, but it does not replace a renderer that lacks ParticleField imaging support.

If the latest Kit starts correctly on your GPU, use it. If the latest Kit fails because of driver/runtime compatibility on your system, use an older Kit runtime that still includes ParticleField support and run a smoke test:

FRAME_LIST=0,last ./scripts/run_donut_chocolate.sh

For driver-limited systems where Path Tracing is unstable but RTX rendering works, try the real-time RTX mode without changing the YAML files:

RENDER_OVERRIDE='{"path_tracing": false, "spp": 128, "frame_settle_frames": 64}' \
FRAME_LIST=0,last \
./scripts/run_donut_chocolate.sh

This fallback uses RaytracedLighting instead of PathTracing. It is useful for compatibility testing, while the default donut/chocolate demo remains configured for higher-quality path-traced rendering.

Relevant ParticleField references:

Select a GPU and run the demos:

export CUDA_VISIBLE_DEVICES=0
./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

The output videos are written to:

outputs/donut_chocolate/omniverse_render.mp4
outputs/cloth_statue_3dgs/omniverse_render.mp4

For a short smoke test, render only three frames:

FRAME_LIST=0,60,last ./scripts/run_donut_chocolate.sh
FRAME_LIST=0,120,last ./scripts/run_cloth_statue.sh

Remove FRAME_LIST for full video rendering.

Omniverse Rendering Code

The Omniverse rendering implementation is included in this repository:

src/genesis_omniverse_bridge/omni/run_kit.py
src/genesis_omniverse_bridge/omni/render_demo.py
src/genesis_omniverse_bridge/gaussian.py
src/genesis_omniverse_bridge/donut_3dgs.py

run_kit.py launches Omniverse Kit in headless RTX mode. render_demo.py builds the USD stage, creates the camera, lights, mesh tracks, chocolate surface mesh, cloth mesh, and OpenUSD ParticleField 3DGS prims, then renders PNG frames. The final MP4 is encoded by the Python CLI after rendering.

Each demo run performs:

Genesis simulation
-> genesis_native.mp4
-> simulation_tracks.npz
-> manifest.json
Omniverse RTX rendering
-> stage.usdc
-> rtx_frames/
-> omniverse_render.mp4

Run Demos

The main entry points are:

./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

Each run writes:

outputs/<demo>/
├── genesis_native.mp4
├── manifest.json
├── omniverse_render.mp4
├── rtx_frames/
├── simulation_tracks.npz
└── stage.usdc

Preview

The animations below show representative outputs from the default configurations. Click a preview to open the higher-quality MP4.

3DGS donuts with viscous chocolate drizzle

3DGS donuts with viscous chocolate drizzle

Textured cloth sliding over a 3DGS statue scene

Textured cloth sliding over a 3DGS statue scene

Configuration

Default demo parameters are in:

configs/donut_chocolate.yaml
configs/cloth_statue_3dgs.yaml

Commonly edited sections include:

  • simulation: timestep, duration, gravity, and solver settings.
  • camera: resolution, pose, field of view, and orbit settings.
  • donuts: initial object placement and material settings.
  • donut_3dgs_render: 3DGS asset paths and render alignment.
  • emitter: chocolate source position, motion, and material settings.
  • cloth: cloth size, material, texture, and initial pose.
  • gaussian: 3DGS scene path and display parameters.
  • render_settings: Omniverse resolution, sampling, bounces, and lights.

Paths in YAML files are relative to the config file location.

Citation

If you find this code useful, please cite:

@inproceedings{liu2026scenelevel,
title = {Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats},
author = {Liu, Xiaoyang and Wu, Shangzhe and Han, Kai},
booktitle = {CVPR Findings},
year = {2026}
}

License

The source code is released under the MIT License. See LICENSE for details. Demo assets and external runtimes are governed by their own licenses.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats

Official code release for Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats.

Project Page | arXiv

Overview

This project couples Genesis physics simulation with NVIDIA Omniverse RTX rendering for heterogeneous scenes that combine 3D Gaussian Splats, deformable objects, fluids, cloth, and rigid geometry.

The paper discusses a UE5 rendering backend for high-end production rendering. This release provides an Omniverse RTX backend for easier setup and reproducibility; the heterogeneous simulation components can also be connected to UE5 for more advanced water and production rendering effects.

This repository provides two runnable examples:

ScriptDemoOutput
scripts/run_donut_chocolate.sh3DGS donuts with viscous chocolate drizzleoutputs/donut_chocolate/omniverse_render.mp4
scripts/run_cloth_statue.shTextured cloth sliding over a 3DGS statue sceneoutputs/cloth_statue_3dgs/omniverse_render.mp4

Preview media are included under media/:

  • media/donut_chocolate_preview.mp4
  • media/donut_chocolate_preview.gif
  • media/cloth_statue_3dgs_preview.mp4
  • media/cloth_statue_3dgs_preview.gif

Repository Layout

third_party/genesis-world/ Bundled Genesis simulator source used by the demos
src/genesis_omniverse_bridge/ Genesis-to-Omniverse bridge implementation
src/genesis_omniverse_bridge/omni/
Omniverse Kit launch and RTX rendering code
scripts/ Runnable demo entry points
configs/ Demo simulation and rendering configurations
media/ Lightweight preview videos and GIFs
assets/ Demo assets after extracting the asset archive

Quick Start

Clone the repository:

git clone https://github.com/xiaoyangliu137/raf.git scene-level-heterogeneous-physics-simulation
cd scene-level-heterogeneous-physics-simulation

Create and activate the Python environment:

conda create -n scene-physics-3dgs python=3.11 -y
conda activate scene-physics-3dgs

Install PyTorch and the Python packages:

pip install torch --index-url https://download.pytorch.org/whl/cu124
pip install -e third_party/genesis-world
pip install -e .

The third_party/genesis-world package is the bundled Genesis simulator source used by these demos. Do not replace it with the official upstream Genesis package when reproducing these examples.

Download the demo asset archive from Google Drive, then extract it into the repository root:

unzip ~/Downloads/scene-level-heterogeneous-physics-simulation-assets.zip -d .
ls assets/donuts assets/cloth_statue

Set up NVIDIA Omniverse Kit. This project uses Kit as the RTX renderer runtime; the rendering code is included in this repository, but the NVIDIA Kit runtime must be installed separately.

Requirements:

  • Linux x86_64.
  • NVIDIA RTX GPU with a recent NVIDIA driver.
  • An Omniverse Kit runtime containing kit and apps/omni.app.viewport.kit.

Recommended setup using NVIDIA's official Kit App Template:

cd ..
git clone https://github.com/NVIDIA-Omniverse/kit-app-template.git
cd kit-app-template
./repo.sh template new
./repo.sh build
export OMNI_KIT_ROOT="$(pwd)/_build/linux-x86_64/release/kit"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES
cd ../scene-level-heterogeneous-physics-simulation

When ./repo.sh template new prompts for a template, choose an Application template and select Kit Base Editor. The ./repo.sh build step creates the local Kit runtime used by this project.

Alternative setup using NGC:

  • Open the Omniverse Kit SDK Linux package.
  • Install the NGC CLI and run ngc config set.
  • Use the download command shown on the NGC Kit SDK page for the current Linux Kit SDK version.
  • Extract/build the SDK package, then set OMNI_KIT_ROOT to the folder that contains both kit and apps/omni.app.viewport.kit.

If Kit is already installed somewhere on the machine, locate it and set OMNI_KIT_ROOT manually:

KIT_EXE=$(find "$HOME" /opt /tmp -type f -name kit -path '*kit*'2>/dev/null | head -n 1)export OMNI_KIT_ROOT="$(dirname "$KIT_EXE")"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES

Useful official references:

The NVIDIA runtime itself is not vendored in this repository; the bundled Genesis source and the Omniverse rendering bridge code are included.

Omniverse Version and 3DGS Compatibility

Use the newest Omniverse Kit SDK available for your machine when possible. Native 3D Gaussian Splat rendering in this project relies on OpenUSD ParticleField support and Omniverse RTX Particle Field imaging. OpenUSD 26.03 introduced the ParticleField schema family for 3D Gaussian Splats, and Omniverse RTX 110.1 documents native Particle Field rendering with path tracing, shadows, reflections, and refractions. In practice, use a Kit/RTX build that includes the OpenUSD ParticleField3DGaussianSplat schema and the omni.usd.schema.usd_particle_field extension.

The launcher in this repository enables the required extensions explicitly:

omni.usd
omni.usd.schema.usd_particle_field
omni.hydra.rtx
omni.kit.renderer.capture

The renderer also handles schema namespace differences across Kit builds. It first tries UsdParticleField.ParticleField3DGaussianSplat, then UsdVol.ParticleField3DGaussianSplat, and finally authors a ParticleField3DGaussianSplat prim directly. This compatibility path helps with Kit/OpenUSD version differences, but it does not replace a renderer that lacks ParticleField imaging support.

If the latest Kit starts correctly on your GPU, use it. If the latest Kit fails because of driver/runtime compatibility on your system, use an older Kit runtime that still includes ParticleField support and run a smoke test:

FRAME_LIST=0,last ./scripts/run_donut_chocolate.sh

For driver-limited systems where Path Tracing is unstable but RTX rendering works, try the real-time RTX mode without changing the YAML files:

RENDER_OVERRIDE='{"path_tracing": false, "spp": 128, "frame_settle_frames": 64}' \
FRAME_LIST=0,last \
./scripts/run_donut_chocolate.sh

This fallback uses RaytracedLighting instead of PathTracing. It is useful for compatibility testing, while the default donut/chocolate demo remains configured for higher-quality path-traced rendering.

Relevant ParticleField references:

Select a GPU and run the demos:

export CUDA_VISIBLE_DEVICES=0
./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

The output videos are written to:

outputs/donut_chocolate/omniverse_render.mp4
outputs/cloth_statue_3dgs/omniverse_render.mp4

For a short smoke test, render only three frames:

FRAME_LIST=0,60,last ./scripts/run_donut_chocolate.sh
FRAME_LIST=0,120,last ./scripts/run_cloth_statue.sh

Remove FRAME_LIST for full video rendering.

Omniverse Rendering Code

The Omniverse rendering implementation is included in this repository:

src/genesis_omniverse_bridge/omni/run_kit.py
src/genesis_omniverse_bridge/omni/render_demo.py
src/genesis_omniverse_bridge/gaussian.py
src/genesis_omniverse_bridge/donut_3dgs.py

run_kit.py launches Omniverse Kit in headless RTX mode. render_demo.py builds the USD stage, creates the camera, lights, mesh tracks, chocolate surface mesh, cloth mesh, and OpenUSD ParticleField 3DGS prims, then renders PNG frames. The final MP4 is encoded by the Python CLI after rendering.

Each demo run performs:

Genesis simulation
-> genesis_native.mp4
-> simulation_tracks.npz
-> manifest.json
Omniverse RTX rendering
-> stage.usdc
-> rtx_frames/
-> omniverse_render.mp4

Run Demos

The main entry points are:

./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

Each run writes:

outputs/<demo>/
├── genesis_native.mp4
├── manifest.json
├── omniverse_render.mp4
├── rtx_frames/
├── simulation_tracks.npz
└── stage.usdc

Preview

The animations below show representative outputs from the default configurations. Click a preview to open the higher-quality MP4.

3DGS donuts with viscous chocolate drizzle

3DGS donuts with viscous chocolate drizzle

Textured cloth sliding over a 3DGS statue scene

Textured cloth sliding over a 3DGS statue scene

Configuration

Default demo parameters are in:

configs/donut_chocolate.yaml
configs/cloth_statue_3dgs.yaml

Commonly edited sections include:

  • simulation: timestep, duration, gravity, and solver settings.
  • camera: resolution, pose, field of view, and orbit settings.
  • donuts: initial object placement and material settings.
  • donut_3dgs_render: 3DGS asset paths and render alignment.
  • emitter: chocolate source position, motion, and material settings.
  • cloth: cloth size, material, texture, and initial pose.
  • gaussian: 3DGS scene path and display parameters.
  • render_settings: Omniverse resolution, sampling, bounces, and lights.

Paths in YAML files are relative to the config file location.

Citation

If you find this code useful, please cite:

@inproceedings{liu2026scenelevel,
title = {Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats},
author = {Liu, Xiaoyang and Wu, Shangzhe and Han, Kai},
booktitle = {CVPR Findings},
year = {2026}
}

License

The source code is released under the MIT License. See LICENSE for details. Demo assets and external runtimes are governed by their own licenses.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats

Official code release for Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats.

Project Page | arXiv

Overview

This project couples Genesis physics simulation with NVIDIA Omniverse RTX rendering for heterogeneous scenes that combine 3D Gaussian Splats, deformable objects, fluids, cloth, and rigid geometry.

The paper discusses a UE5 rendering backend for high-end production rendering. This release provides an Omniverse RTX backend for easier setup and reproducibility; the heterogeneous simulation components can also be connected to UE5 for more advanced water and production rendering effects.

This repository provides two runnable examples:

ScriptDemoOutput
scripts/run_donut_chocolate.sh3DGS donuts with viscous chocolate drizzleoutputs/donut_chocolate/omniverse_render.mp4
scripts/run_cloth_statue.shTextured cloth sliding over a 3DGS statue sceneoutputs/cloth_statue_3dgs/omniverse_render.mp4

Preview media are included under media/:

  • media/donut_chocolate_preview.mp4
  • media/donut_chocolate_preview.gif
  • media/cloth_statue_3dgs_preview.mp4
  • media/cloth_statue_3dgs_preview.gif

Repository Layout

third_party/genesis-world/ Bundled Genesis simulator source used by the demos
src/genesis_omniverse_bridge/ Genesis-to-Omniverse bridge implementation
src/genesis_omniverse_bridge/omni/
Omniverse Kit launch and RTX rendering code
scripts/ Runnable demo entry points
configs/ Demo simulation and rendering configurations
media/ Lightweight preview videos and GIFs
assets/ Demo assets after extracting the asset archive

Quick Start

Clone the repository:

git clone https://github.com/xiaoyangliu137/raf.git scene-level-heterogeneous-physics-simulation
cd scene-level-heterogeneous-physics-simulation

Create and activate the Python environment:

conda create -n scene-physics-3dgs python=3.11 -y
conda activate scene-physics-3dgs

Install PyTorch and the Python packages:

pip install torch --index-url https://download.pytorch.org/whl/cu124
pip install -e third_party/genesis-world
pip install -e .

The third_party/genesis-world package is the bundled Genesis simulator source used by these demos. Do not replace it with the official upstream Genesis package when reproducing these examples.

Download the demo asset archive from Google Drive, then extract it into the repository root:

unzip ~/Downloads/scene-level-heterogeneous-physics-simulation-assets.zip -d .
ls assets/donuts assets/cloth_statue

Set up NVIDIA Omniverse Kit. This project uses Kit as the RTX renderer runtime; the rendering code is included in this repository, but the NVIDIA Kit runtime must be installed separately.

Requirements:

  • Linux x86_64.
  • NVIDIA RTX GPU with a recent NVIDIA driver.
  • An Omniverse Kit runtime containing kit and apps/omni.app.viewport.kit.

Recommended setup using NVIDIA's official Kit App Template:

cd ..
git clone https://github.com/NVIDIA-Omniverse/kit-app-template.git
cd kit-app-template
./repo.sh template new
./repo.sh build
export OMNI_KIT_ROOT="$(pwd)/_build/linux-x86_64/release/kit"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES
cd ../scene-level-heterogeneous-physics-simulation

When ./repo.sh template new prompts for a template, choose an Application template and select Kit Base Editor. The ./repo.sh build step creates the local Kit runtime used by this project.

Alternative setup using NGC:

  • Open the Omniverse Kit SDK Linux package.
  • Install the NGC CLI and run ngc config set.
  • Use the download command shown on the NGC Kit SDK page for the current Linux Kit SDK version.
  • Extract/build the SDK package, then set OMNI_KIT_ROOT to the folder that contains both kit and apps/omni.app.viewport.kit.

If Kit is already installed somewhere on the machine, locate it and set OMNI_KIT_ROOT manually:

KIT_EXE=$(find "$HOME" /opt /tmp -type f -name kit -path '*kit*'2>/dev/null | head -n 1)export OMNI_KIT_ROOT="$(dirname "$KIT_EXE")"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES

Useful official references:

The NVIDIA runtime itself is not vendored in this repository; the bundled Genesis source and the Omniverse rendering bridge code are included.

Omniverse Version and 3DGS Compatibility

Use the newest Omniverse Kit SDK available for your machine when possible. Native 3D Gaussian Splat rendering in this project relies on OpenUSD ParticleField support and Omniverse RTX Particle Field imaging. OpenUSD 26.03 introduced the ParticleField schema family for 3D Gaussian Splats, and Omniverse RTX 110.1 documents native Particle Field rendering with path tracing, shadows, reflections, and refractions. In practice, use a Kit/RTX build that includes the OpenUSD ParticleField3DGaussianSplat schema and the omni.usd.schema.usd_particle_field extension.

The launcher in this repository enables the required extensions explicitly:

omni.usd
omni.usd.schema.usd_particle_field
omni.hydra.rtx
omni.kit.renderer.capture

The renderer also handles schema namespace differences across Kit builds. It first tries UsdParticleField.ParticleField3DGaussianSplat, then UsdVol.ParticleField3DGaussianSplat, and finally authors a ParticleField3DGaussianSplat prim directly. This compatibility path helps with Kit/OpenUSD version differences, but it does not replace a renderer that lacks ParticleField imaging support.

If the latest Kit starts correctly on your GPU, use it. If the latest Kit fails because of driver/runtime compatibility on your system, use an older Kit runtime that still includes ParticleField support and run a smoke test:

FRAME_LIST=0,last ./scripts/run_donut_chocolate.sh

For driver-limited systems where Path Tracing is unstable but RTX rendering works, try the real-time RTX mode without changing the YAML files:

RENDER_OVERRIDE='{"path_tracing": false, "spp": 128, "frame_settle_frames": 64}' \
FRAME_LIST=0,last \
./scripts/run_donut_chocolate.sh

This fallback uses RaytracedLighting instead of PathTracing. It is useful for compatibility testing, while the default donut/chocolate demo remains configured for higher-quality path-traced rendering.

Relevant ParticleField references:

Select a GPU and run the demos:

export CUDA_VISIBLE_DEVICES=0
./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

The output videos are written to:

outputs/donut_chocolate/omniverse_render.mp4
outputs/cloth_statue_3dgs/omniverse_render.mp4

For a short smoke test, render only three frames:

FRAME_LIST=0,60,last ./scripts/run_donut_chocolate.sh
FRAME_LIST=0,120,last ./scripts/run_cloth_statue.sh

Remove FRAME_LIST for full video rendering.

Omniverse Rendering Code

The Omniverse rendering implementation is included in this repository:

src/genesis_omniverse_bridge/omni/run_kit.py
src/genesis_omniverse_bridge/omni/render_demo.py
src/genesis_omniverse_bridge/gaussian.py
src/genesis_omniverse_bridge/donut_3dgs.py

run_kit.py launches Omniverse Kit in headless RTX mode. render_demo.py builds the USD stage, creates the camera, lights, mesh tracks, chocolate surface mesh, cloth mesh, and OpenUSD ParticleField 3DGS prims, then renders PNG frames. The final MP4 is encoded by the Python CLI after rendering.

Each demo run performs:

Genesis simulation
-> genesis_native.mp4
-> simulation_tracks.npz
-> manifest.json
Omniverse RTX rendering
-> stage.usdc
-> rtx_frames/
-> omniverse_render.mp4

Run Demos

The main entry points are:

./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

Each run writes:

outputs/<demo>/
├── genesis_native.mp4
├── manifest.json
├── omniverse_render.mp4
├── rtx_frames/
├── simulation_tracks.npz
└── stage.usdc

Preview

The animations below show representative outputs from the default configurations. Click a preview to open the higher-quality MP4.

3DGS donuts with viscous chocolate drizzle

3DGS donuts with viscous chocolate drizzle

Textured cloth sliding over a 3DGS statue scene

Textured cloth sliding over a 3DGS statue scene

Configuration

Default demo parameters are in:

configs/donut_chocolate.yaml
configs/cloth_statue_3dgs.yaml

Commonly edited sections include:

  • simulation: timestep, duration, gravity, and solver settings.
  • camera: resolution, pose, field of view, and orbit settings.
  • donuts: initial object placement and material settings.
  • donut_3dgs_render: 3DGS asset paths and render alignment.
  • emitter: chocolate source position, motion, and material settings.
  • cloth: cloth size, material, texture, and initial pose.
  • gaussian: 3DGS scene path and display parameters.
  • render_settings: Omniverse resolution, sampling, bounces, and lights.

Paths in YAML files are relative to the config file location.

Citation

If you find this code useful, please cite:

@inproceedings{liu2026scenelevel,
title = {Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats},
author = {Liu, Xiaoyang and Wu, Shangzhe and Han, Kai},
booktitle = {CVPR Findings},
year = {2026}
}

License

The source code is released under the MIT License. See LICENSE for details. Demo assets and external runtimes are governed by their own licenses.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats

Official code release for Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats.

Project Page | arXiv

Overview

This project couples Genesis physics simulation with NVIDIA Omniverse RTX rendering for heterogeneous scenes that combine 3D Gaussian Splats, deformable objects, fluids, cloth, and rigid geometry.

The paper discusses a UE5 rendering backend for high-end production rendering. This release provides an Omniverse RTX backend for easier setup and reproducibility; the heterogeneous simulation components can also be connected to UE5 for more advanced water and production rendering effects.

This repository provides two runnable examples:

ScriptDemoOutput
scripts/run_donut_chocolate.sh3DGS donuts with viscous chocolate drizzleoutputs/donut_chocolate/omniverse_render.mp4
scripts/run_cloth_statue.shTextured cloth sliding over a 3DGS statue sceneoutputs/cloth_statue_3dgs/omniverse_render.mp4

Preview media are included under media/:

  • media/donut_chocolate_preview.mp4
  • media/donut_chocolate_preview.gif
  • media/cloth_statue_3dgs_preview.mp4
  • media/cloth_statue_3dgs_preview.gif

Repository Layout

third_party/genesis-world/ Bundled Genesis simulator source used by the demos
src/genesis_omniverse_bridge/ Genesis-to-Omniverse bridge implementation
src/genesis_omniverse_bridge/omni/
Omniverse Kit launch and RTX rendering code
scripts/ Runnable demo entry points
configs/ Demo simulation and rendering configurations
media/ Lightweight preview videos and GIFs
assets/ Demo assets after extracting the asset archive

Quick Start

Clone the repository:

git clone https://github.com/xiaoyangliu137/raf.git scene-level-heterogeneous-physics-simulation
cd scene-level-heterogeneous-physics-simulation

Create and activate the Python environment:

conda create -n scene-physics-3dgs python=3.11 -y
conda activate scene-physics-3dgs

Install PyTorch and the Python packages:

pip install torch --index-url https://download.pytorch.org/whl/cu124
pip install -e third_party/genesis-world
pip install -e .

The third_party/genesis-world package is the bundled Genesis simulator source used by these demos. Do not replace it with the official upstream Genesis package when reproducing these examples.

Download the demo asset archive from Google Drive, then extract it into the repository root:

unzip ~/Downloads/scene-level-heterogeneous-physics-simulation-assets.zip -d .
ls assets/donuts assets/cloth_statue

Set up NVIDIA Omniverse Kit. This project uses Kit as the RTX renderer runtime; the rendering code is included in this repository, but the NVIDIA Kit runtime must be installed separately.

Requirements:

  • Linux x86_64.
  • NVIDIA RTX GPU with a recent NVIDIA driver.
  • An Omniverse Kit runtime containing kit and apps/omni.app.viewport.kit.

Recommended setup using NVIDIA's official Kit App Template:

cd ..
git clone https://github.com/NVIDIA-Omniverse/kit-app-template.git
cd kit-app-template
./repo.sh template new
./repo.sh build
export OMNI_KIT_ROOT="$(pwd)/_build/linux-x86_64/release/kit"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES
cd ../scene-level-heterogeneous-physics-simulation

When ./repo.sh template new prompts for a template, choose an Application template and select Kit Base Editor. The ./repo.sh build step creates the local Kit runtime used by this project.

Alternative setup using NGC:

  • Open the Omniverse Kit SDK Linux package.
  • Install the NGC CLI and run ngc config set.
  • Use the download command shown on the NGC Kit SDK page for the current Linux Kit SDK version.
  • Extract/build the SDK package, then set OMNI_KIT_ROOT to the folder that contains both kit and apps/omni.app.viewport.kit.

If Kit is already installed somewhere on the machine, locate it and set OMNI_KIT_ROOT manually:

KIT_EXE=$(find "$HOME" /opt /tmp -type f -name kit -path '*kit*'2>/dev/null | head -n 1)export OMNI_KIT_ROOT="$(dirname "$KIT_EXE")"test -x "$OMNI_KIT_ROOT/kit"test -f "$OMNI_KIT_ROOT/apps/omni.app.viewport.kit"export OMNI_KIT_ACCEPT_EULA=YES

Useful official references:

The NVIDIA runtime itself is not vendored in this repository; the bundled Genesis source and the Omniverse rendering bridge code are included.

Omniverse Version and 3DGS Compatibility

Use the newest Omniverse Kit SDK available for your machine when possible. Native 3D Gaussian Splat rendering in this project relies on OpenUSD ParticleField support and Omniverse RTX Particle Field imaging. OpenUSD 26.03 introduced the ParticleField schema family for 3D Gaussian Splats, and Omniverse RTX 110.1 documents native Particle Field rendering with path tracing, shadows, reflections, and refractions. In practice, use a Kit/RTX build that includes the OpenUSD ParticleField3DGaussianSplat schema and the omni.usd.schema.usd_particle_field extension.

The launcher in this repository enables the required extensions explicitly:

omni.usd
omni.usd.schema.usd_particle_field
omni.hydra.rtx
omni.kit.renderer.capture

The renderer also handles schema namespace differences across Kit builds. It first tries UsdParticleField.ParticleField3DGaussianSplat, then UsdVol.ParticleField3DGaussianSplat, and finally authors a ParticleField3DGaussianSplat prim directly. This compatibility path helps with Kit/OpenUSD version differences, but it does not replace a renderer that lacks ParticleField imaging support.

If the latest Kit starts correctly on your GPU, use it. If the latest Kit fails because of driver/runtime compatibility on your system, use an older Kit runtime that still includes ParticleField support and run a smoke test:

FRAME_LIST=0,last ./scripts/run_donut_chocolate.sh

For driver-limited systems where Path Tracing is unstable but RTX rendering works, try the real-time RTX mode without changing the YAML files:

RENDER_OVERRIDE='{"path_tracing": false, "spp": 128, "frame_settle_frames": 64}' \
FRAME_LIST=0,last \
./scripts/run_donut_chocolate.sh

This fallback uses RaytracedLighting instead of PathTracing. It is useful for compatibility testing, while the default donut/chocolate demo remains configured for higher-quality path-traced rendering.

Relevant ParticleField references:

Select a GPU and run the demos:

export CUDA_VISIBLE_DEVICES=0
./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

The output videos are written to:

outputs/donut_chocolate/omniverse_render.mp4
outputs/cloth_statue_3dgs/omniverse_render.mp4

For a short smoke test, render only three frames:

FRAME_LIST=0,60,last ./scripts/run_donut_chocolate.sh
FRAME_LIST=0,120,last ./scripts/run_cloth_statue.sh

Remove FRAME_LIST for full video rendering.

Omniverse Rendering Code

The Omniverse rendering implementation is included in this repository:

src/genesis_omniverse_bridge/omni/run_kit.py
src/genesis_omniverse_bridge/omni/render_demo.py
src/genesis_omniverse_bridge/gaussian.py
src/genesis_omniverse_bridge/donut_3dgs.py

run_kit.py launches Omniverse Kit in headless RTX mode. render_demo.py builds the USD stage, creates the camera, lights, mesh tracks, chocolate surface mesh, cloth mesh, and OpenUSD ParticleField 3DGS prims, then renders PNG frames. The final MP4 is encoded by the Python CLI after rendering.

Each demo run performs:

Genesis simulation
-> genesis_native.mp4
-> simulation_tracks.npz
-> manifest.json
Omniverse RTX rendering
-> stage.usdc
-> rtx_frames/
-> omniverse_render.mp4

Run Demos

The main entry points are:

./scripts/run_donut_chocolate.sh
./scripts/run_cloth_statue.sh

Each run writes:

outputs/<demo>/
├── genesis_native.mp4
├── manifest.json
├── omniverse_render.mp4
├── rtx_frames/
├── simulation_tracks.npz
└── stage.usdc

Preview

The animations below show representative outputs from the default configurations. Click a preview to open the higher-quality MP4.

3DGS donuts with viscous chocolate drizzle

3DGS donuts with viscous chocolate drizzle

Textured cloth sliding over a 3DGS statue scene

Textured cloth sliding over a 3DGS statue scene

Configuration

Default demo parameters are in:

configs/donut_chocolate.yaml
configs/cloth_statue_3dgs.yaml

Commonly edited sections include:

  • simulation: timestep, duration, gravity, and solver settings.
  • camera: resolution, pose, field of view, and orbit settings.
  • donuts: initial object placement and material settings.
  • donut_3dgs_render: 3DGS asset paths and render alignment.
  • emitter: chocolate source position, motion, and material settings.
  • cloth: cloth size, material, texture, and initial pose.
  • gaussian: 3DGS scene path and display parameters.
  • render_settings: Omniverse resolution, sampling, bounces, and lights.

Paths in YAML files are relative to the config file location.

Citation

If you find this code useful, please cite:

@inproceedings{liu2026scenelevel,
title = {Scene-Level Heterogeneous Physics Simulation with 3D Gaussian Splats},
author = {Liu, Xiaoyang and Wu, Shangzhe and Han, Kai},
booktitle = {CVPR Findings},
year = {2026}
}

License

The source code is released under the MIT License. See LICENSE for details. Demo assets and external runtimes are governed by their own licenses.

Releases

Packages

Contributors

Languages