AI 3D generationPaid · $SANDBOX

Turn a prompt or an image into a textured, rigged GLB model with Meshy or Tripo, paid in $SANDBOX and checked on chain before every generation starts.

The Generate panel of the asset editor turns a description or a reference image into a 3D model. The GLB file is produced by a third-party service (Meshy or Tripo), copied into Sandbox’s storage, then added to the project like any library model. Each generation is paid in $SANDBOX.

Coming soon Coming soon

The generator opens when $SANDBOX launches. Until then the panel shows the prices and the “Opens at the $SANDBOX launch” button stays disabled. The rest of the studio works without the token.

Pricing

Prices are in whole tokens. A generation costs a base (text or image) plus the options you pick. The studio and the server share the same table: what the panel asks you to pay is exactly what the server checks.

ItemPriceWhat you get
Text to 3D40 $SANDBOXDraft quality, textured.
Image to 3D60 $SANDBOXDraft quality, textured.
+ HD quality+30 $SANDBOXDenser mesh and 2K textures.
+ Rig and animations+40 $SANDBOXAuto-rig with walk, idle and run clips.

Examples

GenerationBreakdownTotal
Text, fast4040 $SANDBOX
Text, HD40 + 3070 $SANDBOX
Text, fast, rigged40 + 4080 $SANDBOX
Image, fast6060 $SANDBOX
Image, HD, rigged60 + 30 + 40130 $SANDBOX
src/lib/genPrice.tsTypeScript
export const GEN_PRICES = { text: 40, image: 60, high: 30, rig: 40 } as const

export function genPrice(r: { kind: 'text' | 'image'; quality: 'low' | 'high'; rig: boolean }) {
  return (r.kind === 'image' ? GEN_PRICES.image : GEN_PRICES.text)
    + (r.quality === 'high' ? GEN_PRICES.high : 0)
    + (r.rig ? GEN_PRICES.rig : 0)
}

How a generation runs

  1. Describe

    Pick Text to 3D or Image to 3D, write the prompt, set quality, texture, rig and provider. The button shows the total price.

  2. Pay

    Your wallet is only asked at this point: one $SANDBOX transfer to the treasury, for the exact amount shown.

  3. On-chain check

    The server waits for the transaction receipt (up to 45 s) and checks that it succeeded and contains a token Transfer from your address to the treasury of at least the price. One transaction pays for one generation only.

  4. Generation

    The job goes to Meshy or Tripo. The studio polls its state every 4 seconds and shows a progress bar that never moves back, even when the provider chains several stages (preview, refine, rig).

  5. Copy into Sandbox

    When done, the server downloads the GLB and its thumbnail into Sandbox’s storage. You only ever handle Sandbox URLs, never the provider’s.

  6. Add to project

    “Add to project” measures the model in the browser (scaled to 1.8 units tall, set on the ground, clip names read) and creates a kind: 'model' asset referenced by URL. If it is already in the project, the button becomes “Select”.

Options

A description of up to 600 characters. Be concrete about shape, style and materials: “a low poly gardener robot holding a watering can”.

Quality'low' | 'high'Default 'low'
Fast (about 20,000 polygons) or HD (about 100,000 polygons, detailed textures), +30.
PBR texturebooleanDefault true
Without it the provider returns a bare mesh.
RigbooleanDefault false
Auto-rig with animations, for characters, +40. The rigged GLB carries a walk clip the runtime can play.
Provider'auto' | 'meshy' | 'tripo'Default 'auto'
Auto takes the first available provider able to do the request (Meshy, then Tripo). An unavailable provider is dimmed.

Tracking your generations

The job list shows the status (queued, running, ready, failed), progress, provider, file size, an anim badge when the GLB has clips, and a GLB download link. The 20 most recent ids are kept in this browser; with a wallet connected, the server’s list is merged in.

LimitValue
Prompt600 characters
Reference imagePNG, JPEG or WebP, 8 MB
Output model40 MB at most, larger fails the job
Quota5 generations per UTC day per client by default
Assets per project96

Payment errors

If the check fails, no generation starts and the panel shows why:

CodeMeaning
payment_requiredNo valid transaction was provided.
payment_pendingTransaction not confirmed yet: try again shortly.
payment_failedThe transaction failed on chain.
payment_mismatchWrong amount, token or recipient.
payment_usedThis transaction already paid for a generation.
token_not_liveThe token is not live yet.
Rejecting the transaction in the wallet simply cancels the request: nothing is charged.
Provider keys stay on the server; the studio only learns which ones are available. If none is, the panel shows “3D providers under maintenance”.

See also

Open the studio