Donut Box
A cardboard bakery box of donuts at real size (half-dozen box 30 cm, dozen box 39 cm wide): ring donuts with a pale fried belt, icing that drips over the edge, rainbow sprinkles and chocolate drizzle, plus sugared jam donuts, on a waxed-paper liner; the lid with its tuck flap swings open on a back hinge (lid, rotate rig).
- Size
- 0.31 × 0.27 × 0.21 m
- Triangles
- 1,240
- Kit
- Food
Tune it
5 knobs: Donuts, Glaze, Lid open, Box, Seed.
Specs
- Size
- 0.31 × 0.27 × 0.21 m width × height × depth
- Triangles
- 1,240 of 6,000
- Draw calls
- 1 one vertex-colour material
- Moving parts
- 1 lid · rotate
- Knobs
- 5 3 presets
- Night lights
- 0 none
Passed the validator: real scale, rests on y = 0, front faces +Z, deterministic.
Use it
Code for the specimen as it is set up above; it follows your knobs.
import { createAsset } from 'https://gaitkit.com/cdn/donut-box.mjs';
const donutBox = createAsset();
scene.add(donutBox); // rests on y = 0, front faces +Z
// 'lid' pivots on its hinge: -115° to 0° around x
donutBox.getObjectByName('lid').rotation.x = THREE.MathUtils.degToRad(-115);import { useMemo } from 'react';
import { createAsset } from 'https://gaitkit.com/cdn/donut-box.mjs';
export function DonutBox() {
const model = useMemo(() => createAsset(), []);
return <primitive object={model} />;
}# Import donut-box.glb (download below). Moving parts are separate nodes, pivoted on their hinge.
$DonutBox/lid.rotation_degrees.x = -115// Import donut-box.glb with glTFast (com.unity.cloud.gltfast).
transform.Find("lid").localEulerAngles = new Vector3(/* x: */ -115, 0, 0);Use the gaitkit MCP server: get_variant({ "id": "donut-box", "want": "default look" })
then place the result.
# MCP endpoint
https://gaitkit.com/mcpKnobs
| Knob | Type | Values | Default | What it does |
|---|---|---|---|---|
count | range | 1 to 12, step 1 | 6 | How many donuts are left: 1 to 6 come in a half-dozen box (3 x 2), 7 to 12 in a dozen box (4 x 3); empty cells show the liner. |
glaze | choice | assorted sprinkles chocolate strawberry glazed | assorted | assorted (a seeded mix of icings, sprinkles, drizzle and a sugared jam donut), sprinkles (every donut iced with rainbow sprinkles), chocolate (all chocolate, some with white drizzle), strawberry (pink icing, some with sprinkles), glazed (classic shiny sugar-glazed rings). |
open | range | 0 to 1, step 0.05 | 0.8 | How far the lid is open as built: 0 closed, 1 thrown back past upright (115 degrees). The lid part also animates. |
box | choice | kraft white pink mint | kraft | Box colour: kraft (brown cardboard with a red label), white, pink or mint; the inside is plain card. |
seed | range | 1 to 60, step 1 | 5 | Reshuffles which donut gets which icing and topping, which cells are empty and how each donut sits. |
Presets: office dozen {"count":12,"glaze":"assorted","box":"kraft","open":0.85,"seed":5} · pink party box {"count":6,"glaze":"sprinkles","box":"pink","open":0.75,"seed":12} · last one left {"count":1,"glaze":"chocolate","box":"white","open":0.9,"seed":3}
Files
| File | What |
|---|---|
| donut-box.glb Pro | GLB, default look · 185 KB |
| donut-box.mjs Pro | ES module, every knob live |
| donut-box.obj Pro | OBJ, static; colours in the .mtl |
| donut-box.mtl | OBJ colours; keep it next to the .obj |
| donut-box-params.json | knob schema, presets, night zones |
Licence
Use it in games, apps, renders and client work, commercially and without credit. Do not resell it as an asset or train a 3D generator on it. The full licence.