Generate explorable 3D Gaussian Splat worlds from interior design images using the WorldLabs Marble API, rendered in-browser via Spark.js.
The VR World Generation feature converts any interior design image into a fully explorable 3D environment. Users can orbit, walk through, and inspect rooms in real time directly inside the Agent Hub chat interface — no external application required.
Key capabilities:
| Model | Credits | Generation Time | Best For |
|---|---|---|---|
marble-1.0-draft |
18 credits | ~30–45 seconds | Quick previews |
marble-1.1 |
190 credits | ~5 minutes | High-quality finals |
The legacy
marble-0.1-miniandmarble-0.1-plusmodels were deprecated by WorldLabs and are no longer accepted by the API. Pricing: $1 = 1,250 WL credits × 1.50 internal markup.
Each generated world produces:
| Asset | Description |
|---|---|
| SPZ file (100k) | Draft quality Gaussian Splat (smallest) |
| SPZ file (500k) | Standard quality Gaussian Splat |
| SPZ file (full) | Full quality Gaussian Splat (largest) |
| Collider GLB | Collision mesh for first-person navigation |
| Panorama image | 360° equirectangular render |
| Thumbnail | Preview image |
| Caption | AI-generated scene description |
DesignCanvas (Frontend) └─ "Generate VR" button │ ▼ Supabase Edge Function: generate-vr-world
is_pano: true for 360° source images)| Path | Purpose |
|---|---|
supabase/functions/generate-vr-world/index.ts |
Edge function orchestration |
src/components/features/ai/WorldViewer.tsx |
3D splat viewer component |
src/services/vrWorldService.ts |
Frontend API service |
Database: vr_worlds table |
World asset storage |
The WorldViewer component accepts worldId, splatUrls (draft/standard/full), colliderUrl, and caption props. It is rendered inline within agent chat message output.
Orbit Mode (default):
Walk Mode (WASD):
POST /functions/v1/generate-vr-world
The frontend polls the vr_worlds table via Supabase real-time subscriptions until status = 'completed'.
WORLDLABS_API_KEY is required in Supabase Edge Function secrets.
The vr_worlds table stores: id, workspace_id, message_id, world_id (WorldLabs world ID), model (marble-1.0-draft or marble-1.1), status (generating / completed / failed), splat_100k_url, splat_500k_url, splat_full_url, collider_glb_url, panorama_url, thumbnail_url, caption, credits_used, created_at, and updated_at.
Credits are deducted when generation starts and refunded automatically on failure.
| Model | Cost | Time |
|---|---|---|
| marble-1.0-draft | 18 credits | ~30–45s |
| marble-1.1 | 190 credits | ~5 min |
Credit balance is tracked in the internal credit system. See internal-pricing-credit-system.md for details.
@sparkjsdev/spark v0.1.10+three@0.178 (THREE.Matrix2 dependency)React.lazy() — the ~496KB renderer loads only when WorldViewer mountsSparkRenderer constructor requires @ts-expect-error due to missing typesVR worlds do not use vector embeddings, but all related product embeddings in the platform use halfvec (float16) for 50% storage savings. See system-architecture.md.
generate-vr-worldWORLDLABS_API_KEY is set and validmarble-1.1 model under loadthree@0.178 is installed (not 0.160 or earlier)Last Updated: April 15, 2026 Version: 1.1.0 Status: Production