SimReady Asset Pipeline#
The SimReady asset pipeline converts raw mesh archives into normalized simulation assets. It ingests a source mesh, preserves or bakes visual materials, cleans mesh topology, estimates real-world scale and semantics with multimodal LLMs, and exports assets that can be loaded directly in EmbodiChain simulations.
Quick Start#
Run the pipeline on a single asset directory:
python -m embodichain.gen_sim.simready_pipeline.cli.start \
--input_dir /path/to/raw_mesh_folder \
--output_root /path/to/output_folder \
--category YourCategory
Preview the generated SimReady mesh:
python -m embodichain preview-asset \
--asset_path /path/to/sim_ready_asset_or_usd_asset \
--asset_type rigid
Prerequisites#
The full pipeline uses Blender, trimesh, pyrender, and an OpenAI-compatible multimodal chat completions endpoint. Install EmbodiChain with the gensim extra first — see Installation (gensim extra) for package indexes and install commands.
Set the OpenAI-compatible LLM API (OpenAI, Gemini, Doubao, etc.) before running the pipeline, or configure them in embodichain/gen_sim/simready_pipeline/configs/gen_config.json. Environment variables override the JSON config.
OpenAI-compatible API example:
export OPENAI_API_KEY="your-openai-api-key"
export OPENAI_MODEL="gpt-4o"
export OPENAI_BASE_URL="https://api.openai.com/v1"
Processing Flow#
The command above runs the full parser sequence:
Ingest: finds the first parseable mesh (
.glb,.gltf,.obj,.ply,.stl), archives the raw input, and writes a canonicalasset_source/asset.obj.Visual processing: by default, Blender remeshes the source mesh, unwraps UVs, and bakes diffuse and normal textures. With
--simple, ingest uses trimesh only and skips Blender remesh/bake.Inspection: detects whether the normalized source is a mesh, articulation, or scene.
Geometry processing: cleans topology and applies Blender decimation to the canonical mesh.
SimReady finalization: renders multi-view images, uses the LLM to infer object orientation, physical dimensions, and semantics, then exports
asset_simready/asset_simready.obj.Physics and USD export: infers physics properties and writes a USD package when possible.
Internal preview assets: generates thumbnails and internal metadata for asset browsing.
Output Layout#
Each processed asset is written under a generated asset ID:
simready_car/
`-- <asset_id>/
|-- asset_archive/ # Raw source directory copy
|-- asset_source/ # Canonical normalized source mesh and textures
| |-- asset.obj
| |-- asset.mtl
| |-- diffuse.png
| `-- normal.png
|-- asset_simready/ # Final oriented and scaled mesh
| `-- asset_simready.obj
|-- asset_usd/ # USD export
`-- asset.json # Metadata, geometry, semantics, physics, and paths
Use asset_simready/asset_simready.obj or asset_usd/ for simulation preview and downstream scene construction.
Command-Line Arguments#
Argument |
Description |
Default |
|---|---|---|
|
Directory containing the raw asset files. |
required |
|
Directory where processed assets are written. |
required |
|
Category hint passed into the pipeline, such as |
required |
|
Use trimesh-only ingest and skip Blender remesh/bake during ingest. Geometry cleanup later in the pipeline still uses Blender. |
|
Configuration#
Pipeline hyperparameters live in embodichain/gen_sim/simready_pipeline/configs/gen_config.json. The main hyperparameters are as follow:
Mesh Processing#
"mesh_processing": {
"blender_remesh_bake": {
"remesh": {
"voxel_size": 0.01,
"min_voxel_size_ratio": 0.005,
"use_smooth_shade": true
},
"decimate": {
"ratio": 0.9
},
"uv": {
"angle_limit": 66.0,
"island_margin": 0.02
},
"bake": {
"texture_size": 2048,
"cage_extrusion_ratio": 0.05
}
},
"blender_cleanup_decimate": {
"enabled": true,
"cleanup": {
"merge_dist": 0.00001,
"remove_non_manifold": true,
"triangulate": false
},
"simplify": {
"ratio": 0.5,
"weld_distance": 0.0001,
"collapse_triangulate": true
}
},
}
blender_remesh_bake controls the default ingest path when --simple is not provided. It remeshes the raw mesh, decimates it, unwraps UVs, and bakes textures.
blender_cleanup_decimate controls the later geometry parser stage. It uses Blender mesh operators and the Blender Decimate modifier to clean and simplify the canonical mesh.
LLM#
"llm": {
"openai_compatible": {
"api_key": "",
"model": "gpt-4o",
"base_url": "https://api.openai.com/v1",
"default_query": {}
}
}
This section configures the multimodal LLM used for object classification, orientation selection, dimension inference, semantic annotation, and physics inference. Any provider that supports the OpenAI-compatible chat completions API can be used by changing api_key, model, base_url, and optional default_query parameters.
For Azure-style OpenAI-compatible endpoints that require an API version query parameter, use default_query:
"llm": {
"openai_compatible": {
"api_key": "your-api-key",
"model": "gpt-4o",
"base_url": "your_api",
"default_query": {
"api-version": "2025-01-01-preview"
}
}
}
Default vs Simple Ingest#
The default command uses Blender during ingest:
python -m embodichain.gen_sim.simready_pipeline.cli.start \
--input_dir /path/to/raw_mesh_folder \
--output_root /path/to/output_folder \
--category YourCategory
Use --simple when you want faster trimesh-only ingest:
python -m embodichain.gen_sim.simready_pipeline.cli.start \
--input_dir /path/to/raw_mesh_folder \
--output_root /path/to/output_folder \
--category YourCategory \
--simple
The simple mode only affects the ingest step. The downstream geometry parser still uses Blender cleanup and decimation unless mesh_processing.blender_cleanup_decimate.enabled is set to false.
See Also#
Asset Preview: Load generated meshes and USD assets in the simulator.
Installation: Install EmbodiChain with Blender and rendering dependencies.
Toolkits: Other asset preparation utilities.