Punching Bag
A hanging punching bag at real size: a 1.2 m heavy bag, a 0.95 m teardrop uppercut bag or a 1.6 m long kick bag in stitched vinyl with capped ends and a band, hung by four strap chains, a ring and a swivel from a ceiling mount (2.6 m, over a rubber floor mat) or from the boom of a free-standing steel stand with weight plates on its base. The bag is a part (bag, and bag_roll inside it) pivoting at the hook, so it sways gently in a loop; an optional pair of boxing gloves hangs from the stand or lies on the mat.
- Size
- 1.6 × 2.4 × 1.5 m
- Triangles
- 1,924
Tune it
4 knobs: Bag type, Colour, Mount, Gloves.
Specs
- Size
- 1.6 × 2.4 × 1.5 m width × height × depth
- Triangles
- 1,924 of 6,000
- Draw calls
- 1 one vertex-colour material
- Loop clip
- 4 m of travel per cycle
- Moving parts
- 2 bag · rotate, bag_roll · rotate
- Knobs
- 4 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/punching-bag.mjs';
const punchingBag = createAsset();
scene.add(punchingBag); // rests on y = 0, front faces +Z
// 'bag' pivots on its hinge: -4° to 4° around x
punchingBag.getObjectByName('bag').rotation.x = THREE.MathUtils.degToRad(-4);import { useMemo } from 'react';
import { createAsset } from 'https://gaitkit.com/cdn/punching-bag.mjs';
export function PunchingBag() {
const model = useMemo(() => createAsset(), []);
return <primitive object={model} />;
}# Import punching-bag.glb (download below). Moving parts are separate nodes, pivoted on their hinge.
$PunchingBag/bag.rotation_degrees.x = -4// Import punching-bag.glb with glTFast (com.unity.cloud.gltfast).
transform.Find("bag").localEulerAngles = new Vector3(/* x: */ -4, 0, 0);Use the gaitkit MCP server: get_variant({ "id": "punching-bag", "want": "default look" })
then place the result.
# MCP endpoint
https://gaitkit.com/mcpKnobs
| Knob | Type | Values | Default | What it does |
|---|---|---|---|---|
bag | choice | heavy teardrop long | heavy | heavy (1.2 m cylinder, 35 cm across), teardrop (0.95 m uppercut bag, wide at the bottom) or long (1.6 m slim kick bag for low kicks, muay thai style). |
colour | choice | red black blue tan | red | Vinyl colour of the bag (and the gloves): red, black, blue or tan leather. |
mount | choice | ceiling frame | frame | ceiling (a swivel plate on the ceiling at 2.6 m; the bag hangs over a rubber floor mat that rests on the ground) or frame (a free-standing steel heavy-bag stand with a boom, a diagonal brace and weight plates on the base). |
gloves | toggle | on / off | true | A pair of boxing gloves tied together: hung from a hook on the stand, or lying on the mat under a ceiling bag. |
Presets: home gym stand {"mount":"frame","bag":"heavy","colour":"black","gloves":true} · boxing club {"mount":"ceiling","bag":"teardrop","colour":"red","gloves":true} · muay thai corner {"mount":"ceiling","bag":"long","colour":"tan","gloves":false}
Files
| File | What |
|---|---|
| punching-bag.glb Pro | GLB, default look · 248 KB |
| punching-bag.mjs Pro | ES module, every knob live |
| punching-bag.obj Pro | OBJ, static; colours in the .mtl |
| punching-bag.mtl | OBJ colours; keep it next to the .obj |
| punching-bag-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.