Developer Docs
Configure, calibrate, and export physically accurate, simulation-ready 3D assets and robotic workspaces in seconds.
EnviScale uses a geometry-first approach, automatically deriving mass distribution, centers of mass, and bounding properties from mesh structures. It validates compatibility, builds collision hierarchies, generates domain randomization (DR) profiles, and compiles assets directly for MuJoCo, PyBullet, and Omniverse Isaac Sim.
Introduction
EnviScale bridges the gap between raw 3D assets and high-fidelity physics simulators. By automating the mechanical property extraction, collision geometry generation, and scene assembly pipeline, EnviScale eliminates manual parameter tuning and guesswork.
Core Pillars of EnviScale
- Geometry-Constrained Physics: Material table density priors bound final estimated masses against watertight volume calculations.
- Automatic Multi-Part Decomposition: Visual meshes are separated from clean analytic primitives or decomposed convex hulls for stable collision dynamics.
- Domain Randomization: Generates structured permutations representing wear-and-tear friction profiles and fluid-container fill states.
- Workspace Co-Locating: Places multiple manipulated objects onto templates (tables, shelves, bins) with correct physical support parameters.
Quick Start
Interact with the API immediately by posting raw geometries. Here is how to process a single asset or compile a full tabletop room workspace.
curl -X POST https://api.enviscale.com/api/v1/scene \ -H "X-API-Key: es_live_YOUR_KEY" \ -F "file=@mug.glb" \ --output mug_profiles.zip
curl -X POST https://api.enviscale.com/api/v1/scene/room \ -H "X-API-Key: es_live_YOUR_KEY" \ -F "files=@pliers.zip" \ -F "files=@vase.zip" \ -F "template=tabletop_manipulation" \ -F "seed=42" \ --output tabletop_scene.zip
Authentication
All API requests must be explicitly authenticated. Generate a key from your dashboard and inject it as the X-API-Key header.
# HTTP Header
X-API-Key: es_live_YOUR_API_KEY_HERE
Supported Formats
EnviScale ingests visual, mechanical assembly, or CAD formats, and unrolls nested ZIP packages natively to resolve external textures or material definitions.
Single Object API Reference
Extract physical parameters, analyze geometry, and generate randomized domain files from a single input model.
Primary 3D asset or ZIP archive.
Buffers (.bin) or textures for .gltf uploads.
The target simulator description format.
Convex decomposition quality level.
Geometric unit scale override.
Room Scene API Reference
Generate a multi-object room workspace. Places 1 to 8 files or zip objects onto a layout surface (table, desk, shelf, or bin), resolving physics for each object and returning a single aggregated MJCF simulation environment.
Room Workspace Templates Details:
- desk_manipulation: Places objects on a standard 1.2m x 0.8m office desk at height 0.75m. Uses a real, textured desk mesh.
- tabletop_manipulation: Places objects on a compact 0.8m x 0.8m table at height 0.6m. Uses the real, textured table model from table.zip.
- shelf_grasp: Spreads objects across levels of a standing-reach shelf unit up to height 1.2m. Uses a real shelf model.
- warehouse_bin: Places objects inside a floor-level picking bin. Enforces sizing filters to skip objects that would penetrate the bin walls.
Physics Constraints
EnviScale does not estimate physics values arbitrarily. The system enforces strict physical bounds derived directly from geometric properties:
1. Mass-Volume Scaling
Mass Range = [Volume × DensityMin, Volume × DensityMax]If an override falls outside these bounds, or the inferred mass violates this, warnings are returned.2. Hollow Shell Approximation
Shell Volume ≈ Surface Area × Wall ThicknessThis approximates realistic weights for items like plastic cups, metallic buckets, and ceramic vases.3. Inertia & Stability Constraints
Moments of inertia are calculated along principal axes. To prevent physics engines from blowing up due to zero or negative inertia values, EnviScale enforces a strict diagonal minimum of 10⁻⁶ kg·m².
Calibration Overrides
Advanced workflows benefit from injecting real hardware calibration measurements. Optional override parameters let you overwrite inferred defaults:
Overrides Prioritization & Hierarchy
- Inference Phase: watertight volume, baseline center of mass, and default material properties are resolved.
- Overrides Layering: If material_override, density_override, mass_override_kg, friction_override, or restitution_override are supplied, they are layered on top of the geometry properties.
- Mass Dominance: If both density_override and mass_override_kg are present, mass_override_kg becomes authoritative.
- DR Realignment: Friction boundaries and domain randomization ranges automatically center around the final overridden values.
Domain Randomization (DR) Profiles
EnviScale generates multiple, distinct simulator profiles to support robust sim-to-real transfer. These profiles permute friction parameters and mass distribution:
Friction Wear Profiles
- clean (1.0x): Standard surface contact friction.
- worn (0.6x): Scuffed surface sliding friction (0.6x) and lower restitution (0.85x).
- contaminated (0.35x): Simulates oily/wet contact with low sliding friction (0.35x) and reduced torsion.
Fluid Fill Profiles
- empty (0.0x): Empty containers with standard CoM.
- half_full (0.5x): Adds fluid mass (water-equivalent) and shifts the CoM downward by 15% of object height.
- full (1.0x): Adds full fluid mass and shifts CoM downward by 25% of height.
Robot & USD Validation
Prior to returning response binaries, EnviScale runs automated simulation QA tests on the generated files to prevent physics errors:
MJCF Physics Sanity Checks
Validates that the XML complies with MuJoCo expectations. Ensures diagonal inertia parameters satisfy the triangle inequality, joints are free from initial interpenetration, and geoms have correct contype and conaffinity mappings.
USD stage & Isaac Sim Diagnostics
If export format includes usd_physics, the engine runs Omniverse/Isaac Sim compliance tests. Checks bounding APIs, physics schemas, material bindings, and rigid body configurations.
Real-time Header Telemetry
Check response headers for direct pipeline validation results without needing to unzip:
X-Processing-Time: 4.82s X-Confidence: 0.92 X-Final-Mass: 0.3541 X-Inferred-Material: plastic X-Object-Name: spray_bottle X-Overrides-Applied: false
Code Examples
Integrate EnviScale processing endpoints into your Python training or dataset preparation scripts.
1. Single Asset Upload
Basic request exporting MJCF physics for a local GLB model.
import requests
url = "https://api.enviscale.com/api/v1/scene"
headers = {"X-API-Key": "es_live_YOUR_API_KEY"}
data = {
"export_format": "mjcf",
"collision_quality": "balanced"
}
with open("mug.glb", "rb") as f:
response = requests.post(url, headers=headers, files={"file": f}, data=data)
with open("mug_compiled.zip", "wb") as out:
out.write(response.content)2. Processing with Calibration Overrides
Injecting real mass and sliding friction overrides.
import requests
url = "https://api.enviscale.com/api/v1/scene"
headers = {"X-API-Key": "es_live_YOUR_API_KEY"}
data = {
"mass_override_kg": "0.24", # exact weight from scale
"friction_override": "0.45" # calibrated slide friction
}
with open("pliers.gltf", "rb") as f:
response = requests.post(url, headers=headers, files={"file": f}, data=data)3. ZIP Dataset Upload (GLTF with textures)
Send a ZIP package containing GLTF mesh files and local textures directory.
import requests
url = "https://api.enviscale.com/api/v1/scene"
headers = {"X-API-Key": "es_live_YOUR_API_KEY"}
with open("vase_textures_bundle.zip", "rb") as f:
response = requests.post(
url,
headers=headers,
files={"file": ("vase.zip", f, "application/zip")}
)4. Room Scene Assembly
Places multiple objects onto a tabletop workspace layout with correct support geometry.
import requests
url = "https://api.enviscale.com/api/v1/scene/room"
headers = {"X-API-Key": "es_live_YOUR_API_KEY"}
data = {
"template": "tabletop_manipulation", # Places on 0.6m table
"seed": "101", # Deterministic layout seed
"surface_condition": "clean"
}
files = [
("files", ("mug.zip", open("mug.zip", "rb"), "application/zip")),
("files", ("pliers.zip", open("pliers.zip", "rb"), "application/zip")),
]
response = requests.post(url, headers=headers, files=files, data=data)
with open("compiled_room_scene.zip", "wb") as out:
out.write(response.content)Response Structure
The API responds directly with an `application/zip` stream. Below is the internal format and structure of files contained within the returned archive:
Sample physics_report.json Telemetry Data
{
"job_id": "8b949e22-4a62-43e7-9381-c886080a8c26",
"scene_name": "ceramic_vase",
"object_category": "container",
"primary_material": "ceramic",
"unit_resolution": {
"source_units": "millimeters",
"scale_factor": 0.001,
"unit_confidence": 0.95
},
"geometry": {
"volume_m3": 0.000215,
"bounding_box_m": [0.082, 0.082, 0.165],
"collision_strategy": "convex_decomposition",
"is_watertight": true
},
"base_physics": {
"inferred": {
"mass_kg": 0.516,
"density_kgm3": 2400
},
"final": {
"mass_kg": 0.516,
"density_kgm3": 2400,
"friction_sliding": 0.60
}
},
"warnings": [],
"processing_time_seconds": 3.82
}Errors & Limits
API Response Codes
| 400 | Invalid mesh structure, unsupported file extension, or file too large (>50 MB). |
| 401 | Missing, inactive, or malformed API Key. |
| 403 | Subscription quota exceeded, or tier restricted operation. |
| 422 | Unprocessable parameter inputs (e.g. invalid template or unit keyword). |
| 500 | Internal pipeline execution error. Check error messages for trace details. |