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
$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.
| Item | Price | What you get |
|---|---|---|
| Text to 3D | 40 $SANDBOX | Draft quality, textured. |
| Image to 3D | 60 $SANDBOX | Draft quality, textured. |
| + HD quality | +30 $SANDBOX | Denser mesh and 2K textures. |
| + Rig and animations | +40 $SANDBOX | Auto-rig with walk, idle and run clips. |
Examples
| Generation | Breakdown | Total |
|---|---|---|
| Text, fast | 40 | 40 $SANDBOX |
| Text, HD | 40 + 30 | 70 $SANDBOX |
| Text, fast, rigged | 40 + 40 | 80 $SANDBOX |
| Image, fast | 60 | 60 $SANDBOX |
| Image, HD, rigged | 60 + 30 + 40 | 130 $SANDBOX |
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
Describe
Pick Text to 3D or Image to 3D, write the prompt, set quality, texture, rig and provider. The button shows the total price.
Pay
Your wallet is only asked at this point: one
$SANDBOXtransfer to the treasury, for the exact amount shown.On-chain check
The server waits for the transaction receipt (up to 45 s) and checks that it succeeded and contains a token
Transferfrom your address to the treasury of at least the price. One transaction pays for one generation only.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).
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.
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”.
Drop a PNG, JPEG or WebP image of up to 8 MB: plain background, subject centred. The text field becomes an optional texture hint.
Quality'low' | 'high'Default 'low'+30.PBR texturebooleanDefault trueRigbooleanDefault false+40. The rigged GLB carries a walk clip the runtime can play.Provider'auto' | 'meshy' | 'tripo'Default 'auto'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.
| Limit | Value |
|---|---|
| Prompt | 600 characters |
| Reference image | PNG, JPEG or WebP, 8 MB |
| Output model | 40 MB at most, larger fails the job |
| Quota | 5 generations per UTC day per client by default |
| Assets per project | 96 |
Payment errors
If the check fails, no generation starts and the panel shows why:
| Code | Meaning |
|---|---|
payment_required | No valid transaction was provided. |
payment_pending | Transaction not confirmed yet: try again shortly. |
payment_failed | The transaction failed on chain. |
payment_mismatch | Wrong amount, token or recipient. |
payment_used | This transaction already paid for a generation. |
token_not_live | The token is not live yet. |