Gaitkit Sign in Open the lab
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.
Prop · 2 moving parts

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
Open in the lab

ProPro download.

Also as , a .zip with the .obj and its .mtl.

Ready for any engine. The download carries the knobs you set here.

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.

JavaScript
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);

More in the docs; agents can fetch all of this through MCP.

Knobs

KnobTypeValuesDefaultWhat it does
bagchoiceheavy teardrop longheavyheavy (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).
colourchoicered black blue tanredVinyl colour of the bag (and the gloves): red, black, blue or tan leather.
mountchoiceceiling frameframeceiling (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).
glovestoggleon / offtrueA 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

FileWhat
punching-bag.glb ProGLB, default look · 248 KB
punching-bag.mjs ProES module, every knob live
punching-bag.obj ProOBJ, static; colours in the .mtl
punching-bag.mtlOBJ colours; keep it next to the .obj
punching-bag-params.jsonknob 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.