{
    "id": "forest-rabbit-ea2da0",
    "title": "Forest Rabbit",
    "class": "prop",
    "triangles": 594,
    "kit": "nature-forest-kit-f29d6a",
    "free": true,
    "plan": "free",
    "price_usd": 0,
    "price_note": "free: the /cdn links need no account and no key (an account adds the ready-to-serve zip)",
    "owned": true,
    "page": "https://polyfork.dev/asset/forest-rabbit-ea2da0",
    "thumbnail": "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/hero.png",
    "preview_glb": "https://polyfork.dev/cdn/forest-rabbit-ea2da0-preview.glb",
    "preview_triangles": 594,
    "preview_fidelity": 1,
    "has_rig": true,
    "remixable": true,
    "has_night": false,
    "has_ik": "legs",
    "size_m": {
        "x": 0.11,
        "y": 0.3,
        "z": 0.2
    },
    "download": {
        "glb": "https://polyfork.dev/cdn/forest-rabbit-ea2da0.glb",
        "mjs": "https://polyfork.dev/cdn/forest-rabbit-ea2da0.mjs",
        "auth": "none"
    },
    "export_formats": {
        "fbx": {
            "url": "https://polyfork.dev/dl/forest-rabbit-ea2da0.fbx",
            "for": "Unity, Unreal, Maya, 3ds Max"
        },
        "usdz": {
            "url": "https://polyfork.dev/dl/forest-rabbit-ea2da0.usdz",
            "for": "iOS AR Quick Look, Omniverse"
        },
        "obj": {
            "url": "https://polyfork.dev/dl/forest-rabbit-ea2da0.obj",
            "for": "universal, geometry only, no pivots"
        }
    },
    "export_note": "vertex colours become NAMED MATERIALS on export, named after this asset's own colour knobs; a plain format conversion would arrive white, because only three.js reads our COLOR_0. Built on first request (about a second), cached after. Needs an account even when the asset is free.",
    "materials": 1,
    "draw_calls": 17,
    "palette": [
        {
            "hex": "#863",
            "share": 0.451
        },
        {
            "hex": "#421",
            "share": 0.316
        },
        {
            "hex": "#ba7",
            "share": 0.108
        },
        {
            "hex": "#100",
            "share": 0.061
        },
        {
            "hex": "#edb",
            "share": 0.034
        },
        {
            "hex": "#713",
            "share": 0.03
        }
    ],
    "style": "low-poly, flat-shaded vertex colors, no textures, single shared material, so any set of these merges to one draw call; shares palette and scale with its kit",
    "origin": "ground level (minY = 0): the model sits on y=0 as-is",
    "rigged_parts": {
        "head": {
            "axis": "y",
            "range": [
                0,
                38
            ]
        },
        "ear-l": {
            "axis": "x",
            "range": [
                0,
                -62
            ]
        },
        "ear-r": {
            "axis": "x",
            "range": [
                0,
                -62
            ]
        },
        "leg-fl": {
            "axis": "x",
            "range": [
                0,
                -40
            ]
        },
        "leg-fr": {
            "axis": "x",
            "range": [
                0,
                -40
            ]
        },
        "leg-hl": {
            "axis": "x",
            "range": [
                0,
                -26
            ]
        },
        "leg-hr": {
            "axis": "x",
            "range": [
                0,
                -26
            ]
        }
    },
    "detachable_parts": [],
    "animation": "rigged parts are named groups with the pivot at the hinge/axle: obj.getObjectByName(part) then rotation[axis] (rotate, degrees) or position[axis] (slide, meters)",
    "gait": {
        "kind": "1-link",
        "step": 0.065,
        "duty": 0.65,
        "clearance": 0.005,
        "crouch": 0,
        "fitted": true,
        "legs": [
            {
                "id": "fl",
                "hip": "leg-fl",
                "knee": null,
                "axis": "x",
                "mount": null,
                "thigh": 0.087,
                "shin": 0,
                "foot": [
                    0.005,
                    -0.081,
                    0.033
                ],
                "stance": [
                    0.021,
                    0.003,
                    0.056
                ],
                "phase": 0.5
            },
            {
                "id": "fr",
                "hip": "leg-fr",
                "knee": null,
                "axis": "x",
                "mount": null,
                "thigh": 0.087,
                "shin": 0,
                "foot": [
                    -0.005,
                    -0.081,
                    0.033
                ],
                "stance": [
                    -0.021,
                    0.003,
                    0.056
                ],
                "phase": 0
            },
            {
                "id": "hl",
                "hip": "leg-hl",
                "knee": null,
                "axis": "x",
                "mount": null,
                "thigh": 0.084,
                "shin": 0,
                "foot": [
                    0.007,
                    -0.072,
                    0.044
                ],
                "stance": [
                    0.033,
                    0,
                    0.017
                ],
                "phase": 0
            },
            {
                "id": "hr",
                "hip": "leg-hr",
                "knee": null,
                "axis": "x",
                "mount": null,
                "thigh": 0.084,
                "shin": 0,
                "foot": [
                    -0.007,
                    -0.072,
                    0.044
                ],
                "stance": [
                    -0.033,
                    0,
                    0.017
                ],
                "phase": 0.5
            }
        ],
        "axes": {
            "hip": "x",
            "knee": "x",
            "mount": "y"
        },
        "units": "metres, radians, phase 0..1",
        "runtime": "https://polyfork.dev/cdn/walk.mjs",
        "how": "phase from distance travelled, not from time: foot planted for `duty` of each `step` metres, feet ordered by `phase`. three.js users import https://polyfork.dev/cdn/walk.mjs and call gait.poseAt(distance)"
    },
    "published_at": "2026-08-10 08:29:59",
    "renders": [
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/back.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/compare.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/detail.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/front.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/hero-crop.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/hero.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/left.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/low-back.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/low.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/pose-ear-l.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/pose-ear-r.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/pose-head.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/pose-leg-fl.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/pose-leg-fr.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/pose-leg-hl.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/pose-leg-hr.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/proofs.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/right.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/top.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/variant-colorway-chestnut-hare.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/variant-colorway-dusk-warren.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/variant-colorway-snow-hare.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/variant-earAngle--10.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/variant-earAngle-70.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/variant-facets-chunky.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/variant-facets-smooth.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/variant-pose-crouch.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/variant-pose-loaf.png",
        "https://polyfork.dev/files/forest-rabbit-ea2da0/renders/views.png"
    ],
    "license": "Use in commercial projects, no attribution. No redistribution of the files themselves. https://polyfork.dev/licensing",
    "access": {
        "as": "anonymous",
        "remix_bakes_per_hour": 40,
        "remix_bakes_left_this_hour": 40,
        "remix_note": "The budget is on generating NEW geometry. Variations anyone has already baked are served to everybody and never counted, so re-fetching a variant you or anyone else has made costs nothing.",
        "remix_bakes_per_month": 100,
        "remix_bakes_left_this_month": 100,
        "remix_allowance_resets": "2026-09-01",
        "remix_allowance_note": "A free account raises this to 300 a WEEK, and costs an email address.",
        "a_free_account_adds": {
            "how": "Authorization: Bearer <key>, created at https://polyfork.dev/account. Costs an email address.",
            "remix_bakes_per_hour": 100,
            "remix_bakes_per_week": 300,
            "downloads": "every FREE asset as .glb, .mjs and a ready-to-serve zip"
        },
        "pro_adds": {
            "url": "https://polyfork.dev/pricing",
            "usd_per_year": 99,
            "module_mjs": "the createAsset() program itself \u2014 knobs evaluated in YOUR engine at runtime, no bake, no round trip, no per-variant file",
            "structured_glb": "the authored GLB: named parts, detachables, real material names, real normals. Worth most on STATIC assets, whose public preview is one joined anonymous mesh \u2014 a rigged asset already previews with its pivot hierarchy so it can demo itself, and there the module is the upgrade, not the mesh",
            "cdn": "a per-account /c/<token>/ path you can hotlink from a shipped build; it keeps up when an asset is rebuilt, and the token is not the API key",
            "remix_bakes_per_hour": 900,
            "remix_bakes_per_week": "uncapped \u2014 a free account gets a weekly allowance, Pro does not"
        }
    }
}
