Multi-view datasets from 3D models

One API call renders a model into vision training data: up to 400 posed views with depth, normals, and masks, delivered as a single zip.

# model in, dataset out
curl -X POST https://api.pinwing.ai/v1/renders \
  -H "Authorization: Bearer pinwing_sk_…" \
  -H "Content-Type: application/json" \
  -d '{"modelId":"Ab3kF9x2qL1m","renderSettings":{"output":"dataset","datasetQuality":"196x1024"}}'

Flat price per set. Poll the render, then download one zip.

What's in the zip

  • •

    images/ RGB PNG frames, one per view.

  • •

    depth/ and depth_16bit/ grayscale depth maps in 8-bit and 16-bit variants, with tight near/far planes so precision is spent across the model's actual depth span.

  • •

    normals/ and masks/ per-view normal maps and anti-aliased alpha masks.

  • •

    transforms.json camera poses and intrinsics in instant-ngp and nerfstudio formats at once.

  • •

    points3D.ply a seed point cloud, ready to initialize Gaussian-splat training.

  • •

    overview.webp a contact sheet across RGB, depth, normals, and masks, for a quick sanity check before training.

Three tiers, flat price

100x800 renders 100 views at 800 px for 40 credits, 196x1024 renders 196 views at 1024 px for 160, and 400x2048 renders 400 views at 2048 px for 640. Views cover the upper hemisphere by default; coverage: "sphere" surrounds the model fully.

Datasets render from the same uploads as videos, so a photogrammetry scan that became a turntable can produce training data without a second upload. Unzip and point nerfstudio at the folder: transforms.json and points3D.ply are picked up directly. Train with --pipeline.model.background-color white, because the RGB frames are composited on white.

The whole flow, four requests

# 1 — import a model from a URL (or POST /v1/models with a file)
curl -X POST https://api.pinwing.ai/v1/models/ingest \
  -H "Authorization: Bearer pinwing_sk_…" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/model.glb"}'

# 2 — request the dataset render (same two headers on every POST)
curl -X POST https://api.pinwing.ai/v1/renders \
  -H "Authorization: Bearer pinwing_sk_…" \
  -H "Content-Type: application/json" \
  -d '{"modelId":"…","renderSettings":{"output":"dataset","datasetQuality":"100x800"}}'

# 3 — poll until status is done
curl -H "Authorization: Bearer pinwing_sk_…" https://api.pinwing.ai/v1/renders/RENDER_ID

# 4 — download the zip
curl -OJ -H "Authorization: Bearer pinwing_sk_…" https://api.pinwing.ai/v1/renders/RENDER_ID/dataset

Agents run the same loop through the hosted MCP server: import, quote, render, download, from a prompt. If you already know what a multi-view dataset is, your agent can take it from here.

Datasets — common questions

One transforms.json carries both conventions: instant-ngp fields (camera_angle_x/y) and nerfstudio intrinsics (fl_x, fl_y, cx, cy), plus a per-frame transform matrix and the depth near/far planes. Most NeRF and splatting toolchains read it without conversion.
Viewpoints sit on a Fibonacci spiral: evenly spread, no duplicate poses. Default coverage is the upper hemisphere, from slightly below the model's equator to steeply overhead; set coverage to "sphere" and the views surround it fully, undersides included.
Flat per set: 40 credits for 100 views at 800 px, 160 for 196 views at 1024 px, 640 for 400 views at 2048 px. No per-second math. The 100 free credits on a new account cover a 100-view set with change left over, and the quote endpoint prices any settings object before you commit.
Only once, to create an API key. After that everything runs over REST or MCP. Uploads take a GLB or a zipped OBJ scan export; a raw .gltf needs packing into .glb first, same as for video renders.

Every endpoint, setting, and credit rate is in the reference.