DEV Community

Cover image for image-blaster: the real cost of one image 3D world
tia-forge
tia-forge

Posted on Originally published at bimant.com

image-blaster: the real cost of one image 3D world

One image in, a walkable 3D environment out in under five minutes. That is the pitch on neilsonnn/image-blaster — 11.8k stars, MIT, front page of Hacker News in May 2026. Built by a World Labs team member (not an official World Labs product), it chains Marble, Hunyuan 3D, nano-banana and ElevenLabs behind a Claude Code skill.

Two questions decide whether you can use it, and the eight English write-ups I could find answer neither:

  1. What does one run actually cost? (Short answer: the world is fixed at ~$1.34; every dynamic object adds ~$0.46.)
  2. Can you drop the outputs into an engine? (Short answer: not before you apply a scale correction the CLI never applies for you.)

Both answers are below, with code references and prices as of 2026-10-21.

What it actually is

Not an app — a skill pack for Claude Code. You clone the repo, run claude inside it, hand Claude two API keys (World Labs + FAL), drop an image into input/, and say blast it and confirm each step with me.

Repo neilsonnn/image-blaster, MIT
Timeline created 2026-04-21, last push 2026-05-15; 11,794 ★ (snapshot 2026-10-21)
Form .claude/skills/* + Node scripts
Requires Claude Code CLI + World Labs key + FAL key
Outputs dynamic objects .glb/.obj; static environment .spz; SFX .mp3

The three outputs are not the same kind of thing, and that is where every downstream problem starts:

Output Format What it is What it is not
Static environment .spz a Gaussian-splat scene you can walk through not a mesh — no faces, no UVs; needs splat render support
Dynamic objects .glb / .obj one real mesh per object not a scene — you place them yourself
SFX .mp3 ambient loop + per-object impact not a mixed audio system

The pipeline, as it actually executes (read from the scripts, not the README):

input/ image
  ├─① clean plate / object cut-outs   fal-ai/nano-banana-2/edit          $0.08/img
  ├─② static environment             World Labs marble-1.1              1,500 credits
  │     └→ .spz (full_res + 500k + 100k + 150k downloaded)
  │     └→ collider mesh .glb (100–200k triangles)
  ├─③ each dynamic object            fal-ai/hunyuan-3d/v3.1/pro/...     $0.375/call
  │                                  (or .../rapid $0.225, fal-ai/meshy/v6 $0.80)
  └─④ SFX                            fal-ai/elevenlabs/sound-effects/v2 $0.002/sec
Enter fullscreen mode Exit fullscreen mode

Two details that matter and are easy to miss:

  • Every object costs one image edit before the 3D call. The image-blast-3d skill instructs Claude to first write a cut-out prompt ("Isolate the <object> … white background, centered, tight crop"). So an object is edit + 3D, not 3D.
  • SFX go through FAL, not ElevenLabs directly (fal-ai/elevenlabs/sound-effects/v2). If you price this off ElevenLabs credit tables you will be off by an order of magnitude. The skill's defaults: ambient --loop --count 2 --duration-seconds 10, per object --count 4 --duration-seconds 1.

The bill

Prices below are the vendors' own pages, checked 2026-10-21.

Item Price Source
World Labs credits $1.00 = 1,250 credits; minimum purchase $5 docs.worldlabs.ai/api/pricing
World generation marble-1.1 1,500 credits = $1.20 same
Pano generation (non-pano image) +80 credits = $0.064 same
HQ mesh export 3,500 credits = $2.80 same (this pipeline never calls it)
Image edit nano-banana-2/edit $0.08 / image (2K/4K ×1.5) FAL model page
Object 3D hunyuan-3d/v3.1/pro $0.375 / generation FAL model page
Object 3D .../rapid $0.225 / generation FAL model page
Object 3D meshy/v6 $0.80 / generation FAL model page
SFX elevenlabs/sound-effects/v2 $0.002 / second FAL model page

Which reduces to a very simple structure:

fixed per run   = world 1.264 (1,500 + 80 credits) + one plate edit 0.08   ≈ $1.34
per object      = cut-out edit 0.08 + 3D 0.375 + impact SFX 4s × 0.002     ≈ $0.46
Enter fullscreen mode Exit fullscreen mode
Scene Math Total
1 object 1.34 + 0.46 ≈ $1.81
5 objects (one room) 1.34 + 5 × 0.46 ≈ $3.66
20 objects (street / level) 1.34 + 20 × 0.46 ≈ $10.60
20 objects on rapid 1.34 + 20 × (0.08 + 0.225 + 0.008) ≈ $7.62
20 objects on meshy v6 1.34 + 20 × (0.08 + 0.80 + 0.008) ≈ $19.10

Three non-obvious consequences:

  1. The world is the cheap part. Marble renders an entire environment for $1.26; five small props cost twice that. Your budget is a function of object count, not canvas size.
  2. The $2.80 HQ mesh export is not in the loop. generate-world.mjs only pulls assets.mesh.collider_mesh_url — the 100–200k-triangle collision mesh. If you want a static mesh you can actually look at, you have to go back to Marble and export the HQ version separately: ~600k triangles with textures (or ~1M with vertex colors), up to an hour, rate-limited to 4/hour, Pro plan.
  3. Failures are billable. Unhappy with face count? Re-run: another $0.375. Bad cut-out? Another $0.08. This is exactly why the skill's default posture is confirm each step with me.

Scope: these are estimates derived from the pipeline structure and public unit prices, not our own invoice. No retries, no plan differences (Free can generate worlds but cannot export; Standard covers splat/collider exports; Pro adds HQ mesh + commercial rights).

The part nobody writes about: the .spz is not in metric space

World Labs documents this in api/rendering-spz:

Marble SPZ files are exported in the generated asset coordinate frame. When you render them outside Marble, use assets.splats.semantics_metadata to convert Gaussian centers and Gaussian sizes into metric, ground-aligned coordinates.

Field Job
metric_scale_factor raw generated units → meters
ground_plane_offset puts the metric ground plane at y = 0
flip_y (optional) Y-axis orientation (SPZ defaults to RUB, Unreal is Z-up)

So: is it handled? I grepped the whole repo (2026-10-21, main):

Location Reads semantics_metadata?
app/src/components/WorldViewer.tsx (bundled React viewer) Yes — metric_scale_factor, ground_plane_offset, flip_y, defaults 1 / 0
.claude/scripts/** (the CLI pipeline that hands you the files) No — downloads spz_urls and collider_mesh_url, nothing else

Which means: it looks right in the bundled viewer because the viewer applies the correction, and it is wrong in Unity / Unreal / Blender / three.js because the exported files don't carry it. Symptoms: a door 30+ units tall, everything floating above or sunk into the floor, and props misaligned against the splat they were generated from.

// three.js: the loader reads the file, it does not fix the frame
const world = await new SPZLoader().loadAsync(url);
const m = semantics.metric_scale_factor;
world.scale.setScalar(m);
world.position.y -= semantics.ground_plane_offset;
Enter fullscreen mode Exit fullscreen mode

Apply the same factor to the collider mesh (inference — the docs only spell this out for splats, but both come from the same generated frame).

What the outputs really are

Output Official spec Who reads it natively
Splat .spz (full res) ~2M splats three.js (SPZLoader in addons); Unity / Unreal / Blender / Houdini need community splat plugins
Splat .spz (low res) ~500k / 100k / 150k same; lower res is what you actually want in-engine
Splat .ply ~2M / ~500k widest compatibility, much bigger — SPZ is roughly 10× smaller than the equivalent PLY
Collider .glb 100–200k triangles any engine; it is a physics proxy, not a render mesh
HQ .glb (Pro) ~600k textured / ~1M vertex-color any engine; not produced by this pipeline

Ten-minute acceptance checklist

# Check How If it fails
1 Units are meters measure a known reference (2 m door) apply metric_scale_factor
2 Ground at y = 0 splat floor on the zero plane subtract ground_plane_offset
3 Orientation upside down → flip_y; rotated → world yaw flip / rotate
4 Splat and mesh share scale overlay the same chair twice use one factor for both
5 Face count holds up close zoom to player distance re-run with --face-count (billed again)
6 Collider ≠ render mesh 100–200k tri file is the collider keep both, don't swap
7 File size prefer low-res .spz in-engine see the payload comparison link below
8 Licensing code is MIT; assets are generated by third-party APIs Marble commercial rights sit on Pro; check each vendor

Four things that will bite you

  1. Static/dynamic split errors → ghosting. The splat already contains the chair; generate a mesh of the chair and now you have two. Wrong split = double image, and an extra object you didn't want costs $0.46.
  2. The splat/mesh boundary leaks. Splats have no geometry, cast no shadows, don't receive light like meshes. Contact shadows and occlusion at the seam won't match. (Inference: add AO blob decals under meshes, or cover the contact band with mesh.)
  3. The 50k default is the skill's, not the API's. Hunyuan's own default is 500,000 faces. Background props are fine; hero objects look generated up close.
  4. SFX are materials, not an audio system. Two 10-second ambient loops, four 1-second impacts per object. No rolling, no sustained sounds, no material variation. Non-loop output gets trimmed and loudness-normalized by ffmpeg; loop output is left raw for seamlessness.

When not to use it

You want Why not Instead
One model, no scene the $1.34 world is wasted call the FAL model directly
Precise dimensions generation isn't dimension-driven parametric CAD workflow
Editable topology / clean UVs you get "scanned" topology rebuild from the form (Mesh2CAD route)
Offline / on-prem the whole chain is two cloud APIs local text-to-3D (e.g. TRELLIS.2 in-browser)
Team doesn't use Claude Code it's a skill pack, not a GUI app drive the scripts yourself
Clean commercial rights assets come from multiple vendors verify each license

The one thing it is genuinely good at: you have an image — concept art, a film still, a photo of a room — and you need a prototype you can walk around in within five minutes to align the space, test framing, or show a client. For that, it beats hand-building the scene by a wide margin.


Scope and sources: repo README, `.claude/skills/ and .claude/scripts/ (2026-10-21, main); World Labs docs (api/pricing, marble/export/specs, marble/export/gaussian-splat, api/rendering-spz); FAL model pages; Niantic spz format notes and three.js SPZLoader`. **No end-to-end run was performed* — costs are structural estimates from public unit prices, and mesh/engine/license constraints come from documentation rather than our own tests. The author is a World Labs team member; this is their project, not an official World Labs product.*

More from us: the full Chinese write-up with the same billing breakdown · AI × 3D guides on BimAnt

Top comments (1)

Collapse
 
alexcodebytes profile image
Oleksandr •

"The .spz is not in metric space" is the part that should be in the README, not buried in a blog post.

I've seen this exact problem with other 3D generation tools: the preview looks perfect, but when you export to Unity or Unreal, everything is 30x too big and floating in the air. The fix is always the same — apply the scale factor and ground plane offset — but nobody documents it.

Curious if the author has considered a "fix everything" CLI flag. Something like --apply-metric-correction that bakes the semantics_metadata into the exported files, so the user doesn't have to write a custom three.js script.