{"data":{"id":115,"slug":"animated-mechanisms-kit","title":"Animated Mechanisms Kit","summary":"Seventy four moving mechanisms for prototypes: doors, gates, lifts, conveyors, gears, rotating fixtures, switches, hanging props and hazards, each with node animation clips.","description":"A deliberately generic low-poly kit of working mechanisms. Every model ships at least one glTF animation clip driving named nodes whose pivots sit on the real hinge, axle or slide axis, so a developer can drop a door, a lift, a conveyor or a trap into a prototype and see it move. Looping clips are named `idle`, `spin`, `bob` and `flicker`; one shot clips are `open`, `close`, `fire` and `trigger`. Eight doors and gates share a 3 m wall bay with `left` and `right` connectors so they tile into a continuous wall. Metres, +Y up, +Z forward, all models resting on y=0, eight shared materials. Node TRS animation only; there is no skinned rig, skeleton, collision or navigation data in these files.","url":"https://3dassets.dev/packs/animated-mechanisms-kit","coverUrl":"https://cdn.3dassets.dev/assets/8552/v1/poster.webp","assetCount":77,"aiGenerated":true,"aiGeneratedAssetCount":77,"aiModels":["Claude Opus 5 (1M context)"],"aiModelUnspecifiedCount":0,"featured":true,"licenseLabel":"CC0 1.0 Universal","totalBytes":5466360,"totalTriangles":121720,"starterScene":{"id":"8552","slug":"animated-mechanisms-kit-machine-room-0c84ab1d-starter-scene","title":"Working machine room (Animated Mechanisms Kit)","summary":"Composed example for Animated Mechanisms Kit.","description":"A plant floor on a 4.6 m grid: a bucket elevator, three conveyors and an inclined feed lift along the back, a gear train, crank and flywheel, piston assembly and stamping press through the middle, a scissor lift, gantry hoist, crusher and travelling saw, and a front row of controls with a gear pair and an extractor fan. Every model is at its rest pose.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-machine-room-0c84ab1d-starter-scene","cdnUrl":"https://cdn.3dassets.dev/assets/8552/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-machine-room-0c84ab1d-starter-scene","thumbnailUrl":"https://cdn.3dassets.dev/assets/8552/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8552/v1/poster.webp","blurhash":"U37_4p-n00R%R+D$s+%M00Ib.ARQRP_4XTD%","category":{"slug":"environments","title":"Environments & Scenes"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"kit","title":"Kit / Set"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":836744,"triangles":21846,"vertices":45985,"meshes":161,"materials":7,"textures":0,"animations":[],"boundingBox":{"min":[-9.100033637539708,-0.00009021346801252328,-9.674999904632568],"max":[9.159999990463255,5.360000133514404,11.72000002861023]},"sizeMeters":[18.26,5.36,21.395],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:07.590Z","updatedAt":"2026-09-06T13:57:08.391Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8552/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function WorkingMachineRoomAnimatedMechanismsKit(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/8552/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8552/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8552/v1/model.glb\" alt=\"Working machine room (Animated Mechanisms Kit)\" camera-controls auto-rotate></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8552/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8552/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},"assets":[{"id":"8465","slug":"animated-mechanisms-kit-hinged-door-46e17aef","title":"Hinged single door in a wall bay (Animated Mechanisms Kit)","summary":"Single steel leaf on three knuckle hinges inside a 3 m painted wall bay, with lever handles both sides, a glazed vision panel and an overhead closer arm.","description":"A 1.2 m by 2.4 m opening in a 3 m wide, 3.2 m tall wall bay. The leaf is a framed steel panel with iron stiles and rails, a glazed vision panel, an amber kick plate and lever handles on both faces. Overall size 3 x 3.2 x 0.36 m in metres, +Y up, +Z forward, resting on y=0. Node `leaf` pivots on the hinge line at x=-0.56, z=0. Clips: `open` swings the leaf 95 degrees over 1.2 s and holds, `close` returns it. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-hinged-door-46e17aef","cdnUrl":"https://cdn.3dassets.dev/assets/8465/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-hinged-door-46e17aef","thumbnailUrl":"https://cdn.3dassets.dev/assets/8465/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8465/v1/poster.webp","blurhash":"U9B;2t_400Rk-=.8V?8_4TRjx]RPnhxutRIU","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"modular","title":"Modular"},{"slug":"kit","title":"Kit / Set"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":30172,"triangles":508,"vertices":1524,"meshes":7,"materials":5,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.4999969705007488,0,-0.17000549139443194],"max":[1.4999969705007488,3.200000047683716,0.1900054872221068]},"sizeMeters":[3,3.2,0.36],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_materials_transmission","KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:46.420Z","updatedAt":"2026-09-06T13:56:47.200Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8465/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function HingedSingleDoorInAWallBayAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8465/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8465/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8465/v1/model.glb\" alt=\"Hinged single door in a wall bay (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8465/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8465/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8464","slug":"animated-mechanisms-kit-double-door-c75f24ee","title":"Double leaf door in a wall bay (Animated Mechanisms Kit)","summary":"Pair of framed steel leaves hung on opposite jambs of a 2 m opening, with vertical pull bars, glazed vision panels and a bolted transom beam above.","description":"A 2 m by 2.5 m opening in the shared 3 m wall bay. Each leaf is a framed steel panel with a vertical pull bar on two stand off bosses; the leaves swing outward in opposite directions. Overall size 3 x 3.2 x 0.45 m in metres, +Y up, +Z forward, resting on y=0. Nodes `leafL` and `leafR` pivot on their own jamb hinge lines at x=-0.96 and x=0.96. Clips: `open` swings both leaves 90 degrees apart over 1.3 s, `close` returns them. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-double-door-c75f24ee","cdnUrl":"https://cdn.3dassets.dev/assets/8464/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-double-door-c75f24ee","thumbnailUrl":"https://cdn.3dassets.dev/assets/8464/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8464/v1/poster.webp","blurhash":"U8A-6go{00t8_N%#DiDiDhs;t6M_xsxvRkIA","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"modular","title":"Modular"},{"slug":"kit","title":"Kit / Set"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":39880,"triangles":788,"vertices":2364,"meshes":9,"materials":4,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.4999969705007488,0,-0.21997741861681291],"max":[1.4999969705007488,3.200000047683716,0.22997694318992384]},"sizeMeters":[3,3.2,0.45],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_materials_transmission","KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:46.399Z","updatedAt":"2026-09-06T13:56:47.131Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8464/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function DoubleLeafDoorInAWallBayAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8464/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8464/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8464/v1/model.glb\" alt=\"Double leaf door in a wall bay (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8464/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8464/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8466","slug":"animated-mechanisms-kit-sliding-door-pair-b3457b8d","title":"Automatic sliding door pair (Animated Mechanisms Kit)","summary":"Two glazed leaves on an overhead roller track with a belt drive motor and a control box, sliding apart into the reveals of a 2.2 m opening.","description":"A 2.2 m by 2.5 m opening in the shared 3 m wall bay. Each leaf carries two track rollers and an amber grab strip; the header holds a ribbed drive motor and a control box with an emissive status lamp. Overall size 3 x 3.2 x 0.49 m in metres, +Y up, +Z forward, resting on y=0. Nodes `panelL` and `panelR` sit at their own leaf centres and translate along X only. Clips: `open` slides both leaves 1.06 m apart over 1.1 s, `close` returns them. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-sliding-door-pair-b3457b8d","cdnUrl":"https://cdn.3dassets.dev/assets/8466/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-sliding-door-pair-b3457b8d","thumbnailUrl":"https://cdn.3dassets.dev/assets/8466/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8466/v1/poster.webp","blurhash":"UCAm@]-=4TkC_N%MIAITIURjRjM{ofxuWXIU","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"modular","title":"Modular"},{"slug":"kit","title":"Kit / Set"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":50412,"triangles":1068,"vertices":3204,"meshes":12,"materials":6,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.4999969705007488,0,-0.16993256672185875],"max":[1.4999969705007488,3.200000047683716,0.3239454337574705]},"sizeMeters":[3,3.2,0.494],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_materials_transmission","KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:47.210Z","updatedAt":"2026-09-06T13:56:47.275Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8466/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function AutomaticSlidingDoorPairAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8466/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8466/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8466/v1/model.glb\" alt=\"Automatic sliding door pair (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8466/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8466/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8467","slug":"animated-mechanisms-kit-roller-shutter-e6349cd6","title":"Roller shutter door with barrel hood (Animated Mechanisms Kit)","summary":"Twenty one slat steel curtain running in side guides under a barrel hood, with an amber bottom rail and a wall control box. The curtain bunches into the hood as it lifts.","description":"A 2.4 m by 2.6 m opening in the shared 3 m wall bay. Twenty one horizontal slats hang between two channel guides beneath a lathed barrel hood with a drip flashing; the bottom rail is amber. Overall size 3.1 x 3.23 x 0.72 m in metres, +Y up, +Z forward, resting on y=0. Node `curtain` pivots at the barrel axis, x=0, y=2.6, z=0.22, so scaling it rolls the slats up into the hood. Clips: `open` compresses the curtain to a tenth of its height over 1.4 s, `close` unrolls it. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-roller-shutter-e6349cd6","cdnUrl":"https://cdn.3dassets.dev/assets/8467/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-roller-shutter-e6349cd6","thumbnailUrl":"https://cdn.3dassets.dev/assets/8467/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8467/v1/poster.webp","blurhash":"U8AKErDi00%#?w%gD$Dj4n-;-;ITw]ozXARQ","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"modular","title":"Modular"},{"slug":"kit","title":"Kit / Set"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":30320,"triangles":528,"vertices":1584,"meshes":5,"materials":5,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.4999984852503743,0,-0.1699951140978977],"max":[1.5999985090922322,3.2300000190734863,0.5499951242306873]},"sizeMeters":[3.1,3.23,0.72],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:47.483Z","updatedAt":"2026-09-06T13:56:48.330Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8467/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function RollerShutterDoorWithBarrelHoodAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8467/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8467/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8467/v1/model.glb\" alt=\"Roller shutter door with barrel hood (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8467/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8467/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8468","slug":"animated-mechanisms-kit-blast-door-iris-a77b00f9","title":"Iris blast door with six blades (Animated Mechanisms Kit)","summary":"Six overlapping steel blades hinged around a bezel ring close a 2.2 m circular portal cut through a wall bay. Each blade swings outward on its own pin.","description":"A 2.2 m diameter portal cut through a 3 m wall bay with a true round bore, a 0.48 m wide bezel ring on each face and six hinge bosses. Six tapered blades are stacked 38 mm apart in depth so they overlap without clashing, and sweep behind the bezel when open. Overall size 3 x 3.2 x 0.67 m in metres, +Y up, +Z forward, resting on y=0. Nodes `blade0` to `blade5` pivot on their own hinge pins on the bezel ring, every axis parallel to Z. Clips: `open` swings all six blades 62 degrees clear of the bore over 1.2 s, `close` returns them. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-blast-door-iris-a77b00f9","cdnUrl":"https://cdn.3dassets.dev/assets/8468/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-blast-door-iris-a77b00f9","thumbnailUrl":"https://cdn.3dassets.dev/assets/8468/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8468/v1/poster.webp","blurhash":"U5CQ6}~q00D,Th%$$vH;MbM{9vRPNG.7xt4T","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"modular","title":"Modular"},{"slug":"kit","title":"Kit / Set"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":67156,"triangles":1192,"vertices":3576,"meshes":11,"materials":5,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.4999969705007488,-0.00004242077588291135,-0.36992035165897974],"max":[1.4999969705007488,3.200000047683716,0.29995505260436917]},"sizeMeters":[3,3.2,0.67],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:48.002Z","updatedAt":"2026-09-06T13:56:48.781Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8468/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function IrisBlastDoorWithSixBladesAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8468/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8468/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8468/v1/model.glb\" alt=\"Iris blast door with six blades (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8468/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8468/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8469","slug":"animated-mechanisms-kit-airlock-door-bc9ccc39","title":"Pressure airlock door with locking dogs (Animated Mechanisms Kit)","summary":"Thick ribbed slab with a glazed porthole that rises up an exposed guide frame after four amber locking dogs rotate clear of the jambs.","description":"A 1.6 m by 2.3 m opening with a raised 0.12 m sill in a 3 m wall bay. The 0.22 m thick slab has three rib stiffeners and a bezelled porthole and runs in two channel guides that carry on 5 m up to a bolted head beam and lift cylinder. Overall size 3 x 5 x 0.56 m in metres, +Y up, +Z forward, resting on y=0. Node `slab` translates on Y inside the guides; nodes `dog0` to `dog3` pivot on their own jamb pins. Clips: `open` rotates the four dogs 88 degrees clear then lifts the slab 2.42 m over 2 s, `close` reverses it. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-airlock-door-bc9ccc39","cdnUrl":"https://cdn.3dassets.dev/assets/8469/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-airlock-door-bc9ccc39","thumbnailUrl":"https://cdn.3dassets.dev/assets/8469/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8469/v1/poster.webp","blurhash":"U39tfY~W00574TyD%g8^000K?v~q?vxZM|S$","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"modular","title":"Modular"},{"slug":"kit","title":"Kit / Set"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":42324,"triangles":804,"vertices":2412,"meshes":16,"materials":6,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.4999969705007488,0,-0.25008881303490027],"max":[1.4999969705007488,5,0.3100011604322914]},"sizeMeters":[3,5,0.56],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_materials_transmission","KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:48.147Z","updatedAt":"2026-09-06T13:56:48.190Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8469/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function PressureAirlockDoorWithLockingDogsAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8469/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8469/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8469/v1/model.glb\" alt=\"Pressure airlock door with locking dogs (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8469/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8469/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8470","slug":"animated-mechanisms-kit-saloon-swing-doors-6a84de72","title":"Saloon swing doors (Animated Mechanisms Kit)","summary":"Pair of half height slatted timber bat wings on spring pivots, hung clear of the floor and the head of a 1.6 m opening so they rock through a rest position.","description":"A 1.6 m by 2.35 m opening in the shared 3 m wall bay. Each bat wing is five timber slats between top and bottom rails inside a stile frame, with an amber push plate, hung on two barrel pivots so it swings both ways. Overall size 3 x 3.2 x 0.34 m in metres, +Y up, +Z forward, resting on y=0. Nodes `batL` and `batR` pivot on their jamb barrels at x=-0.75 and x=0.75. Clips: `idle` rocks both wings plus and minus 16 degrees over 2.4 s, `open` pushes both through 82 degrees. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-saloon-swing-doors-6a84de72","cdnUrl":"https://cdn.3dassets.dev/assets/8470/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-saloon-swing-doors-6a84de72","thumbnailUrl":"https://cdn.3dassets.dev/assets/8470/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8470/v1/poster.webp","blurhash":"U9CGlY-p00S%_N.8Di8_01W=?EVrRPt8tSM_","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"modular","title":"Modular"},{"slug":"kit","title":"Kit / Set"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":23012,"triangles":440,"vertices":1320,"meshes":7,"materials":5,"textures":0,"animations":["idle","open"],"boundingBox":{"min":[-1.4999969705007488,0,-0.17004669937560815],"max":[1.4999969705007488,3.200000047683716,0.17004669937560815]},"sizeMeters":[3,3.2,0.34],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:48.603Z","updatedAt":"2026-09-06T13:56:49.522Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8470/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function SaloonSwingDoorsAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8470/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8470/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8470/v1/model.glb\" alt=\"Saloon swing doors (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8470/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8470/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8471","slug":"animated-mechanisms-kit-garage-tilt-door-272c8904","title":"Up and over garage tilt door (Animated Mechanisms Kit)","summary":"Four panel steel door on top pivots with diagonal counterbalance arms, tilting up and back into the head of a 2.5 m garage opening.","description":"A 2.5 m by 2.4 m opening in the shared 3 m wall bay. The single leaf is four ribbed steel panels with an amber grab rail, carried on two side pivots and diagonal counterbalance arms under a track beam. Overall size 3 x 3.2 x 0.56 m in metres, +Y up, +Z forward, resting on y=0. Node `door` pivots on the top pivot axis at y=2.26, z=0.16, parallel to X. Clips: `open` tilts the leaf 84 degrees up and back over 1.5 s, `close` lowers it. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-garage-tilt-door-272c8904","cdnUrl":"https://cdn.3dassets.dev/assets/8471/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-garage-tilt-door-272c8904","thumbnailUrl":"https://cdn.3dassets.dev/assets/8471/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8471/v1/poster.webp","blurhash":"U9AAwDRO00g3_4bH9EaKNHtRROM_%M%gNGDi","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"modular","title":"Modular"},{"slug":"kit","title":"Kit / Set"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":21284,"triangles":332,"vertices":996,"meshes":6,"materials":4,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.4999969705007488,-0.00007486078530849483,-0.17002565280331988],"max":[1.4999969705007488,3.200000047683716,0.3900256367100658]},"sizeMeters":[3,3.2,0.56],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:48.541Z","updatedAt":"2026-09-06T13:56:49.546Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8471/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function UpAndOverGarageTiltDoorAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8471/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8471/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8471/v1/model.glb\" alt=\"Up and over garage tilt door (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8471/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8471/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8472","slug":"animated-mechanisms-kit-revolving-door-882e6880","title":"Four wing revolving door drum (Animated Mechanisms Kit)","summary":"Free standing revolving door: two curved glass enclosure quadrants between mullion posts, iron floor and head rings, a canopy and four glazed wings on a central shaft.","description":"A 2.62 m diameter drum, 2.52 m tall to the canopy. The enclosure is two curved glazed quadrants held by four mullion posts with iron sill and head rings; four framed glass wings turn on a central steel shaft. Overall size 2.62 x 2.52 x 2.6 m in metres, +Y up, +Z forward, resting on y=0. Node `drum` pivots on the central shaft axis at the origin. Clips: `spin` turns the wing assembly one full revolution over 8 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-revolving-door-882e6880","cdnUrl":"https://cdn.3dassets.dev/assets/8472/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-revolving-door-882e6880","thumbnailUrl":"https://cdn.3dassets.dev/assets/8472/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8472/v1/poster.webp","blurhash":"UADmEu.800D%?wM|IT%M00RP?btR-qxaIUIU","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":62696,"triangles":1192,"vertices":3576,"meshes":7,"materials":4,"textures":0,"animations":["spin"],"boundingBox":{"min":[-1.309999942779541,-0.0000829839523062148,-1.3004049238193953],"max":[1.309999942779541,2.520022850697735,1.3004049238193953]},"sizeMeters":[2.62,2.52,2.601],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_materials_transmission","KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:49.097Z","updatedAt":"2026-09-06T13:56:49.617Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8472/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function FourWingRevolvingDoorDrumAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8472/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8472/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8472/v1/model.glb\" alt=\"Four wing revolving door drum (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8472/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8472/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8474","slug":"animated-mechanisms-kit-portcullis-1571cb24","title":"Portcullis gate with winch drum (Animated Mechanisms Kit)","summary":"Seven bar spiked iron grille running in channel guides between two gate piers, lifted into a crenellated gatehouse chase by a timber winch drum on the front wall.","description":"A 2.6 m wide, 3.4 m clear gateway between two piers under a 3.2 m gatehouse block with a corbel band and five merlons. The grille is seven vertical bars with pointed feet tied by five horizontal bars and runs in a channel guide on each pier. Overall size 4.1 x 7.24 x 1.47 m in metres, +Y up, +Z forward, resting on y=0. Node `grille` translates on Y in its guides; node `winch` turns on the drum axis at y=5.42, z=0.62. Clips: `open` lifts the grille 3.1 m into the gatehouse over 2.2 s while the winch turns, `close` drops it. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-portcullis-1571cb24","cdnUrl":"https://cdn.3dassets.dev/assets/8474/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-portcullis-1571cb24","thumbnailUrl":"https://cdn.3dassets.dev/assets/8474/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8474/v1/poster.webp","blurhash":"U8Awh-?G009a_4tR9EIA8_NGx[xaWBj]oyfh","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"},{"slug":"modular","title":"Modular"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":27240,"triangles":454,"vertices":1362,"meshes":5,"materials":4,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-2.0499338264318645,-8.337191820528833e-7,-0.6597729784730669],"max":[2.0499338264318645,7.239999771118164,0.8099471973177388]},"sizeMeters":[4.1,7.24,1.47],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:48.738Z","updatedAt":"2026-09-06T13:56:48.834Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8474/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function PortcullisGateWithWinchDrumAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8474/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8474/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8474/v1/model.glb\" alt=\"Portcullis gate with winch drum (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8474/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8474/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8473","slug":"animated-mechanisms-kit-drawbridge-8de116d5","title":"Counterweighted timber drawbridge (Animated Mechanisms Kit)","summary":"Nine plank timber deck banded in iron, hinged on the front edge of a stone abutment between two winch towers. It stands upright at rest and lowers to a bridge.","description":"A 3.4 m wide abutment 1.36 m high with two 3.4 m towers carrying a timber winch drum. The 3.1 m deck is nine planks with iron edge bands and two mooring posts, hinged on a pin line at the abutment front edge. Overall size 3.72 x 5.1 x 1.81 m in metres, +Y up, +Z forward, resting on y=0. Node `deck` pivots on the hinge line at y=1.36, z=0.02, parallel to X; node `winch` turns on the drum axis at y=4.5. Clips: `open` lowers the deck 90 degrees to horizontal over 2.4 s while the winch pays out, `close` raises it. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-drawbridge-8de116d5","cdnUrl":"https://cdn.3dassets.dev/assets/8473/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-drawbridge-8de116d5","thumbnailUrl":"https://cdn.3dassets.dev/assets/8473/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8473/v1/poster.webp","blurhash":"U5AdG+%L009bn2%MkrIT00R:~p$dt9fPWAM_","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":26432,"triangles":432,"vertices":1296,"meshes":7,"materials":4,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.8599556936195265,1.907348634588857e-8,-1.6999377411587737],"max":[1.8599556936195265,5.099999904632568,0.10559709958210745]},"sizeMeters":[3.72,5.1,1.806],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:48.687Z","updatedAt":"2026-09-06T13:56:48.749Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8473/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function CounterweightedTimberDrawbridgeAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8473/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8473/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8473/v1/model.glb\" alt=\"Counterweighted timber drawbridge (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8473/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8473/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8475","slug":"animated-mechanisms-kit-gate-barrier-arm-9045e015","title":"Rising barrier arm with counterweight (Animated Mechanisms Kit)","summary":"Vehicle barrier: a 3.6 m banded boom with a drop skirt and a counterweight, pivoting from a painted pedestal with a reader panel and an emissive lamp.","description":"A 1.22 m pedestal on a bolted base plate with a reader panel and a lamp, carrying a 3.6 m boom at 0.98 m. The boom has nine amber bands, five hanging skirt bars and a counterweight block behind the pivot. Overall size 4.27 x 1.22 x 0.6 m in metres, +Y up, +Z forward, resting on y=0. Node `boom` pivots on the pedestal axis at x=0.24, y=0.98, parallel to Z. Clips: `open` raises the boom 86 degrees over 1.4 s, `close` lowers it. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-gate-barrier-arm-9045e015","cdnUrl":"https://cdn.3dassets.dev/assets/8475/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-gate-barrier-arm-9045e015","thumbnailUrl":"https://cdn.3dassets.dev/assets/8475/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8475/v1/poster.webp","blurhash":"U46*da_NNHnM?at7NGoL009Fs:XA01M{-oNH","category":{"slug":"roads-infrastructure","title":"Roads & Infrastructure"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"},{"slug":"modular","title":"Modular"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":20724,"triangles":304,"vertices":912,"meshes":7,"materials":5,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.43000001668930055,0,-0.29996430037837807],"max":[3.8399999046325686,1.2200000286102295,0.29996430037837807]},"sizeMeters":[4.27,1.22,0.6],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:49.813Z","updatedAt":"2026-09-06T13:56:50.844Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8475/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function RisingBarrierArmWithCounterweightAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8475/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8475/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8475/v1/model.glb\" alt=\"Rising barrier arm with counterweight (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8475/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8475/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8476","slug":"animated-mechanisms-kit-scissor-lift-68addbbf","title":"Self propelled scissor lift (Animated Mechanisms Kit)","summary":"Wheeled scissor lift with a hazard banded chassis, a crossed arm pair on a central pin, a lift ram and a railed deck with a kick plate. The deck rises 0.83 m.","description":"A 1.7 m by 2.5 m platform on a 1.5 m wheeled chassis with four solid tyres, a control box and an amber band. Two crossed steel arms cross on a pin at 0.95 m and a ram sits under the crossing. Overall size 1.77 x 2.54 x 2.5 m in metres, +Y up, +Z forward, resting on y=0. Nodes `armA` and `armB` pivot on the crossing pin at y=0.95 and also rise with it; node `deck` translates on Y. Clips: `open` raises the deck 0.83 m over 1.8 s while the arms open 28 degrees each, `close` lowers it. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-scissor-lift-68addbbf","cdnUrl":"https://cdn.3dassets.dev/assets/8476/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-scissor-lift-68addbbf","thumbnailUrl":"https://cdn.3dassets.dev/assets/8476/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8476/v1/poster.webp","blurhash":"U6A^RT%L00NaxuM|ay?G00WE_4WB9HWAxaRo","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":46320,"triangles":760,"vertices":2280,"meshes":11,"materials":6,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.920071164555635,0.000005788582923382801,-1.25],"max":[0.8500167851802118,2.5399439123077756,1.25]},"sizeMeters":[1.77,2.54,2.5],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:49.965Z","updatedAt":"2026-09-06T13:56:50.872Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8476/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function SelfPropelledScissorLiftAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8476/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8476/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8476/v1/model.glb\" alt=\"Self propelled scissor lift (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8476/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8476/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8477","slug":"animated-mechanisms-kit-cage-elevator-c1f122c9","title":"Open cage goods elevator (Animated Mechanisms Kit)","summary":"Braced four post shaft 4.7 m tall with a head sheave and drive motor, carrying a mesh sided cage with an amber threshold on a single rope.","description":"A 1.92 m square braced shaft with corner columns, three ring beams and a fixed access ladder. The cage is a 1.5 m mesh box with a roof yoke and an amber sill, hung from a grooved head sheave. Overall size 1.92 x 4.7 x 2.03 m in metres, +Y up, +Z forward, resting on y=0. Node `cage` translates on Y; node `rope` scales from the sheave axis at y=4.3; node `sheave` turns on its own axle. Clips: `open` lifts the cage 2 m over 2.4 s while the rope shortens and the sheave turns, `close` lowers it. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-cage-elevator-c1f122c9","cdnUrl":"https://cdn.3dassets.dev/assets/8477/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-cage-elevator-c1f122c9","thumbnailUrl":"https://cdn.3dassets.dev/assets/8477/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8477/v1/poster.webp","blurhash":"U88N%[oz00M{?wWYDhs..8kCDiae.8kCIAWA","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":88168,"triangles":1688,"vertices":5064,"meshes":8,"materials":4,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.9600237845341295,0,-0.9600237845341295],"max":[0.9600237845341295,4.699983071141434,1.0650901919077962]},"sizeMeters":[1.92,4.7,2.025],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:50.779Z","updatedAt":"2026-09-06T13:56:51.270Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8477/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function OpenCageGoodsElevatorAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8477/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8477/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8477/v1/model.glb\" alt=\"Open cage goods elevator (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8477/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8477/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8478","slug":"animated-mechanisms-kit-counterweight-platform-8d84da6e","title":"Counterweighted mast platform (Animated Mechanisms Kit)","summary":"Braced 4.8 m lattice mast with a head sheave, a railed working platform on one side and a stacked counterweight on the other, roped so they travel opposite each other.","description":"A 2.2 m base plate carries a five bay lattice mast with a head frame and a grooved sheave. The 1.5 m platform has three sided railing and an amber toe board; the counterweight is a 0.6 m block on a guide yoke. Overall size 2.2 x 5.08 x 2.32 m in metres, +Y up, +Z forward, resting on y=0. Node `platform` and node `weight` translate on Y in opposite directions; nodes `ropeP` and `ropeW` scale from the sheave axis at y=4.82. Clips: `idle` raises the platform 2.4 m and lowers the weight the same distance, then returns, over 6 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-counterweight-platform-8d84da6e","cdnUrl":"https://cdn.3dassets.dev/assets/8478/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-counterweight-platform-8d84da6e","thumbnailUrl":"https://cdn.3dassets.dev/assets/8478/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8478/v1/poster.webp","blurhash":"U35}z3xt00IVt-RkI9%2?wRj8_xu_Nxu9EIU","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":46680,"triangles":840,"vertices":2520,"meshes":9,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-1.1000735454281085,0,-0.8199807671952601],"max":[1.1000735454281085,5.080023786664886,1.5000198370311595]},"sizeMeters":[2.2,5.08,2.32],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:50.933Z","updatedAt":"2026-09-06T13:56:51.278Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8478/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function CounterweightedMastPlatformAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8478/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8478/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8478/v1/model.glb\" alt=\"Counterweighted mast platform (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8478/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8478/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8479","slug":"animated-mechanisms-kit-hydraulic-ram-platform-555ac6fa","title":"Telescopic hydraulic ram platform (Animated Mechanisms Kit)","summary":"Round 2.1 m deck on a three stage hydraulic ram rising from a bevelled base with a power pack and hoses. Each ram stage extends by a different amount.","description":"A 2 m diameter base casting with a side mounted power pack and two hoses carries a three stage ram. The 2.1 m deck has a ten post ring railing, a hoop top rail and an amber skirt band. Overall size 2.31 x 3.3 x 2.1 m in metres, +Y up, +Z forward, resting on y=0. Nodes `stage2`, `stage3` and `deck` each translate on Y by their own amount, so the ram telescopes. Clips: `open` extends the ram and lifts the deck 1.4 m over 2 s, `close` retracts it. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-hydraulic-ram-platform-555ac6fa","cdnUrl":"https://cdn.3dassets.dev/assets/8479/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-hydraulic-ram-platform-555ac6fa","thumbnailUrl":"https://cdn.3dassets.dev/assets/8479/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8479/v1/poster.webp","blurhash":"U39H2[-:009a~S-:9a9Z03M|_2%f05M#~Ux[","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":52952,"triangles":936,"vertices":2808,"meshes":9,"materials":5,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.059999942779541,0.0000012180581700216297,-1.049259869504514],"max":[1.25,3.2999608539431633,1.049259869504514]},"sizeMeters":[2.31,3.3,2.099],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:50.831Z","updatedAt":"2026-09-06T13:56:51.295Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8479/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function TelescopicHydraulicRamPlatformAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8479/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8479/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8479/v1/model.glb\" alt=\"Telescopic hydraulic ram platform (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8479/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8479/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8481","slug":"animated-mechanisms-kit-rope-hoist-bcc56c03","title":"Gantry rope hoist with hook block (Animated Mechanisms Kit)","summary":"Portal gantry on four splayed legs with a 3.6 m runway beam, a trolley with a rope drum and gear case, a drop pendant control and a hook block on a single fall of rope.","description":"Four splayed legs on base plates carry a 3.6 m runway beam with cover and soffit plates. A trolley with running wheels holds a grooved rope drum, gear case and ribbed motor; the hook block hangs on a single rope with a pendant control alongside. Overall size 4.52 x 3.81 x 2.32 m in metres, +Y up, +Z forward, resting on y=0. Node `hook` translates on Y, node `rope` scales from the trolley sheave at y=2.88, node `drum` turns on its own axle. Clips: `idle` lowers the hook 1.1 m and raises it again over 5 s while the drum turns both ways. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-rope-hoist-bcc56c03","cdnUrl":"https://cdn.3dassets.dev/assets/8481/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-rope-hoist-bcc56c03","thumbnailUrl":"https://cdn.3dassets.dev/assets/8481/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8481/v1/poster.webp","blurhash":"U36u3F_N00I9tlx]jFD$00Rj.8t7DioL.8%N","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":63508,"triangles":1208,"vertices":3624,"meshes":6,"materials":3,"textures":0,"animations":["idle"],"boundingBox":{"min":[-2.259999990463257,-1.2333354654225914e-7,-1.1599682558553133],"max":[2.259999990463257,3.810099451581628,1.1599682558553133]},"sizeMeters":[4.52,3.81,2.32],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:51.369Z","updatedAt":"2026-09-06T13:56:52.083Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8481/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function GantryRopeHoistWithHookBlockAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8481/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8481/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8481/v1/model.glb\" alt=\"Gantry rope hoist with hook block (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8481/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8481/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8480","slug":"animated-mechanisms-kit-cargo-lift-with-gate-3f0ce129","title":"Cargo lift platform with swing gate (Animated Mechanisms Kit)","summary":"Two post goods lift with a braced mast, a drive motor and a 2.2 m mesh sided platform closed by a swinging bar gate with an amber stile.","description":"A 2.6 m base plate carries two guide posts with diagonal bracing, a head beam and a ribbed motor. The platform is a steel deck with mesh side screens and an amber toe board; the front gate is a six bar frame hung on the left corner post. Overall size 2.74 x 3.7 x 2.14 m in metres, +Y up, +Z forward, resting on y=0. Node `gate` pivots on the left corner post at x=-1.06, z=0.78; node `platform` translates on Y. Clips: `open` swings the gate 92 degrees then lifts the platform 2.5 m over 2.8 s, `close` reverses it. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-cargo-lift-with-gate-3f0ce129","cdnUrl":"https://cdn.3dassets.dev/assets/8480/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-cargo-lift-with-gate-3f0ce129","thumbnailUrl":"https://cdn.3dassets.dev/assets/8480/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8480/v1/poster.webp","blurhash":"U87BG,I900%NIoaexuofITa#xuxu~qRP9Ft8","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":59952,"triangles":1096,"vertices":3288,"meshes":9,"materials":5,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.3000305352636072,0,-1.0700409275700997],"max":[1.4399939237175148,3.700000047683716,1.0700409275700997]},"sizeMeters":[2.74,3.7,2.14],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:51.184Z","updatedAt":"2026-09-06T13:56:52.078Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8480/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function CargoLiftPlatformWithSwingGateAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8480/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8480/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8480/v1/model.glb\" alt=\"Cargo lift platform with swing gate (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8480/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8480/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8482","slug":"animated-mechanisms-kit-conveyor-lift-cb1d81f7","title":"Inclined cleated conveyor lift (Animated Mechanisms Kit)","summary":"Five metre cleated belt on a 24 degree incline with a feed hopper at the tail and a discharge hood at the head, so the cleat loop resets out of sight.","description":"A 0.7 m wide cleated belt runs between two drums on a channel frame with side skirts, carried on four legs and two foot plates. A three sided feed hopper covers the tail and a hooded chute covers the head; a ribbed drive motor sits at the head drum. Overall size 1.43 x 3.27 x 5.41 m in metres, +Y up, +Z forward, resting on y=0. Node `cleats` translates one 0.5 m cleat pitch along the incline, so the loop repeats exactly. Clips: `idle` drives the cleats one pitch up the incline over 1.6 s and repeats seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-conveyor-lift-cb1d81f7","cdnUrl":"https://cdn.3dassets.dev/assets/8482/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-conveyor-lift-cb1d81f7","thumbnailUrl":"https://cdn.3dassets.dev/assets/8482/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8482/v1/poster.webp","blurhash":"U79HR*.9V?x]_4IURP%g00DiM{t84TRifln%","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":56904,"triangles":1096,"vertices":3288,"meshes":5,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.5999065574467642,-0.000012934398915920298,-2.727722406387329],"max":[0.8298773118834378,3.268916286365533,2.682722330093384]},"sizeMeters":[1.43,3.269,5.41],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:51.342Z","updatedAt":"2026-09-06T13:56:52.156Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8482/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function InclinedCleatedConveyorLiftAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8482/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8482/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8482/v1/model.glb\" alt=\"Inclined cleated conveyor lift (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8482/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8482/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8483","slug":"animated-mechanisms-kit-dumbwaiter-6cebb69d","title":"Wall dumbwaiter with travelling car (Animated Mechanisms Kit)","summary":"Service dumbwaiter shaft 2.74 m tall built as an open fronted casing with a framed hatch, a call panel with a lamp, and a small open car that travels the shaft on a rope.","description":"A 1.14 m painted casing of back, side and front panels leaving a 0.9 m by 1.01 m hatch opening framed in iron, with a base plinth, a head beam, a stainless call panel and an emissive lamp. The car is a 0.82 m open box with an amber front lip on a grooved head sheave. Overall size 1.18 x 2.74 x 0.99 m in metres, +Y up, +Z forward, resting on y=0. Node `car` translates on Y inside the shaft; node `rope` scales from the head sheave at y=2.38. Clips: `idle` sends the car up 0.78 m and back over 4.4 s while the sheave turns. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-dumbwaiter-6cebb69d","cdnUrl":"https://cdn.3dassets.dev/assets/8483/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-dumbwaiter-6cebb69d","thumbnailUrl":"https://cdn.3dassets.dev/assets/8483/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8483/v1/poster.webp","blurhash":"U39tls?Z0002?coyITRj00WG?wnfw{ROM|x^","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":29996,"triangles":488,"vertices":1464,"meshes":8,"materials":5,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.5900695842553798,0,-0.49007645535775385],"max":[0.5900695842553798,2.740000009536743,0.5000764458210107]},"sizeMeters":[1.18,2.74,0.99],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:52.415Z","updatedAt":"2026-09-06T13:56:53.412Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8483/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function WallDumbwaiterWithTravellingCarAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8483/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8483/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8483/v1/model.glb\" alt=\"Wall dumbwaiter with travelling car (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8483/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8483/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8484","slug":"animated-mechanisms-kit-bascule-deck-23f0a668","title":"Bascule bridge leaf with counterweight (Animated Mechanisms Kit)","summary":"Single leaf lifting bridge: a 4.2 m railed deck on trunnion bearings between two pier walls, with a concrete counterweight that swings down into the chase and an operator cabin.","description":"Two 1.5 m pier walls with capping plates leave a central chase and carry trunnion bearings at 1.5 m. The deck is a 4 m by 4.2 m steel span on a torsion box with post and rail parapets and amber end bands; the counterweight box swings into the chase behind the pivot. Overall size 4.66 x 2.48 x 6.5 m in metres, +Y up, +Z forward, resting on y=0. Nodes `leaf` and `counterweight` share the trunnion axis at y=1.5, z=-0.3, parallel to X. Clips: `open` raises the leaf to 71 degrees over 2.6 s while the counterweight drops into the chase, `close` lowers it. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-bascule-deck-23f0a668","cdnUrl":"https://cdn.3dassets.dev/assets/8484/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-bascule-deck-23f0a668","thumbnailUrl":"https://cdn.3dassets.dev/assets/8484/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8484/v1/poster.webp","blurhash":"U27d:;DN00tnR6?cM_Dj00XV~q%Lkq00-=?v","category":{"slug":"roads-infrastructure","title":"Roads & Infrastructure"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":27812,"triangles":468,"vertices":1404,"meshes":8,"materials":5,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-2.3299999237060547,0.00003483463738718218,-2.4499386403370624],"max":[2.3299999237060547,2.4799527479097767,4.050000381469727]},"sizeMeters":[4.66,2.48,6.5],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_materials_transmission","KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:52.526Z","updatedAt":"2026-09-06T13:56:53.546Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8484/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function BasculeBridgeLeafWithCounterweightAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8484/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8484/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8484/v1/model.glb\" alt=\"Bascule bridge leaf with counterweight (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8484/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8484/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8485","slug":"animated-mechanisms-kit-turntable-c8a0f81a","title":"Vehicle turntable in a pit ring (Animated Mechanisms Kit)","summary":"Five metre turntable: a sunken pit ring with eight rollers and a drive cabinet, carrying a ribbed steel deck marked with amber alignment bands.","description":"A 5.8 m pit ring with a recessed base plate, eight roller posts and a side drive cabinet with a lamp. The 4.88 m deck is a steel disc on sixteen radial ribs with a rim band and a cross of amber alignment strips. Overall size 5.85 x 0.72 x 5.77 m in metres, +Y up, +Z forward, resting on y=0. Node `deck` turns on the vertical centre axis at the origin. Clips: `spin` turns the deck one full revolution over 10 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-turntable-c8a0f81a","cdnUrl":"https://cdn.3dassets.dev/assets/8485/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-turntable-c8a0f81a","thumbnailUrl":"https://cdn.3dassets.dev/assets/8485/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8485/v1/poster.webp","blurhash":"UBA13Exu00Rjs;ayWUof00Rj~qofNFoLs:WB","category":{"slug":"roads-infrastructure","title":"Roads & Infrastructure"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":61880,"triangles":1236,"vertices":3708,"meshes":7,"materials":5,"textures":0,"animations":["spin"],"boundingBox":{"min":[-2.9000000953674316,-0.00002074768797399873,-2.8839980000946364],"max":[2.9500002856709537,0.7200207762982035,2.8839980000946364]},"sizeMeters":[5.85,0.72,5.768],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:52.758Z","updatedAt":"2026-09-06T13:56:53.715Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8485/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function VehicleTurntableInAPitRingAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8485/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8485/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8485/v1/model.glb\" alt=\"Vehicle turntable in a pit ring (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8485/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8485/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8486","slug":"animated-mechanisms-kit-belt-conveyor-straight-fefc9411","title":"Straight cleated belt conveyor (Animated Mechanisms Kit)","summary":"Four metre horizontal belt conveyor on braced legs with side skirts, a tail feed skirt, a hooded head chute, a drive motor and gearbox, and eight cleats that loop seamlessly.","description":"A 0.66 m wide belt runs between two drums at 0.85 m on a channel frame with painted skirt boards, carried on four legs with cross bracing and foot plates. The tail skirt and head hood each cover one cleat pitch so the repeating cleats reset out of sight. Overall size 1.53 x 1.46 x 5.05 m in metres, +Y up, +Z forward, resting on y=0. Node `cleats` translates one 0.55 m cleat pitch along Z, so the loop repeats exactly. Clips: `idle` drives the cleats one pitch along the belt over 1.4 s and repeats seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-belt-conveyor-straight-fefc9411","cdnUrl":"https://cdn.3dassets.dev/assets/8486/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-belt-conveyor-straight-fefc9411","thumbnailUrl":"https://cdn.3dassets.dev/assets/8486/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8486/v1/poster.webp","blurhash":"U78qmQ-naI%M.T9FM|tR008_X9R-Dh.7-:t5","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":66188,"triangles":1256,"vertices":3768,"meshes":7,"materials":6,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.720085078810199,-0.000022713841781374366,-2.4749999046325684],"max":[0.8100718502335564,1.4598664944878859,2.570013188142876]},"sizeMeters":[1.53,1.46,5.045],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:52.801Z","updatedAt":"2026-09-06T13:56:53.755Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8486/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function StraightCleatedBeltConveyorAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8486/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8486/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8486/v1/model.glb\" alt=\"Straight cleated belt conveyor (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8486/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8486/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8487","slug":"animated-mechanisms-kit-belt-conveyor-incline-8d63848f","title":"Swan neck incline belt conveyor (Animated Mechanisms Kit)","summary":"Two stage conveyor with a low horizontal feed boot and a 26 degree incline running to a hooded discharge, each stage with its own cleated belt and drums.","description":"A 1.5 m horizontal boot section at 0.55 m feeds a 3.4 m inclined section rising at 26 degrees to a hooded discharge. Both belts are 0.6 m wide on channel frames with painted skirts, on foot plates and splayed legs. Overall size 1.22 x 2.6 x 5.11 m in metres, +Y up, +Z forward, resting on y=0. Nodes `bootCleats` and `cleats` each translate one cleat pitch along their own belt run. Clips: `idle` drives both cleat sets one pitch over 1.5 s and repeats seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-belt-conveyor-incline-8d63848f","cdnUrl":"https://cdn.3dassets.dev/assets/8487/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-belt-conveyor-incline-8d63848f","thumbnailUrl":"https://cdn.3dassets.dev/assets/8487/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8487/v1/poster.webp","blurhash":"U68g{d?wNeRk-=RjM{t700I9ITRi00f#tQbE","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":67836,"triangles":1304,"vertices":3912,"meshes":6,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.46993824641588944,-0.00003856387410350326,-2.884999990463257],"max":[0.7499697698250599,2.600458299332944,2.220899820327759]},"sizeMeters":[1.22,2.6,5.106],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:52.774Z","updatedAt":"2026-09-06T13:56:53.800Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8487/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function SwanNeckInclineBeltConveyorAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8487/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8487/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8487/v1/model.glb\" alt=\"Swan neck incline belt conveyor (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8487/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8487/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8488","slug":"animated-mechanisms-kit-roller-conveyor-02fe3b56","title":"Gravity roller conveyor bed (Animated Mechanisms Kit)","summary":"Thirteen free running rollers between painted side channels with amber guide rails, on braced legs with foot plates and an end stop bar.","description":"A 3.6 m bed of thirteen 0.15 m rollers on stub axles at 0.8 m between two channel side frames with amber guide rails, carried on four braced legs with foot plates, plus a bearing block and an end stop. Overall size 1.29 x 1.04 x 3.71 m in metres, +Y up, +Z forward, resting on y=0. Nodes `roller0` to `roller12` each turn on their own axle at y=0.8, parallel to X, so every roller spins in place. Clips: `spin` turns all thirteen rollers one full revolution over 2.4 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-roller-conveyor-02fe3b56","cdnUrl":"https://cdn.3dassets.dev/assets/8488/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-roller-conveyor-02fe3b56","thumbnailUrl":"https://cdn.3dassets.dev/assets/8488/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8488/v1/poster.webp","blurhash":"U9ATfl?Z4ptR~nIUD*%M004pt8xt03g5-:W9","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":19812,"triangles":1284,"vertices":3852,"meshes":16,"materials":4,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.5300211857155179,0.000002129404902850851,-1.909999966621399],"max":[0.7600212047890043,1.0399978324481245,1.7999999523162842]},"sizeMeters":[1.29,1.04,3.71],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:53.892Z","updatedAt":"2026-09-06T13:56:54.600Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8488/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function GravityRollerConveyorBedAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8488/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8488/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8488/v1/model.glb\" alt=\"Gravity roller conveyor bed (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8488/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8488/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8489","slug":"animated-mechanisms-kit-chain-conveyor-b4435e0f","title":"Twin chain flight conveyor (Animated Mechanisms Kit)","summary":"Two chain strands on four toothed sprockets carry amber flight bars along a 3.2 m braced frame with a drive motor at the head.","description":"A 3.2 m frame at 0.9 m with four twelve tooth sprockets on two through shafts, top and bottom chain strands and seven flight bars spanning between them. Painted skirt rails, braced legs and foot plates, with a ribbed drive motor on the head shaft. Overall size 1.79 x 1.18 x 3.7 m in metres, +Y up, +Z forward, resting on y=0. Nodes `sprocketA` and `sprocketB` turn on their own shaft axes; node `flights` translates one 0.53 m chain pitch. Clips: `idle` steps the flights one pitch while the sprockets turn, over 1.6 s, and repeats seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-chain-conveyor-b4435e0f","cdnUrl":"https://cdn.3dassets.dev/assets/8489/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-chain-conveyor-b4435e0f","thumbnailUrl":"https://cdn.3dassets.dev/assets/8489/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8489/v1/poster.webp","blurhash":"U797kb%g00xu~qIoIB-:00DjxsxZ01oexXRj","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":70608,"triangles":1872,"vertices":5616,"meshes":6,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.6999252386720638,0.00007789608003694326,-1.850000023841858],"max":[1.090000033378601,1.1799099662718886,1.850000023841858]},"sizeMeters":[1.79,1.18,3.7],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:53.863Z","updatedAt":"2026-09-06T13:56:54.610Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8489/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function TwinChainFlightConveyorAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8489/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8489/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8489/v1/model.glb\" alt=\"Twin chain flight conveyor (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8489/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8489/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8490","slug":"animated-mechanisms-kit-bucket-elevator-7ece7edd","title":"Bucket elevator with inspection window (Animated Mechanisms Kit)","summary":"Four and a half metre elevator casing with a boot, an inlet chute, a hooded head with drive motor and a tall window through which nine buckets can be seen climbing the belt.","description":"A 0.86 m by 0.62 m painted casing on a boot base with an inclined inlet chute, a bolted head plate, a hooded discharge and a fixed ladder. Nine buckets on a rubber belt strand are visible through a framed window; the head pulley turns on its own shaft. Overall size 1.52 x 5.36 x 1.45 m in metres, +Y up, +Z forward, resting on y=0. Node `buckets` translates one 0.55 m bucket pitch on Y; node `headPulley` turns on the head shaft at y=4.7. Clips: `idle` lifts the bucket strand one pitch over 1.6 s while the head pulley turns, and repeats seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-bucket-elevator-7ece7edd","cdnUrl":"https://cdn.3dassets.dev/assets/8490/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-bucket-elevator-7ece7edd","thumbnailUrl":"https://cdn.3dassets.dev/assets/8490/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8490/v1/poster.webp","blurhash":"U57_K9x^00DO_NtR8_ITD%j]%gWA%gozITRO","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":72080,"triangles":1392,"vertices":4176,"meshes":6,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.5799310441005072,0,-0.5149423412610975],"max":[0.9401084594818497,5.360000133514404,0.9338838693159132]},"sizeMeters":[1.52,5.36,1.449],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:53.690Z","updatedAt":"2026-09-06T13:56:54.632Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8490/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function BucketElevatorWithInspectionWindowAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8490/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8490/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8490/v1/model.glb\" alt=\"Bucket elevator with inspection window (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8490/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8490/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8491","slug":"animated-mechanisms-kit-piston-assembly-edbd6dcf","title":"Crank, rod and piston assembly (Animated Mechanisms Kit)","summary":"Open crank and slider mechanism on a painted bedplate: a bearing housing, a crank with a web and pin, a connecting rod, a crosshead on guide bars and a lathed cylinder block.","description":"A 1.1 m by 2.6 m bedplate carries a crank bearing housing, a 0.24 m throw crank, a connecting rod, a crosshead running between two guide bars and a cylinder block with a bolted end cover. All motion is in the ZY plane. Overall size 1.1 x 1.67 x 2.85 m in metres, +Y up, +Z forward, resting on y=0. Node `crank` turns on the crank axis at y=1.32, z=0.15; node `crosshead` slides along Z; node `rod` pivots on the crosshead pin and slides with it, so the big end tracks the crank pin exactly. Clips: `idle` turns the crank one full revolution over 2.4 s, driving the rod and crosshead through an exact crank and slider cycle. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-piston-assembly-edbd6dcf","cdnUrl":"https://cdn.3dassets.dev/assets/8491/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-piston-assembly-edbd6dcf","thumbnailUrl":"https://cdn.3dassets.dev/assets/8491/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8491/v1/poster.webp","blurhash":"U69@hnng00ESt8WAj;s:00%g?wVs9FM{ah%N","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":36380,"triangles":620,"vertices":1860,"meshes":7,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.5500674523709003,-0.00009021346801252328,-0.6000000238418579],"max":[0.5500674523709003,1.6700901705526683,2.25]},"sizeMeters":[1.1,1.67,2.85],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:54.978Z","updatedAt":"2026-09-06T13:56:55.945Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8491/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function CrankRodAndPistonAssemblyAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8491/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8491/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8491/v1/model.glb\" alt=\"Crank, rod and piston assembly (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8491/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8491/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8492","slug":"animated-mechanisms-kit-cam-and-follower-97a337d5","title":"Cam and roller follower (Animated Mechanisms Kit)","summary":"Shaft mounted cam disc with a rise on one flank lifting a guided roller follower against a spring collar, on a painted pedestal with two bearing blocks.","description":"A 1.2 m bedplate and painted pedestal carry a through shaft in two bearing blocks with a 0.29 m cam disc. The follower is a guided rod with a roller yoke and a top pad running through two guide brackets, with an amber spring collar below the lower guide. Overall size 1.2 x 3.1 x 0.84 m in metres, +Y up, +Z forward, resting on y=0. Node `cam` turns on the shaft axis at y=1.15; node `follower` translates on Y in its guides. Clips: `idle` turns the cam one revolution over 2.4 s and lifts the follower 0.09 m on the cam rise, looping seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-cam-and-follower-97a337d5","cdnUrl":"https://cdn.3dassets.dev/assets/8492/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-cam-and-follower-97a337d5","thumbnailUrl":"https://cdn.3dassets.dev/assets/8492/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8492/v1/poster.webp","blurhash":"U47e0Pxt00E2DiM_x[-=E1jE%Lo#.Tt8I9Mw","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":26852,"triangles":460,"vertices":1380,"meshes":5,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.600048055431828,0,-0.43996748576190225],"max":[0.600048055431828,3.0999999046325684,0.3999674941065525]},"sizeMeters":[1.2,3.1,0.84],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:54.946Z","updatedAt":"2026-09-06T13:56:55.003Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8492/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function CamAndRollerFollowerAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8492/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8492/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8492/v1/model.glb\" alt=\"Cam and roller follower (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8492/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8492/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8493","slug":"animated-mechanisms-kit-gear-pair-d4d2f423","title":"Meshing spur gear pair on a plate (Animated Mechanisms Kit)","summary":"Twenty tooth and twelve tooth spur gears meshing on a bolted back plate with bearing bosses, an amber guard ring around the large gear and a terminal box.","description":"A bolted 1.5 m back plate on a base channel carries two bearing bosses at 0.64 m centres. The 0.8 m spoked gear and the 0.48 m pinion have real trapezoidal teeth phased so a tooth of one sits in a gap of the other; an amber guard ring surrounds the large gear. Overall size 1.9 x 1.86 x 0.6 m in metres, +Y up, +Z forward, resting on y=0. Nodes `gearA` and `gearB` turn on their own bearing axes at x=0 and x=0.64, both parallel to Z. Clips: `spin` turns the large gear one revolution and the pinion five thirds of that in the opposite direction over 4 s, looping on a whole number of teeth. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-gear-pair-d4d2f423","cdnUrl":"https://cdn.3dassets.dev/assets/8493/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-gear-pair-d4d2f423","thumbnailUrl":"https://cdn.3dassets.dev/assets/8493/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8493/v1/poster.webp","blurhash":"U7BzOX-g00Iy~o%f9F9F01Iv_1wsOdNNZ}xS","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":58692,"triangles":1096,"vertices":3288,"meshes":7,"materials":5,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.75,0.00003248488247831194,-0.300044248073681],"max":[1.149999976158142,1.8600000143051147,0.300044248073681]},"sizeMeters":[1.9,1.86,0.6],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:55.602Z","updatedAt":"2026-09-06T13:56:56.198Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8493/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function MeshingSpurGearPairOnAPlateAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8493/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8493/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8493/v1/model.glb\" alt=\"Meshing spur gear pair on a plate (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8493/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8493/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8494","slug":"animated-mechanisms-kit-gear-train-four-e4d9a42e","title":"Four gear reduction train on a bench (Animated Mechanisms Kit)","summary":"Four spur gears on a bench top in an alternating sixteen and ten tooth train, each on its own boss and shaft, turning in alternating directions.","description":"A 2.34 m bench with a channel base, four legs and a plated top carries four gears on bosses at 0.52 m centres. Two sixteen tooth spoked gears alternate with two ten tooth pinions, phased so every mesh has a tooth in a gap, with a terminal box and an amber edge strip. Overall size 2.46 x 1.14 x 0.94 m in metres, +Y up, +Z forward, resting on y=0. Nodes `gear0` to `gear3` turn on their own vertical shaft axes on the bench top. Clips: `spin` turns the sixteen tooth gears one revolution and the pinions 1.6 revolutions the other way over 4 s, looping on a whole number of teeth. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-gear-train-four-e4d9a42e","cdnUrl":"https://cdn.3dassets.dev/assets/8494/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-gear-train-four-e4d9a42e","thumbnailUrl":"https://cdn.3dassets.dev/assets/8494/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8494/v1/poster.webp","blurhash":"U8BgGA.801WY~X_NR*IU00x]-:IT9GD$-;Ri","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":50880,"triangles":1556,"vertices":4668,"meshes":8,"materials":5,"textures":0,"animations":["spin"],"boundingBox":{"min":[-1.2899999618530273,0.000054020052277503616,-0.4699352835227868],"max":[1.1699999570846558,1.1399746481874349,0.4699352835227868]},"sizeMeters":[2.46,1.14,0.94],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:55.196Z","updatedAt":"2026-09-06T13:56:55.262Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8494/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function FourGearReductionTrainOnABenchAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8494/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8494/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8494/v1/model.glb\" alt=\"Four gear reduction train on a bench (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8494/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8494/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8495","slug":"animated-mechanisms-kit-crank-flywheel-68ff1c2a","title":"Crank and flywheel with connecting rod (Animated Mechanisms Kit)","summary":"Heavy six spoke flywheel on bearing pedestals driving a crank, connecting rod and crosshead along a painted bedplate with an amber hazard band at the end.","description":"A 1.9 m by 3 m bedplate and painted housing carry two bearing pedestals, a 1.2 m six spoke flywheel with a rim band and a crank web opposite it. The connecting rod runs to a crosshead sliding between two guide bars into a stuffing box. Overall size 1.9 x 2.04 x 3.02 m in metres, +Y up, +Z forward, resting on y=0. Nodes `flywheel` and `crank` turn on the same shaft axis at y=1.44, z=-0.3; node `crosshead` slides on Z; node `rod` pivots on the crosshead pin and slides with it. Clips: `spin` turns the flywheel one full revolution over 3 s, driving an exact crank and slider cycle. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-crank-flywheel-68ff1c2a","cdnUrl":"https://cdn.3dassets.dev/assets/8495/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-crank-flywheel-68ff1c2a","thumbnailUrl":"https://cdn.3dassets.dev/assets/8495/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8495/v1/poster.webp","blurhash":"U6AAm=%K00NG4T9Fo$xu00%L_NenyY%hadt7","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":43452,"triangles":768,"vertices":2304,"meshes":8,"materials":4,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.9500716807448104,-0.00008859884736378554,-0.8999999761581421],"max":[0.9500716807448104,2.039999964237213,2.120023394313487]},"sizeMeters":[1.9,2.04,3.02],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:55.276Z","updatedAt":"2026-09-06T13:56:56.287Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8495/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function CrankAndFlywheelWithConnectingRodAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8495/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8495/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8495/v1/model.glb\" alt=\"Crank and flywheel with connecting rod (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8495/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8495/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8496","slug":"animated-mechanisms-kit-bellows-cd26247e","title":"Forge bellows on a timber stand (Animated Mechanisms Kit)","summary":"Five fold bellows between timber boards on a four leg stand, with a pivoting hand lever and a steel tuyere nozzle. The folds compress as the lever is pulled down.","description":"A 1.1 m base plate and four timber legs carry the bottom board at 0.74 m. Five lathed folds rise to a top board with an amber wear strip, worked by a 1 m hand lever on a pivot post, with a steel nozzle leading out of the front. Overall size 1.24 x 1.79 x 1.27 m in metres, +Y up, +Z forward, resting on y=0. Node `bellows` scales on Y from the bottom board at y=0.83; node `lever` pivots on the post at x=0.62, y=1.74. Clips: `idle` compresses the bellows to 45 per cent and lets it rise again over 2.6 s while the lever swings. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-bellows-cd26247e","cdnUrl":"https://cdn.3dassets.dev/assets/8496/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-bellows-cd26247e","thumbnailUrl":"https://cdn.3dassets.dev/assets/8496/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8496/v1/poster.webp","blurhash":"U6A,arNG00%0~9WB58oM00jH?af,NMoexUod","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":31796,"triangles":564,"vertices":1692,"meshes":7,"materials":5,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.550000011920929,-0.000023807079476710624,-0.4136423711914326],"max":[0.6899542303372573,1.7900251841310857,0.8600000143051147]},"sizeMeters":[1.24,1.79,1.274],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:55.977Z","updatedAt":"2026-09-06T13:56:56.061Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8496/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function ForgeBellowsOnATimberStandAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8496/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8496/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8496/v1/model.glb\" alt=\"Forge bellows on a timber stand (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8496/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8496/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8498","slug":"animated-mechanisms-kit-stamping-press-db817629","title":"C frame stamping press (Animated Mechanisms Kit)","summary":"Open front power press with a spoked flywheel and motor on the crown, a guided ram with an amber striker plate, and a bolted bolster with a die block.","description":"A 1.5 m base plate carries a painted C frame 3.22 m tall with a crown plate, two ram guide bars, a bolster with a die block and a bolted throat. A five spoke flywheel and ribbed motor sit on the crown, with a control box on the column. Overall size 1.61 x 3.22 x 1.54 m in metres, +Y up, +Z forward, resting on y=0. Node `ram` translates on Y between the guide bars; node `flywheel` turns on the crown shaft at x=0.66. Clips: `trigger` drives the ram 0.62 m down onto the die and back over 1.2 s while the flywheel keeps turning. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-stamping-press-db817629","cdnUrl":"https://cdn.3dassets.dev/assets/8498/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-stamping-press-db817629","thumbnailUrl":"https://cdn.3dassets.dev/assets/8498/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8498/v1/poster.webp","blurhash":"U69Q:T-;009F?wt7I9RP00R*?vxZMwRPogx^","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":62968,"triangles":1180,"vertices":3540,"meshes":8,"materials":5,"textures":0,"animations":["trigger"],"boundingBox":{"min":[-0.7500427325775194,0,-0.7432055718953272],"max":[0.8600668060086334,3.2200000286102295,0.7999252299102702]},"sizeMeters":[1.61,3.22,1.543],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:56.013Z","updatedAt":"2026-09-06T13:56:56.117Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8498/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function CFrameStampingPressAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8498/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8498/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8498/v1/model.glb\" alt=\"C frame stamping press (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8498/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8498/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8497","slug":"animated-mechanisms-kit-ceiling-fan-807598e8","title":"Four blade ceiling fan with light (Animated Mechanisms Kit)","summary":"Ceiling fan on a 0.64 m downrod: a canopy, a lathed motor housing with a trim band, four pitched timber blades on iron irons, a glass light bowl and a pull cord.","description":"A 1.78 m assembly measured from the light bowl to the ceiling canopy. Four 0.78 m blades are set at 9 degrees of pitch on iron blade irons around a lathed motor housing, with a glass bowl light below and a pull cord. Overall size 2.02 x 1.78 x 2.02 m in metres, +Y up, +Z forward, resting on y=0. Node `rotor` turns on the motor axis at y=0.9, so the blades and irons sweep together. Clips: `spin` turns the rotor one full revolution over 1.6 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-ceiling-fan-807598e8","cdnUrl":"https://cdn.3dassets.dev/assets/8497/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-ceiling-fan-807598e8","thumbnailUrl":"https://cdn.3dassets.dev/assets/8497/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8497/v1/poster.webp","blurhash":"U88X2xt700Rj%Mj[M_WB00V[~pofIUj[xvs:","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":36148,"triangles":688,"vertices":2064,"meshes":5,"materials":4,"textures":0,"animations":["spin"],"boundingBox":{"min":[-1.0099999904632568,0,-1.0099999904632568],"max":[1.0099999904632568,1.7799999713897705,1.0099999904632568]},"sizeMeters":[2.02,1.78,2.02],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_materials_transmission","KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:56.044Z","updatedAt":"2026-09-06T13:56:57.074Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8497/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function FourBladeCeilingFanWithLightAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8497/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8497/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8497/v1/model.glb\" alt=\"Four blade ceiling fan with light (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8497/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8497/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8499","slug":"animated-mechanisms-kit-extractor-fan-duct-ac7f143c","title":"Extractor fan in a duct section (Animated Mechanisms Kit)","summary":"Axial extractor: a 0.88 m duct section on painted feet with bolted flanges, a wire finger guard, a seven blade impeller on a spider and a rear drive motor with a terminal box.","description":"A 0.9 m long duct of 0.88 m diameter on a bolted base with two feet and flanged ends. Inside, a seven blade impeller with a nose cone runs on a three arm spider driven by a ribbed motor behind, with a mesh guard over the outlet. Overall size 1.26 x 1.5 x 1.22 m in metres, +Y up, +Z forward, resting on y=0. Node `impeller` turns on the duct axis at y=0.98, parallel to Z. Clips: `spin` turns the impeller one full revolution over 1 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-extractor-fan-duct-ac7f143c","cdnUrl":"https://cdn.3dassets.dev/assets/8499/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-extractor-fan-duct-ac7f143c","thumbnailUrl":"https://cdn.3dassets.dev/assets/8499/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8499/v1/poster.webp","blurhash":"U59Q:W?v00IA?vogI9V@00V@?wMx8_a#%gM{","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":84904,"triangles":1664,"vertices":4992,"meshes":6,"materials":4,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.5500198370311594,0,-0.7200000286102295],"max":[0.7100416567153501,1.5,0.5]},"sizeMeters":[1.26,1.5,1.22],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:56.691Z","updatedAt":"2026-09-06T13:56:57.561Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8499/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function ExtractorFanInADuctSectionAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8499/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8499/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8499/v1/model.glb\" alt=\"Extractor fan in a duct section (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8499/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8499/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8500","slug":"animated-mechanisms-kit-windmill-sail-259e8b8b","title":"Windmill sail cross on a tower stub (Animated Mechanisms Kit)","summary":"Four lattice sails 4.8 m across on a windshaft, mounted on a tapered tower stub with a timber cap, a boarded door and a shaft bearing housing.","description":"A 2.9 m tapered tower with an iron curb, a timber cap and a boarded door carries a windshaft bearing at 3.3 m. Four 2.4 m timber whips carry seven lattice bars each with a back stay, giving a 4.8 m sail span. Overall size 4.46 x 5.53 x 2.08 m in metres, +Y up, +Z forward, resting on y=0. Node `sails` turns on the windshaft axis at y=3.3, z=1.0, parallel to Z. Clips: `spin` turns the sail cross one full revolution over 6 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-windmill-sail-259e8b8b","cdnUrl":"https://cdn.3dassets.dev/assets/8500/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-windmill-sail-259e8b8b","thumbnailUrl":"https://cdn.3dassets.dev/assets/8500/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8500/v1/poster.webp","blurhash":"U47KrC-o004;00Rn~q$|01Rj_2xa%#nhMcS%","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":39428,"triangles":736,"vertices":2208,"meshes":5,"materials":3,"textures":0,"animations":["spin"],"boundingBox":{"min":[-2.230000138282776,0,-1.0334574759241155],"max":[2.230000138282776,5.530000257492065,1.0500605018921365]},"sizeMeters":[4.46,5.53,2.084],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:56.742Z","updatedAt":"2026-09-06T13:56:57.731Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8500/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function WindmillSailCrossOnATowerStubAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8500/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8500/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8500/v1/model.glb\" alt=\"Windmill sail cross on a tower stub (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8500/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8500/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8501","slug":"animated-mechanisms-kit-water-wheel-bdd54694","title":"Undershot water wheel with launder (Animated Mechanisms Kit)","summary":"Three metre timber water wheel with fourteen paddles between two iron rims, running in two masonry bearing piers under a sloping timber launder.","description":"A 3.4 m base with two 1.5 m piers carries an iron axle at 1.7 m. Two rims on eight spokes each hold fourteen timber paddles, giving a 3.02 m wheel, fed by a sloping launder with an iron lip above. Overall size 3.4 x 3.2 x 3.76 m in metres, +Y up, +Z forward, resting on y=0. Node `wheel` turns on the axle axis at y=1.7, parallel to X. Clips: `spin` turns the wheel one full revolution over 8 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-water-wheel-bdd54694","cdnUrl":"https://cdn.3dassets.dev/assets/8501/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-water-wheel-bdd54694","thumbnailUrl":"https://cdn.3dassets.dev/assets/8501/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8501/v1/poster.webp","blurhash":"U3ATfuSx00$mQR9vXq==00D%~U?aL4^%-O59","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":50688,"triangles":972,"vertices":2916,"meshes":5,"materials":3,"textures":0,"animations":["spin"],"boundingBox":{"min":[-1.7000000476837158,-0.00005037657898132597,-2.2588348388671875],"max":[1.7000000476837158,3.2,1.5]},"sizeMeters":[3.4,3.2,3.759],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:57.849Z","updatedAt":"2026-09-06T13:56:58.416Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8501/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function UndershotWaterWheelWithLaunderAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8501/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8501/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8501/v1/model.glb\" alt=\"Undershot water wheel with launder (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8501/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8501/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8503","slug":"animated-mechanisms-kit-turbine-rotor-7c0735bf","title":"Shrouded axial turbine rotor (Animated Mechanisms Kit)","summary":"Twelve blade axial rotor with a nose cone inside a bolted 1.8 m shroud ring, mounted on a painted pedestal with a four arm stator spider behind.","description":"A 1.5 m base and painted pedestal carry a 1.56 m diameter shroud with flange rings at both ends and a bolted top. Twelve twisted blades run on a hub with a nose cone at 1.35 m, behind a four arm stator spider. Overall size 1.8 x 2.24 x 1 m in metres, +Y up, +Z forward, resting on y=0. Node `rotor` turns on the shroud axis at y=1.35, parallel to Z. Clips: `spin` turns the rotor one full revolution over 1.2 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-turbine-rotor-7c0735bf","cdnUrl":"https://cdn.3dassets.dev/assets/8503/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-turbine-rotor-7c0735bf","thumbnailUrl":"https://cdn.3dassets.dev/assets/8503/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8503/v1/poster.webp","blurhash":"U48}GQtS00jFtQRjRk%M00Ri_Nt7M{xut7IA","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":61188,"triangles":1188,"vertices":3564,"meshes":5,"materials":3,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.9000248512408409,0,-0.499975769364896],"max":[0.9000248512408409,2.2434380054473877,0.499975769364896]},"sizeMeters":[1.8,2.243,1],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:57.866Z","updatedAt":"2026-09-06T13:56:58.733Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8503/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function ShroudedAxialTurbineRotorAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8503/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8503/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8503/v1/model.glb\" alt=\"Shrouded axial turbine rotor (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8503/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8503/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8502","slug":"animated-mechanisms-kit-radar-dish-79d8352b","title":"Scanning radar dish on a yoke (Animated Mechanisms Kit)","summary":"Two metre parabolic dish with a feed horn on a strut, carried on a two arm yoke over a rotating turret with a braced base frame and a terminal box.","description":"A 1.4 m braced base frame carries a turret ring at 1.28 m. The yoke holds a 2.18 m lathed dish tilted 62 degrees back, with a feed horn on a strut and an amber trim bar across the face. Overall size 2.18 x 2.94 x 1.93 m in metres, +Y up, +Z forward, resting on y=0. Node `yoke` turns on the turret axis at y=1.28, carrying the dish, strut and feed horn with it. Clips: `spin` turns the yoke and dish one full revolution over 5 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-radar-dish-79d8352b","cdnUrl":"https://cdn.3dassets.dev/assets/8502/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-radar-dish-79d8352b","thumbnailUrl":"https://cdn.3dassets.dev/assets/8502/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8502/v1/poster.webp","blurhash":"U88XLUxu00D%-;ogIURj00M|_N%LIVWBxaof","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":59324,"triangles":1132,"vertices":3396,"meshes":6,"materials":5,"textures":0,"animations":["spin"],"boundingBox":{"min":[-1.090000033378601,-0.00002564235948265825,-0.699999988079071],"max":[1.090000033378601,2.935566104191862,1.232536762098763]},"sizeMeters":[2.18,2.936,1.933],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:57.739Z","updatedAt":"2026-09-06T13:56:58.603Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8502/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function ScanningRadarDishOnAYokeAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8502/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8502/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8502/v1/model.glb\" alt=\"Scanning radar dish on a yoke (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8502/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8502/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8504","slug":"animated-mechanisms-kit-security-camera-yoke-08694c1e","title":"Pan head security camera on a pole (Animated Mechanisms Kit)","summary":"Camera body with a sun shroud and lens on a two arm pan head, mounted on a 2.3 m tapered pole with a junction box and an emissive status lamp.","description":"A 0.5 m base plate and a 2.1 m tapered pole with a collar carry a pan head at 2.3 m. The camera is a 0.52 m body with a lens barrel, glass front, a lamp and a sun shroud over the top, on a two arm yoke. Overall size 0.5 x 2.76 x 0.74 m in metres, +Y up, +Z forward, resting on y=0. Node `head` turns on the pan axis at y=2.3, carrying the whole camera. Clips: `idle` pans the camera 75 degrees each way and back over 8 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-security-camera-yoke-08694c1e","cdnUrl":"https://cdn.3dassets.dev/assets/8504/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-security-camera-yoke-08694c1e","thumbnailUrl":"https://cdn.3dassets.dev/assets/8504/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8504/v1/poster.webp","blurhash":"U36uFlt800IS?vj?DiWCi^ofo~Rj_Nof4TRj","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":24312,"triangles":388,"vertices":1164,"meshes":7,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.2500259355495042,0,-0.2500259355495042],"max":[0.2500259355495042,2.7599829009493724,0.4899966456233649]},"sizeMeters":[0.5,2.76,0.74],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_materials_transmission","KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:57.905Z","updatedAt":"2026-09-06T13:56:58.772Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8504/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function PanHeadSecurityCameraOnAPoleAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8504/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8504/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8504/v1/model.glb\" alt=\"Pan head security camera on a pole (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8504/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8504/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8505","slug":"animated-mechanisms-kit-weather-vane-b493dc09","title":"Weather vane on a spire base (Animated Mechanisms Kit)","summary":"Iron weather vane with an arrow head and an amber tail fin above four cardinal arms with pointer plates, on a tapered spire post and a lathed base.","description":"A 0.4 m lathed base carries a 1.9 m tapered post, a cardinal cross of four 0.5 m arms with amber pointer plates at 1.44 m, and a spindle to the vane at 2 m. The vane is a 0.9 m shaft with a two plate arrow head and an amber tail fin. Overall size 1.23 x 2.3 x 1.22 m in metres, +Y up, +Z forward, resting on y=0. Node `vane` turns on the spindle axis at y=2.0. Clips: `idle` swings the vane 62 degrees each way and back over 5 s, as if hunting in a gust. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-weather-vane-b493dc09","cdnUrl":"https://cdn.3dassets.dev/assets/8505/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-weather-vane-b493dc09","thumbnailUrl":"https://cdn.3dassets.dev/assets/8505/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8505/v1/poster.webp","blurhash":"U38gvp_00002=9?APE0T_3%K4o9I9%R+$xt5","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":24328,"triangles":420,"vertices":1260,"meshes":5,"materials":3,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.6100000143051147,-0.000006715562300890765,-0.6100000143051147],"max":[0.6212435364723206,2.299991151618722,0.6100000143051147]},"sizeMeters":[1.231,2.3,1.22],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:57.784Z","updatedAt":"2026-09-06T13:56:58.817Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8505/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function WeatherVaneOnASpireBaseAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8505/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8505/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8505/v1/model.glb\" alt=\"Weather vane on a spire base (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8505/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8505/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8506","slug":"animated-mechanisms-kit-carousel-platform-bafa2e81","title":"Carousel platform with canopy (Animated Mechanisms Kit)","summary":"A 4.2 m turning platform on a fixed plinth with an amber rim band: eight poles carrying timber seat boards, a centre column and a conical canopy with a rim fascia.","description":"A 4.7 m fixed plinth with an amber rim band carries a 4.2 m turning deck. Eight 1.9 m poles stand at 1.75 m radius with timber seat boards, around a centre column that supports a 3.05 m tall conical canopy on a boarded ceiling. Overall size 5.15 x 3.68 x 4.67 m in metres, +Y up, +Z forward, resting on y=0. Node `deck` turns on the centre column axis at the origin, carrying poles, seats and canopy. Clips: `spin` turns the carousel one full revolution over 12 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-carousel-platform-bafa2e81","cdnUrl":"https://cdn.3dassets.dev/assets/8506/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-carousel-platform-bafa2e81","thumbnailUrl":"https://cdn.3dassets.dev/assets/8506/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8506/v1/poster.webp","blurhash":"UDB3~Q%L00M{9aW=xtV@00M{_4tR^$oJNHt6","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":64068,"triangles":1216,"vertices":3648,"meshes":7,"materials":6,"textures":0,"animations":["spin"],"boundingBox":{"min":[-2.3499999046325684,-0.00007842533752196179,-2.3327874659866192],"max":[2.8000107053201746,3.6799204148476976,2.3327874659866192]},"sizeMeters":[5.15,3.68,4.666],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:58.696Z","updatedAt":"2026-09-06T13:56:59.581Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8506/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function CarouselPlatformWithCanopyAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8506/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8506/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8506/v1/model.glb\" alt=\"Carousel platform with canopy (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8506/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8506/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8507","slug":"animated-mechanisms-kit-revolving-sign-3de5dff1","title":"Three sided revolving pole sign (Animated Mechanisms Kit)","summary":"Triangular pole sign 4.26 m tall with three panels carrying an original abstract diamond and bar mark, a cap disc, a tapered pole and a service box with a lamp.","description":"A 1.1 m lathed base and a 2.5 m tapered pole carry a rotating three sided sign head from 2.84 m to 4.14 m, each 0.98 m panel bearing an original amber diamond and bar mark, finished with a cap disc. Overall size 1.24 x 4.3 x 1.25 m in metres, +Y up, +Z forward, resting on y=0. Node `sign` turns on the pole axis at y=2.84. Clips: `spin` turns the sign head one full revolution over 9 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-revolving-sign-3de5dff1","cdnUrl":"https://cdn.3dassets.dev/assets/8507/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-revolving-sign-3de5dff1","thumbnailUrl":"https://cdn.3dassets.dev/assets/8507/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8507/v1/poster.webp","blurhash":"U67-sNxv00Di~qt74nM{s=jbS0bZ9IRk--xt","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":25816,"triangles":432,"vertices":1296,"meshes":6,"materials":5,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.6200339983881697,0,-0.6492949855796192],"max":[0.6200339983881697,4.300000157356262,0.6044329332531188]},"sizeMeters":[1.24,4.3,1.254],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:59.018Z","updatedAt":"2026-09-06T13:57:00.033Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8507/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function ThreeSidedRevolvingPoleSignAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8507/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8507/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8507/v1/model.glb\" alt=\"Three sided revolving pole sign (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8507/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8507/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8508","slug":"animated-mechanisms-kit-cooling-fan-grille-b9feb364","title":"Cooling fan in a grilled housing (Animated Mechanisms Kit)","summary":"Square 0.72 m cooling fan housing with mounting flanges, four rubber bushes, a spiral wire finger guard and a seven blade fan on a hub.","description":"A 0.72 m square painted housing with top and bottom mounting flanges and four bushed fixings holds a 0.62 m bore ring. Three guard rings and eight radial wires cover a seven blade fan on a domed hub, with an amber label plate. Overall size 0.78 x 0.84 x 0.44 m in metres, +Y up, +Z forward, resting on y=0. Node `fan` turns on the housing axis at y=0.42, parallel to Z. Clips: `spin` turns the fan one full revolution over 0.8 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-cooling-fan-grille-b9feb364","cdnUrl":"https://cdn.3dassets.dev/assets/8508/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-cooling-fan-grille-b9feb364","thumbnailUrl":"https://cdn.3dassets.dev/assets/8508/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8508/v1/poster.webp","blurhash":"U4AKBks800x^~Xxu9tIT00o#.8MwxwtSRhM^","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":66416,"triangles":1280,"vertices":3840,"meshes":6,"materials":4,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.39000639671041243,0,-0.2199930512349539],"max":[0.39000639671041243,0.8399999737739563,0.21999603574768958]},"sizeMeters":[0.78,0.84,0.44],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:59.520Z","updatedAt":"2026-09-06T13:57:00.342Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8508/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function CoolingFanInAGrilledHousingAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8508/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8508/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8508/v1/model.glb\" alt=\"Cooling fan in a grilled housing (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8508/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8508/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8512","slug":"animated-mechanisms-kit-ventilation-louvre-be3c492a","title":"Ventilation louvre with linked blades (Animated Mechanisms Kit)","summary":"Seven blade louvre panel in a painted frame with a bolted head flashing and an amber operating linkage down one side. The blades turn from closed to open together.","description":"A 1.2 m by 1.57 m painted frame with a bolted head flashing carries seven 0.17 m blades pitched at 24 degrees on their own pins, connected by an iron operating link with an amber handle block on the right hand stile. Overall size 1.32 x 1.57 x 0.32 m in metres, +Y up, +Z forward, resting on y=0. Nodes `slat0` to `slat6` pivot on their own blade pins, all axes parallel to X, spaced 0.17 m apart. Clips: `open` turns all seven blades 62 degrees to the open position over 1 s, `close` returns them. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-ventilation-louvre-be3c492a","cdnUrl":"https://cdn.3dassets.dev/assets/8512/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-ventilation-louvre-be3c492a","thumbnailUrl":"https://cdn.3dassets.dev/assets/8512/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8512/v1/poster.webp","blurhash":"U4BDsS-;009EnT-;x[9E00IU~q?b%1bwRjVq","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"},{"slug":"modular","title":"Modular"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":17500,"triangles":348,"vertices":1044,"meshes":11,"materials":4,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.6599904095500668,0,-0.10994553062899395],"max":[0.6599904095500668,1.5700000524520874,0.21000762307040333]},"sizeMeters":[1.32,1.57,0.32],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:56:59.929Z","updatedAt":"2026-09-06T13:57:00.966Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8512/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function VentilationLouvreWithLinkedBladesAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8512/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8512/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8512/v1/model.glb\" alt=\"Ventilation louvre with linked blades (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8512/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8512/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8514","slug":"animated-mechanisms-kit-wall-lever-8546c23f","title":"Floor mounted throw lever (Animated Mechanisms Kit)","summary":"Heavy throw lever on a bolted pedestal with a notched quadrant plate, a pivot boss and an amber grip with a domed cap. It throws forward and back through five notches.","description":"A 0.9 m bolted base plate and a 0.5 m painted pedestal carry a pivot boss at 0.64 m and a half round quadrant plate with five notches. The 1.24 m lever has a steel shank and an amber grip. Overall size 1.2 x 2 x 0.71 m in metres, +Y up, +Z forward, resting on y=0. Node `lever` pivots on the boss at y=0.64, z=0.14, parallel to Z. Clips: `trigger` throws the lever 46 degrees forward and back over 1.2 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-wall-lever-8546c23f","cdnUrl":"https://cdn.3dassets.dev/assets/8514/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-wall-lever-8546c23f","thumbnailUrl":"https://cdn.3dassets.dev/assets/8514/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8514/v1/poster.webp","blurhash":"U68z[V.A00H;v{M|XU-o00IA~qyEAL%K$c9I","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":28128,"triangles":496,"vertices":1488,"meshes":5,"materials":4,"textures":0,"animations":["trigger"],"boundingBox":{"min":[-0.6000336375397078,-0.000017075794829513047,-0.35002135368423365],"max":[0.6000336375397078,2.000000014305115,0.3599958311216466]},"sizeMeters":[1.2,2,0.71],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:00.057Z","updatedAt":"2026-09-06T13:57:01.075Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8514/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function FloorMountedThrowLeverAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8514/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8514/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8514/v1/model.glb\" alt=\"Floor mounted throw lever (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8514/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8514/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8515","slug":"animated-mechanisms-kit-wall-switch-f34022d1","title":"Rocker wall switch on a panel (Animated Mechanisms Kit)","summary":"Large rocker switch on a steel back plate, mounted on a 0.62 m painted wall panel with edge flashings, a bolted plate, a label strip and an emissive indicator.","description":"A 0.62 m by 1.4 m painted wall panel with top and bottom edge flashings carries a bolted steel switch plate at 0.96 m. The amber rocker is 0.14 m wide with a pointer nib, beside an emissive indicator lamp. Overall size 0.68 x 1.4 x 0.18 m in metres, +Y up, +Z forward, resting on y=0. Node `rocker` pivots on the switch pin at y=1.1, z=0.07, parallel to X. Clips: `trigger` flips the rocker 26 degrees down and holds, then returns, over 0.8 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-wall-switch-f34022d1","cdnUrl":"https://cdn.3dassets.dev/assets/8515/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-wall-switch-f34022d1","thumbnailUrl":"https://cdn.3dassets.dev/assets/8515/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8515/v1/poster.webp","blurhash":"U3Bza?M|00s+_2-;E28_00xu?vRP.Tx]H=Dh","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":13128,"triangles":176,"vertices":528,"meshes":6,"materials":5,"textures":0,"animations":["trigger"],"boundingBox":{"min":[-0.33994872311478797,0,-0.07502670241809435],"max":[0.33994872311478797,1.399999976158142,0.09999786370430484]},"sizeMeters":[0.68,1.4,0.175],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:00.135Z","updatedAt":"2026-09-06T13:57:00.203Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8515/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function RockerWallSwitchOnAPanelAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8515/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8515/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8515/v1/model.glb\" alt=\"Rocker wall switch on a panel (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8515/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8515/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8516","slug":"animated-mechanisms-kit-valve-wheel-727dc0bf","title":"Gate valve with handwheel (Animated Mechanisms Kit)","summary":"A 1.4 m flanged pipe spool on two painted stools with a valve body, bonnet, an amber tag plate and a five spoke handwheel with a capped hub.","description":"A 0.9 m base plate and two painted stools carry a 1.4 m pipe spool at 1 m with raised face flanges. The valve body and bonnet rise to a yoke at 1.6 m and a 0.88 m five spoke handwheel with an amber hub cap. Overall size 0.9 x 1.88 x 1.4 m in metres, +Y up, +Z forward, resting on y=0. Node `handwheel` turns on the stem axis at y=1.72. Clips: `trigger` turns the handwheel 540 degrees closed over 2 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-valve-wheel-727dc0bf","cdnUrl":"https://cdn.3dassets.dev/assets/8516/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-valve-wheel-727dc0bf","thumbnailUrl":"https://cdn.3dassets.dev/assets/8516/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8516/v1/poster.webp","blurhash":"U79HCMkD00oI~qof9ERjIUoJx[S5t8ofaeWU","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":40428,"triangles":740,"vertices":2220,"meshes":6,"materials":4,"textures":0,"animations":["trigger"],"boundingBox":{"min":[-0.45001921761216734,0,-0.7000045637010156],"max":[0.45001921761216734,1.8800027721468795,0.7000045637010156]},"sizeMeters":[0.9,1.88,1.4],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:00.266Z","updatedAt":"2026-09-06T13:57:01.218Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8516/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function GateValveWithHandwheelAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8516/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8516/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8516/v1/model.glb\" alt=\"Gate valve with handwheel (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8516/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8516/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8517","slug":"animated-mechanisms-kit-pressure-plate-fa236fd8","title":"Floor pressure plate in a frame (Animated Mechanisms Kit)","summary":"A 1.06 m tread plate with grip ribs and amber edge bands, sprung on four posts inside a recessed iron frame with an emissive trip lamp underneath.","description":"A 1.4 m iron kerb frame surrounds a painted sunken tray with four spring posts and a lit trip block. The tread plate has five grip ribs and amber edge bands and sits 0.12 m proud of the tray. Overall size 1.5 x 0.3 x 1.44 m in metres, +Y up, +Z forward, resting on y=0. Node `plate` translates straight down on Y inside its frame. Clips: `trigger` presses the plate 0.09 m down and lets it rise again over 0.9 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-pressure-plate-fa236fd8","cdnUrl":"https://cdn.3dassets.dev/assets/8517/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-pressure-plate-fa236fd8","thumbnailUrl":"https://cdn.3dassets.dev/assets/8517/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8517/v1/poster.webp","blurhash":"U58}3:^%00n$%hahROs-009b_4R+8^ovtmM~","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":19704,"triangles":308,"vertices":924,"meshes":8,"materials":5,"textures":0,"animations":["trigger"],"boundingBox":{"min":[-0.75,0.000010683074687684035,-0.699999988079071],"max":[0.75,0.29999680678213136,0.7349946676054919]},"sizeMeters":[1.5,0.3,1.435],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:00.234Z","updatedAt":"2026-09-06T13:57:00.286Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8517/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function FloorPressurePlateInAFrameAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8517/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8517/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8517/v1/model.glb\" alt=\"Floor pressure plate in a frame (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8517/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8517/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8518","slug":"animated-mechanisms-kit-button-pedestal-31508ccf","title":"Domed button on a pedestal (Animated Mechanisms Kit)","summary":"Floor pedestal 1.2 m tall with a flared cast base, a painted column with an amber label strip, an emissive collar ring and a big domed push button on a collar.","description":"A 0.84 m flared base and a tapered painted column carry a top ring at 1.02 m. An emissive collar surrounds a 0.3 m domed amber button on an iron seat that presses 0.05 m into the head. Overall size 0.84 x 1.27 x 0.83 m in metres, +Y up, +Z forward, resting on y=0. Node `button` translates straight down on Y into its collar. Clips: `trigger` presses the button 0.05 m and lets it spring back over 0.7 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-button-pedestal-31508ccf","cdnUrl":"https://cdn.3dassets.dev/assets/8518/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-button-pedestal-31508ccf","thumbnailUrl":"https://cdn.3dassets.dev/assets/8518/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8518/v1/poster.webp","blurhash":"U697qx-=004m%MWEIVt300M__4-;tRoIVsR.","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":38188,"triangles":694,"vertices":2082,"meshes":6,"materials":4,"textures":0,"animations":["trigger"],"boundingBox":{"min":[-0.4200155735434249,0,-0.41363720492469414],"max":[0.4200155735434249,1.2699999855987487,0.41363720492469414]},"sizeMeters":[0.84,1.27,0.827],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:00.941Z","updatedAt":"2026-09-06T13:57:01.052Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8518/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function DomedButtonOnAPedestalAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8518/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8518/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8518/v1/model.glb\" alt=\"Domed button on a pedestal (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8518/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8518/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8519","slug":"animated-mechanisms-kit-keypad-flip-cover-2e2b5522","title":"Access keypad with a flip cover (Animated Mechanisms Kit)","summary":"Twelve key access pad on a bolted iron sub plate with an emissive display, protected by an amber flip cover hinged along its top edge on a 0.7 m wall panel.","description":"A 0.7 m by 1.5 m painted wall panel with edge flashings carries a bolted iron sub plate at 0.86 m with a twelve key grid and an emissive display strip. The amber cover is hinged along its top edge at 1.4 m and has a lift lip. Overall size 0.76 x 1.5 x 0.2 m in metres, +Y up, +Z forward, resting on y=0. Node `cover` pivots on the hinge line at y=1.4, z=0.08, parallel to X. Clips: `open` lifts the cover 105 degrees clear of the keys over 0.8 s, `close` drops it. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-keypad-flip-cover-2e2b5522","cdnUrl":"https://cdn.3dassets.dev/assets/8519/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-keypad-flip-cover-2e2b5522","thumbnailUrl":"https://cdn.3dassets.dev/assets/8519/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8519/v1/poster.webp","blurhash":"UAAA%V?w0000n#ogo#WUITW9xuohbdtRjXMx","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":18556,"triangles":288,"vertices":864,"meshes":6,"materials":5,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.38000122074037906,0,-0.07498397778252511],"max":[0.38000122074037906,1.5,0.11999358902172573]},"sizeMeters":[0.76,1.5,0.195],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:01.634Z","updatedAt":"2026-09-06T13:57:02.508Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8519/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function AccessKeypadWithAFlipCoverAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8519/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8519/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8519/v1/model.glb\" alt=\"Access keypad with a flip cover (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8519/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8519/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8520","slug":"animated-mechanisms-kit-rotary-dial-f78b44cd","title":"Rotary selector dial on a post (Animated Mechanisms Kit)","summary":"Eleven position selector on a painted post: an iron scale plate with tick marks, a knurled dial with an amber pointer and a grip nib, and an emissive status lamp.","description":"A 0.9 m base plate and a 1 m painted post with a capping plate carry a 0.5 m iron scale plate at 0.5 m with eleven tick marks over a 240 degree arc. The 0.34 m dial carries an amber pointer and a grip nib. Overall size 0.9 x 1.21 x 0.55 m in metres, +Y up, +Z forward, resting on y=0. Node `dial` turns on the spindle axis at y=0.75, z=0.2, parallel to Z. Clips: `trigger` turns the dial 120 degrees clockwise through the scale and holds, over 1 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-rotary-dial-f78b44cd","cdnUrl":"https://cdn.3dassets.dev/assets/8520/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-rotary-dial-f78b44cd","thumbnailUrl":"https://cdn.3dassets.dev/assets/8520/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8520/v1/poster.webp","blurhash":"U49tii=|009a%Nt8M{M_00I;_N$y.TkDDhRh","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":23508,"triangles":384,"vertices":1152,"meshes":6,"materials":5,"textures":0,"animations":["trigger"],"boundingBox":{"min":[-0.44996034012332103,0,-0.2500169456548991],"max":[0.44996034012332103,1.2100000381469727,0.299999093741852]},"sizeMeters":[0.9,1.21,0.55],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:01.599Z","updatedAt":"2026-09-06T13:57:01.676Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8520/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function RotarySelectorDialOnAPostAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8520/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8520/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8520/v1/model.glb\" alt=\"Rotary selector dial on a post (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8520/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8520/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8521","slug":"animated-mechanisms-kit-breaker-handle-d15a9a4d","title":"Breaker cabinet with a throw handle (Animated Mechanisms Kit)","summary":"Painted breaker cabinet 1.91 m tall with a bolted inner plate, three busbar strips, three emissive lamps and a big amber tipped throw handle in a slotted guard.","description":"A 0.9 m base plate and a 1.7 m painted cabinet with a capping plate carry a bolted inner plate with three busbar strips and three status lamps. The 0.55 m handle throws in a slotted guard on the left of the plate. Overall size 0.9 x 1.91 x 0.51 m in metres, +Y up, +Z forward, resting on y=0. Node `handle` pivots at y=0.99, z=0.22, parallel to Z. Clips: `trigger` throws the handle 52 degrees down and holds, then returns, over 1 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-breaker-handle-d15a9a4d","cdnUrl":"https://cdn.3dassets.dev/assets/8521/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-breaker-handle-d15a9a4d","thumbnailUrl":"https://cdn.3dassets.dev/assets/8521/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8521/v1/poster.webp","blurhash":"U58#NZ.m008w.9tSITMw8wMw%L%ftSkCRhjE","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":20292,"triangles":324,"vertices":972,"meshes":6,"materials":5,"textures":0,"animations":["trigger"],"boundingBox":{"min":[-0.450030663237419,0,-0.20998778338734927],"max":[0.450030663237419,1.909999966621399,0.30000212043358254]},"sizeMeters":[0.9,1.91,0.51],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:01.844Z","updatedAt":"2026-09-06T13:57:02.763Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8521/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function BreakerCabinetWithAThrowHandleAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8521/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8521/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8521/v1/model.glb\" alt=\"Breaker cabinet with a throw handle (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8521/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8521/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8522","slug":"animated-mechanisms-kit-chain-pull-25e8c39c","title":"Ceiling pull cord switch (Animated Mechanisms Kit)","summary":"Ceiling switch with a canopy and a moulded body on a 1.48 m ball chain ending in an amber acorn pull. The chain and acorn drop when pulled and spring back.","description":"A ceiling canopy at 2.16 m and a lathed switch body carry a pivot barrel and an emissive indicator. Twenty two alternating chain links run down to an amber acorn pull whose tip sits at the model origin, so the whole drop reads at real length. Overall size 0.36 x 2.16 x 0.36 m in metres, +Y up, +Z forward, resting on y=0. Node `cord` translates on Y from the switch body at y=1.68, carrying the chain and the acorn. Clips: `trigger` pulls the acorn 0.16 m down and lets it spring back over 0.8 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-chain-pull-25e8c39c","cdnUrl":"https://cdn.3dassets.dev/assets/8522/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-chain-pull-25e8c39c","thumbnailUrl":"https://cdn.3dassets.dev/assets/8522/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8522/v1/poster.webp","blurhash":"U66u00t700IU?dogDhV??bof9GRj%Nj[ITWB","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":36288,"triangles":664,"vertices":1992,"meshes":5,"materials":5,"textures":0,"animations":["trigger"],"boundingBox":{"min":[-0.18001101007320972,5.245208734017126e-8,-0.18001101007320972],"max":[0.18001101007320972,2.1600000858306885,0.18001101007320972]},"sizeMeters":[0.36,2.16,0.36],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:01.802Z","updatedAt":"2026-09-06T13:57:02.807Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8522/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function CeilingPullCordSwitchAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8522/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8522/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8522/v1/model.glb\" alt=\"Ceiling pull cord switch (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8522/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8522/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8524","slug":"animated-mechanisms-kit-crank-handle-0c1ef0c5","title":"Wall crank handle on a gear box (Animated Mechanisms Kit)","summary":"Offset crank with an amber roll grip on a bolted gearbox boss, mounted on a 0.8 m painted wall panel with a label strip and an emissive lamp.","description":"A 0.8 m by 1.3 m painted wall panel with edge flashings carries a bolted 0.36 m gearbox at 0.72 m with a shaft boss at 0.9 m. The crank arm is 0.4 m long with an amber roll grip on the crank pin. Overall size 0.86 x 1.3 x 0.67 m in metres, +Y up, +Z forward, resting on y=0. Node `crank` turns on the shaft axis at y=0.9, z=0.33, parallel to Z. Clips: `spin` turns the crank one full revolution over 2 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-crank-handle-0c1ef0c5","cdnUrl":"https://cdn.3dassets.dev/assets/8524/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-crank-handle-0c1ef0c5","thumbnailUrl":"https://cdn.3dassets.dev/assets/8524/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8524/v1/poster.webp","blurhash":"UBA-0M9E00?w-;jsIUR*9Ft7%LRj.9a#I9s,","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":23744,"triangles":384,"vertices":1152,"meshes":7,"materials":5,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.43002714570013134,0,-0.08498183836974642],"max":[0.43002714570013134,1.2999999523162842,0.5799999850988389]},"sizeMeters":[0.86,1.3,0.665],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:02.585Z","updatedAt":"2026-09-06T13:57:03.500Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8524/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function WallCrankHandleOnAGearBoxAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8524/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8524/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8524/v1/model.glb\" alt=\"Wall crank handle on a gear box (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8524/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8524/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8528","slug":"animated-mechanisms-kit-flag-on-pole-1699865e","title":"Flag on a tapered pole (Animated Mechanisms Kit)","summary":"A 5.98 m tapered flag pole on a cast base with a domed finial, a halyard cleat and rope, flying a 2.4 m by 1.5 m flag frozen mid wave with a hoist sleeve and edge tapes.","description":"A 0.84 m cast base and a 5.6 m tapered pole with a domed finial and a cleat carry a solid waved cloth panel from 4.15 m. The flag is 20 mm thick with a sine wave along its length so it reads from both faces, with a hoist sleeve and two edge tapes. Overall size 2.9 x 5.98 x 0.83 m in metres, +Y up, +Z forward, resting on y=0. Node `flag` pivots on the mast axis at x=0, y=4.0, so the whole cloth swings about the pole. Clips: `idle` rocks the flag 11 degrees each way about the mast over 4 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-flag-on-pole-1699865e","cdnUrl":"https://cdn.3dassets.dev/assets/8528/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-flag-on-pole-1699865e","thumbnailUrl":"https://cdn.3dassets.dev/assets/8528/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8528/v1/poster.webp","blurhash":"UC8z#-W@01jC~UWC4;t5MyobtQR:4=xs?FIW","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":26004,"triangles":440,"vertices":1320,"meshes":6,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.42003844616872754,0,-0.4136295592879108],"max":[2.4800000190734863,5.980003615539024,0.4136295592879108]},"sizeMeters":[2.9,5.98,0.827],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:02.499Z","updatedAt":"2026-09-06T13:57:02.566Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8528/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function FlagOnATaperedPoleAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8528/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8528/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8528/v1/model.glb\" alt=\"Flag on a tapered pole (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8528/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8528/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8527","slug":"animated-mechanisms-kit-banner-on-rope-4ce3aebf","title":"Banner hung on a rope between posts (Animated Mechanisms Kit)","summary":"A 3 m cloth banner with amber head and foot battens and five rope ties, hung from a catenary rope between two timber posts with iron caps and cleats.","description":"Two 3.1 m timber posts on cast bases with domed caps and cleats carry a twelve segment catenary rope. The banner is a solid waved cloth panel 3 m by 1.3 m, 20 mm thick, with amber battens top and bottom and five ties. Overall size 4.88 x 3.4 x 0.66 m in metres, +Y up, +Z forward, resting on y=0. Node `banner` pivots on the rope line at y=2.94, parallel to X, so the cloth swings under the rope. Clips: `idle` rocks the banner 12 degrees each way about the rope over 3.6 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-banner-on-rope-4ce3aebf","cdnUrl":"https://cdn.3dassets.dev/assets/8527/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-banner-on-rope-4ce3aebf","thumbnailUrl":"https://cdn.3dassets.dev/assets/8527/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8527/v1/poster.webp","blurhash":"U8Amk;x[00of~p?ZD$9a00xZ.8IU00IX?v%2","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":38960,"triangles":720,"vertices":2160,"meshes":5,"materials":5,"textures":0,"animations":["idle"],"boundingBox":{"min":[-2.440000057220459,-0.000039666246246516934,-0.3315189139910728],"max":[2.440000057220459,3.4000397616136784,0.3315189139910728]},"sizeMeters":[4.88,3.4,0.663],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:02.738Z","updatedAt":"2026-09-06T13:57:03.578Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8527/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function BannerHungOnARopeBetweenPostsAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8527/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8527/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8527/v1/model.glb\" alt=\"Banner hung on a rope between posts (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8527/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8527/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8530","slug":"animated-mechanisms-kit-hanging-lamp-swing-5ed026de","title":"Swinging pendant lamp on a cord (Animated Mechanisms Kit)","summary":"Industrial pendant on a 2 m cord: a ceiling rose, a cord grip, a conical shade with an amber rim band and an emissive bulb, hanging 2.82 m below the ceiling.","description":"A lathed ceiling rose at 2.9 m carries a 2 m cord through a grip to a 0.96 m conical shade with an amber rim band and an emissive bulb inside. The shade rim sits at the model origin. Overall size 1 x 2.9 x 0.98 m in metres, +Y up, +Z forward, resting on y=0. Node `pendant` pivots on the cord anchor at y=2.82, so the cord, shade and bulb swing together. Clips: `idle` swings the pendant 9 degrees each way over 3.2 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-hanging-lamp-swing-5ed026de","cdnUrl":"https://cdn.3dassets.dev/assets/8530/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-hanging-lamp-swing-5ed026de","thumbnailUrl":"https://cdn.3dassets.dev/assets/8530/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8530/v1/poster.webp","blurhash":"U584i0xv00Di03of~UM|_0of9HM{NgozxBM_","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":30788,"triangles":552,"vertices":1656,"meshes":5,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.5,0.000020167994812636536,-0.4924314096499527],"max":[0.5,2.8999948376818625,0.4924314096499527]},"sizeMeters":[1,2.9,0.985],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:02.672Z","updatedAt":"2026-09-06T13:57:02.735Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8530/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function SwingingPendantLampOnACordAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8530/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8530/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8530/v1/model.glb\" alt=\"Swinging pendant lamp on a cord (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8530/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8530/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8531","slug":"animated-mechanisms-kit-chain-swing-7afa485e","title":"Chain swing on an A frame (Animated Mechanisms Kit)","summary":"Timber A frame 2.66 m tall on four foot plates with a top beam and two eye plates, carrying a plank seat on two 1.62 m link chains with amber seat brackets.","description":"Four splayed legs on iron foot plates carry a 2.6 m top beam at 2.5 m with two eye plates. Two eighteen link chains hang 1.62 m to a 0.62 m timber seat with a back batten and amber end brackets. Overall size 2.6 x 2.66 x 2.42 m in metres, +Y up, +Z forward, resting on y=0. Node `swing` pivots on the beam eye line at y=2.42, parallel to X, so the chains and seat swing together. Clips: `idle` swings the seat 21 degrees each way over 3 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-chain-swing-7afa485e","cdnUrl":"https://cdn.3dassets.dev/assets/8531/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-chain-swing-7afa485e","thumbnailUrl":"https://cdn.3dassets.dev/assets/8531/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8531/v1/poster.webp","blurhash":"U59Q%D%N00Mw%gtQ8_IU00t7_2IUt6xu.TRP","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":36160,"triangles":676,"vertices":2028,"meshes":5,"materials":5,"textures":0,"animations":["idle"],"boundingBox":{"min":[-1.2999850964890436,0,-1.2100018129381644],"max":[1.2999850964890436,2.6600000858306885,1.2100018129381644]},"sizeMeters":[2.6,2.66,2.42],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:03.205Z","updatedAt":"2026-09-06T13:57:03.247Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8531/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function ChainSwingOnAnAFrameAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8531/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8531/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8531/v1/model.glb\" alt=\"Chain swing on an A frame (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8531/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8531/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8532","slug":"animated-mechanisms-kit-bead-curtain-844a7e12","title":"Bead curtain in a doorway frame (Animated Mechanisms Kit)","summary":"Eleven bead strands of twenty six beads each hanging from a rail in a timber doorway frame, alternating amber and timber, with an amber head board.","description":"A 1.74 m timber doorway frame 2.34 m tall with an iron hanging rail and an amber head board. Eleven strands of twenty six lathed beads on cords hang 2.06 m to the ground, alternating amber and timber. Overall size 1.74 x 2.39 x 0.2 m in metres, +Y up, +Z forward, resting on y=0. Nodes `strand0` to `strand10` each pivot on the hanging rail at y=2.14, parallel to X. Clips: `idle` sways all eleven strands up to 9 degrees over 3.2 s, each strand a little out of phase with its neighbours. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-bead-curtain-844a7e12","cdnUrl":"https://cdn.3dassets.dev/assets/8532/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-bead-curtain-844a7e12","thumbnailUrl":"https://cdn.3dassets.dev/assets/8532/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8532/v1/poster.webp","blurhash":"U7EoPT=|009t~T?F9b4;0fNu-ms9oy%LWX9H","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":27528,"triangles":3668,"vertices":11004,"meshes":14,"materials":3,"textures":0,"animations":["idle"],"boundingBox":{"min":[-0.8700283503013617,0,-0.09993835315860929],"max":[0.8700283503013617,2.389958046723006,0.09993835315860929]},"sizeMeters":[1.74,2.39,0.2],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:04.033Z","updatedAt":"2026-09-06T13:57:05.025Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8532/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function BeadCurtainInADoorwayFrameAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8532/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8532/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8532/v1/model.glb\" alt=\"Bead curtain in a doorway frame (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8532/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8532/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8533","slug":"animated-mechanisms-kit-awning-unfurl-80c54258","title":"Shop awning on folding arms (Animated Mechanisms Kit)","summary":"A 3.1 m amber shop awning at 16 degrees on two folding arms and a roller bar, with a scalloped valance, over a glazed shop front with an iron surround.","description":"A 3.4 m shop front panel 3.14 m tall with a glazed window and an iron surround carries a roller bar at 2.7 m in two brackets. The awning is a 3.1 m by 1.9 m amber sheet on two arms with drop struts and a valance with five scallops. Overall size 3.5 x 3.14 x 2.32 m in metres, +Y up, +Z forward, resting on y=0. Node `awning` pivots on the roller bar at y=2.7, z=0.14, parallel to X. Clips: `close` folds the awning 74 degrees up against the wall over 1.6 s, `open` unfurls it again. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-awning-unfurl-80c54258","cdnUrl":"https://cdn.3dassets.dev/assets/8533/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-awning-unfurl-80c54258","thumbnailUrl":"https://cdn.3dassets.dev/assets/8533/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8533/v1/poster.webp","blurhash":"UECsmiZ}01XA~o%LD*IW00oz?FRk06D%-h%M","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":19236,"triangles":296,"vertices":888,"meshes":6,"materials":4,"textures":0,"animations":["close","open"],"boundingBox":{"min":[-1.75,0.00005489124473068152,-0.2900683519244831],"max":[1.75,3.1400833677594395,2.0288276047777476]},"sizeMeters":[3.5,3.14,2.319],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_materials_transmission","KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:04.108Z","updatedAt":"2026-09-06T13:57:05.079Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8533/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function ShopAwningOnFoldingArmsAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8533/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8533/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8533/v1/model.glb\" alt=\"Shop awning on folding arms (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8533/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8533/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8534","slug":"animated-mechanisms-kit-blind-roll-dd00d76f","title":"Roller blind in a window frame (Animated Mechanisms Kit)","summary":"A 1.7 m roller blind with an amber bottom bar and pull tab, hung on a roller in two brackets inside a glazed timber window frame with a side pull cord.","description":"A 2 m timber window frame 2.4 m tall with a glazed light, a transom and a mullion carries a roller at 2.15 m in two brackets, with a side pull cord. The blind is a 1.7 m by 1.9 m sheet with an amber bottom bar and pull tab. Overall size 2 x 2.4 x 0.28 m in metres, +Y up, +Z forward, resting on y=0. Node `blind` scales on Y from the roller axis at y=2.15, so the sheet rolls up into the roller. Clips: `open` rolls the blind up to a twentieth of its drop over 1.3 s, `close` lets it down again. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-blind-roll-dd00d76f","cdnUrl":"https://cdn.3dassets.dev/assets/8534/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-blind-roll-dd00d76f","thumbnailUrl":"https://cdn.3dassets.dev/assets/8534/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8534/v1/poster.webp","blurhash":"U9EyGA?H00IUIq-p%L9G00Io.Txv^%$~9aE5","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":16304,"triangles":232,"vertices":696,"meshes":6,"materials":6,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.000042765651394,0,-0.10005188544181377],"max":[1.000042765651394,2.4000000953674316,0.1800415067365816]},"sizeMeters":[2,2.4,0.28],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_materials_transmission","KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:04.462Z","updatedAt":"2026-09-06T13:57:05.274Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8534/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function RollerBlindInAWindowFrameAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8534/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8534/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8534/v1/model.glb\" alt=\"Roller blind in a window frame (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8534/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8534/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8536","slug":"animated-mechanisms-kit-tarpaulin-flap-5ab6df01","title":"Tarpaulin over a crate stack (Animated Mechanisms Kit)","summary":"Sheeted load: three banded crates on a timber pallet under a tarpaulin with amber eyelets and lashings, with a loose front flap and one loose side that lift in the wind.","description":"A 1.9 m timber pallet with four bearers carries three banded 1.6 m timber crates to 2.42 m. A painted tarpaulin covers the top, back and left side with amber eyelet patches and four lashings; the front flap and the right side are loose. Overall size 2.04 x 2.5 x 2.04 m in metres, +Y up, +Z forward, resting on y=0. Node `flapCorner` pivots on the tarpaulin front edge at y=2.44, z=0.62; node `flapSide` pivots on the right top edge at x=0.95. Clips: `idle` lifts the front flap 22 degrees and the loose side 14 degrees and lets them fall, over 2.8 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-tarpaulin-flap-5ab6df01","cdnUrl":"https://cdn.3dassets.dev/assets/8536/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-tarpaulin-flap-5ab6df01","thumbnailUrl":"https://cdn.3dassets.dev/assets/8536/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8536/v1/poster.webp","blurhash":"UIDl=$Wr00WAyZxaVXR+EQa}xCt6$dRkM|WC","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":22160,"triangles":352,"vertices":1056,"meshes":6,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-1.0197254419326782,0,-0.6889601086760352],"max":[1.0239172620862353,2.4997948783881685,1.3496553812855514]},"sizeMeters":[2.044,2.5,2.039],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:04.347Z","updatedAt":"2026-09-06T13:57:05.294Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8536/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function TarpaulinOverACrateStackAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8536/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8536/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8536/v1/model.glb\" alt=\"Tarpaulin over a crate stack (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8536/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8536/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8535","slug":"animated-mechanisms-kit-buoy-bob-d6664e61","title":"Channel marker buoy (Animated Mechanisms Kit)","summary":"A 2.54 m navigation buoy: a lathed amber float with a rubbing band, a four leg lantern cage with two hoops, an emissive lantern and a topmark, plus a mooring lug.","description":"A 1.32 m diameter lathed float carries an iron deck ring at 1.04 m and a four leg cage with two hoops to a lantern platform at 2 m. The emissive lantern sits under a conical topmark at 2.54 m, with a mooring lug on the float side. Overall size 1.36 x 2.54 x 1.36 m in metres, +Y up, +Z forward, resting on y=0. Node `buoy` is the whole hull at the waterline, y=0.7, so the clip lifts and heels the complete buoy. Clips: `bob` lifts the buoy 0.16 m and rolls it 7 degrees each way over 4 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-buoy-bob-d6664e61","cdnUrl":"https://cdn.3dassets.dev/assets/8535/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-buoy-bob-d6664e61","thumbnailUrl":"https://cdn.3dassets.dev/assets/8535/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8535/v1/poster.webp","blurhash":"U997IVt700IV9ha#%EbX4paz?Gfi~Sof9JV[","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":43484,"triangles":836,"vertices":2508,"meshes":3,"materials":3,"textures":0,"animations":["bob"],"boundingBox":{"min":[-0.680041477554383,-0.00005190928367171388,-0.680041477554383],"max":[0.680041477554383,2.5399999141693117,0.680041477554383]},"sizeMeters":[1.36,2.54,1.36],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:04.435Z","updatedAt":"2026-09-06T13:57:05.295Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8535/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function ChannelMarkerBuoyAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8535/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8535/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8535/v1/model.glb\" alt=\"Channel marker buoy (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8535/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8535/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8537","slug":"animated-mechanisms-kit-pendulum-weight-86a249ef","title":"Pendulum weight on a trestle (Animated Mechanisms Kit)","summary":"A 2.44 m pendulum with a lens shaped bob and an amber rim band, hung from a knife edge bearing on a four leg iron trestle over an amber scale bar.","description":"Four splayed legs on painted foot plates carry a bearing block at 3.1 m with a knife edge barrel. The 2.4 m rod hangs to a 0.72 m lens shaped bob with an amber rim band, swinging over a five mark amber scale bar at 0.4 m. Overall size 2.34 x 3.32 x 1.44 m in metres, +Y up, +Z forward, resting on y=0. Node `pendulum` pivots on the knife edge at y=3.1, parallel to X. Clips: `idle` swings the pendulum 26 degrees each way over 3.6 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-pendulum-weight-86a249ef","cdnUrl":"https://cdn.3dassets.dev/assets/8537/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-pendulum-weight-86a249ef","thumbnailUrl":"https://cdn.3dassets.dev/assets/8537/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8537/v1/poster.webp","blurhash":"U271s6?b000M00Rl~pZ}~qM{9Fx^_1.7Iv8|","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":31020,"triangles":532,"vertices":1596,"meshes":7,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-1.1699999570846558,0.000010684056971931033,-0.7200604002371035],"max":[1.1699999570846558,3.319999933242798,0.7200604002371035]},"sizeMeters":[2.34,3.32,1.44],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:04.780Z","updatedAt":"2026-09-06T13:57:05.777Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8537/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function PendulumWeightOnATrestleAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8537/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8537/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8537/v1/model.glb\" alt=\"Pendulum weight on a trestle (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8537/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8537/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8540","slug":"animated-mechanisms-kit-spike-trap-dd444bc2","title":"Floor spike trap in a kerb frame (Animated Mechanisms Kit)","summary":"Sixteen steel spikes standing 0.32 m proud of a painted bed inside an iron kerb frame with amber chevrons. The spikes shoot up another 0.5 m when triggered.","description":"A 1.8 m iron kerb frame with amber chevron bands surrounds a painted bed plate with a four by four grid of guide collars. Sixteen tapered spikes stand 0.32 m proud at rest so the trap reads even before it fires. Overall size 1.8 x 0.42 x 1.8 m in metres, +Y up, +Z forward, resting on y=0. Node `spikes` translates straight up on Y through its guide collars. Clips: `trigger` shoots the spikes 0.5 m up in 0.15 s, holds, then retracts over 1.2 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-spike-trap-dd444bc2","cdnUrl":"https://cdn.3dassets.dev/assets/8540/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-spike-trap-dd444bc2","thumbnailUrl":"https://cdn.3dassets.dev/assets/8540/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8540/v1/poster.webp","blurhash":"U49aHi^%00RjE1RlWAbY00E3.TNa~p$~jFnm","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":76440,"triangles":1516,"vertices":4548,"meshes":4,"materials":4,"textures":0,"animations":["trigger"],"boundingBox":{"min":[-0.8999999761581421,0.00001495622163703858,-0.8999999761581421],"max":[0.8999999761581421,0.4200248775985244,0.8999999761581421]},"sizeMeters":[1.8,0.42,1.8],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:05.030Z","updatedAt":"2026-09-06T13:57:06.042Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8540/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function FloorSpikeTrapInAKerbFrameAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8540/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8540/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8540/v1/model.glb\" alt=\"Floor spike trap in a kerb frame (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8540/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8540/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8541","slug":"animated-mechanisms-kit-swinging-blade-ac368320","title":"Swinging pendulum blade (Animated Mechanisms Kit)","summary":"A 2.1 m pendulum arm on a barrel bearing carrying a broad crescent blade with an amber collar, hung in an iron trestle on painted foot plates with amber floor chevrons.","description":"Four splayed iron legs on painted foot plates carry a bearing block at 3.4 m with a barrel bearing. The arm swings an extruded crescent blade 1.56 m across with a hub boss and an amber collar; amber chevrons mark the sweep on the floor. Overall size 2.6 x 3.64 x 1.9 m in metres, +Y up, +Z forward, resting on y=0. Node `blade` pivots on the bearing at y=3.4, parallel to X, so the arm and blade swing together. Clips: `idle` swings the blade 44 degrees each way over 3.2 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-swinging-blade-ac368320","cdnUrl":"https://cdn.3dassets.dev/assets/8541/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-swinging-blade-ac368320","thumbnailUrl":"https://cdn.3dassets.dev/assets/8541/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8541/v1/poster.webp","blurhash":"U27K*j_N000M00Dj~p$^?uxtIVE4o#-;%gD%","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":18016,"triangles":288,"vertices":864,"meshes":7,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-1.2999999523162842,0.000012818633192142326,-0.9500350614388178],"max":[1.2999999523162842,3.640000104904175,0.9500350614388178]},"sizeMeters":[2.6,3.64,1.9],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:04.935Z","updatedAt":"2026-09-06T13:57:05.082Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8541/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function SwingingPendulumBladeAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8541/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8541/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8541/v1/model.glb\" alt=\"Swinging pendulum blade (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8541/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8541/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8544","slug":"animated-mechanisms-kit-crusher-block-6377bc6c","title":"Falling crusher block in guides (Animated Mechanisms Kit)","summary":"A 1.78 m ribbed iron block running in two channel guides above a painted anvil bed with amber chevrons, under a head beam with a rope drum and a bolted cover.","description":"A 2.4 m base plate with a painted anvil bed and amber chevrons carries two 3.6 m channel guides to a bolted head beam with a housing and a rope drum. The crusher block is 1.72 m wide with a base shoe, four ribs and amber side stripes. Overall size 2.4 x 4.34 x 1.64 m in metres, +Y up, +Z forward, resting on y=0. Node `block` translates straight down on Y between its guides. Clips: `trigger` drops the block 1.94 m in 0.3 s, holds on the bed, then winds it back over 2 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-crusher-block-6377bc6c","cdnUrl":"https://cdn.3dassets.dev/assets/8544/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-crusher-block-6377bc6c","thumbnailUrl":"https://cdn.3dassets.dev/assets/8544/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8544/v1/poster.webp","blurhash":"U36[8b-;004np2RkI8xn_4of8_M{?bxvD%D$","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":23400,"triangles":420,"vertices":1260,"meshes":7,"materials":4,"textures":0,"animations":["trigger"],"boundingBox":{"min":[-1.1999194043146941,0,-0.8000048650800136],"max":[1.1999194043146941,4.340000152587891,0.8399862378974835]},"sizeMeters":[2.4,4.34,1.64],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:06.902Z","updatedAt":"2026-09-06T13:57:07.525Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8544/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function FallingCrusherBlockInGuidesAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8544/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8544/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8544/v1/model.glb\" alt=\"Falling crusher block in guides (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8544/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8544/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8545","slug":"animated-mechanisms-kit-flame-vent-5e3932f2","title":"Floor flame vent with pilot (Animated Mechanisms Kit)","summary":"A 1.24 m floor nozzle: a cast base, a painted burner tube with eight air ports and an amber crown, a supply pipe to a control box, and five emissive flame tongues on a pilot.","description":"A 1.24 m diameter cast base carries a painted burner tube to 0.42 m with eight air ports and an amber flared crown. A supply pipe runs to a control box with a lamp. Five lathed emissive tongues stand 0.52 m at rest as the pilot flame. Overall size 2.03 x 1 x 1.24 m in metres, +Y up, +Z forward, resting on y=0. Node `flame` scales from the burner mouth at y=0.48, so the tongues grow straight out of the crown. Clips: `fire` grows the flame to three and a half times its pilot height over 0.5 s, holds, then drops back, over 1.6 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-flame-vent-5e3932f2","cdnUrl":"https://cdn.3dassets.dev/assets/8545/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-flame-vent-5e3932f2","thumbnailUrl":"https://cdn.3dassets.dev/assets/8545/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8545/v1/poster.webp","blurhash":"UAC6S-~A0003=W-:9^0L029a~A~B5tIp=v?G","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":39720,"triangles":728,"vertices":2184,"meshes":5,"materials":4,"textures":0,"animations":["fire","flicker"],"boundingBox":{"min":[-0.6200000047683716,0.0000021333153946978545,-0.6200341985998916],"max":[1.409999966621399,0.9999999809265137,0.6200341985998916]},"sizeMeters":[2.03,1,1.24],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:06.996Z","updatedAt":"2026-09-06T13:57:07.555Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8545/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function FloorFlameVentWithPilotAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8545/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8545/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8545/v1/model.glb\" alt=\"Floor flame vent with pilot (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8545/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8545/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8546","slug":"animated-mechanisms-kit-saw-on-rail-614c9716","title":"Circular saw travelling on a rail (Animated Mechanisms Kit)","summary":"A 1.24 m toothed saw blade on a carriage that runs along a 4 m twin rail beam on two painted stands, with roller wheels, a motor hump and an amber warning bar.","description":"A 4 m twin rail beam at 0.94 m on two painted stands with foot plates and end blocks, with amber floor chevrons below. The carriage runs on four rollers and carries a 22 tooth 1.24 m blade on a through shaft. Overall size 4.12 x 1.8 x 1.23 m in metres, +Y up, +Z forward, resting on y=0. Node `carriage` translates along X on the rails; node `blade` turns on the arbor at x=0.44, y=1.18, parallel to X, and rides with the carriage. Clips: `idle` runs the carriage 2.6 m along the rail and back over 4 s while the blade keeps turning. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-saw-on-rail-614c9716","cdnUrl":"https://cdn.3dassets.dev/assets/8546/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-saw-on-rail-614c9716","thumbnailUrl":"https://cdn.3dassets.dev/assets/8546/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8546/v1/poster.webp","blurhash":"U39tJp~m009J9i?ci]8_009I_NxU-dI7%h%j","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":40248,"triangles":724,"vertices":2172,"meshes":8,"materials":4,"textures":0,"animations":["idle"],"boundingBox":{"min":[-2.059999942779541,-0.00004790334366544524,-0.517401855783634],"max":[2.059999942779541,1.7997471022605895,0.7174017961789891]},"sizeMeters":[4.12,1.8,1.235],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:07.183Z","updatedAt":"2026-09-06T13:57:07.584Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8546/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function CircularSawTravellingOnARailAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8546/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8546/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8546/v1/model.glb\" alt=\"Circular saw travelling on a rail (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8546/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8546/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8548","slug":"animated-mechanisms-kit-falling-gate-e1b36b81","title":"Falling slab gate in guides (Animated Mechanisms Kit)","summary":"A 2.14 m ribbed steel slab held clear in two channel guides between painted piers, under a bolted head beam with a lit release box. It drops to the floor when triggered.","description":"Two 3.5 m painted piers with channel guides and cap plates carry a bolted head beam and an emissive release box. The gate slab is 2.14 m wide and 2.5 m tall with five ribs and amber edge bands, held with its foot 0.86 m clear of the floor. Overall size 3.43 x 4.04 x 0.79 m in metres, +Y up, +Z forward, resting on y=0. Node `gate` translates straight down on Y between its guides. Clips: `trigger` drops the gate 0.86 m onto the floor in 0.25 s, holds, then lifts it back over 1.8 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-falling-gate-e1b36b81","cdnUrl":"https://cdn.3dassets.dev/assets/8548/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-falling-gate-e1b36b81","thumbnailUrl":"https://cdn.3dassets.dev/assets/8548/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8548/v1/poster.webp","blurhash":"U4Am}1z:00PX4Xt.^#MH00tlxcIUKl$QxmEL","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":24660,"triangles":408,"vertices":1224,"meshes":8,"materials":5,"textures":0,"animations":["trigger"],"boundingBox":{"min":[-1.560110462273241,0,-0.3400469952937605],"max":[1.8700000047683716,4.039999961853027,0.44999451841337623]},"sizeMeters":[3.43,4.04,0.79],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:06.924Z","updatedAt":"2026-09-06T13:57:07.702Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8548/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function FallingSlabGateInGuidesAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8548/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8548/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8548/v1/model.glb\" alt=\"Falling slab gate in guides (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8548/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8548/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8550","slug":"animated-mechanisms-kit-rotating-spike-column-ff9ae9f8","title":"Rotating spike column (Animated Mechanisms Kit)","summary":"A 3.48 m column on cast end caps carrying six staggered bands of six spikes each, with amber floor chevrons at the base. The whole column turns on its axis.","description":"A 1.16 m cast base and matching head cap carry a 0.6 m painted column between them. Six collar bands at 0.44 m spacing each hold six 0.34 m tapered spikes, staggered half a pitch band to band, with amber chevrons on the floor. Overall size 1.32 x 3.48 x 1.32 m in metres, +Y up, +Z forward, resting on y=0. Node `column` turns on the vertical centre axis at y=0.28. Clips: `spin` turns the column one full revolution over 3 s and loops seamlessly. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-rotating-spike-column-ff9ae9f8","cdnUrl":"https://cdn.3dassets.dev/assets/8550/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-rotating-spike-column-ff9ae9f8","thumbnailUrl":"https://cdn.3dassets.dev/assets/8550/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8550/v1/poster.webp","blurhash":"U784rV%200D*RpRkobxt00WA_No#M{oftQRj","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":98400,"triangles":1972,"vertices":5916,"meshes":4,"materials":4,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.6600253621701389,0,-0.6600253621701389],"max":[0.6600253621701389,3.4800000190734863,0.6600253621701389]},"sizeMeters":[1.32,3.48,1.32],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:07.353Z","updatedAt":"2026-09-06T13:57:07.879Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8550/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function RotatingSpikeColumnAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8550/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8550/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8550/v1/model.glb\" alt=\"Rotating spike column (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8550/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8550/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8549","slug":"animated-mechanisms-kit-tilting-platform-e1cb4c09","title":"Tilting platform on a trunnion axle (Animated Mechanisms Kit)","summary":"A 2.5 m by 1.9 m ribbed deck balanced on a trunnion axle between two painted bearing stools, with amber edge bands, floor kerbs and a lit control box.","description":"A 3.2 m base plate carries two painted stools with bearing blocks and a through axle at 0.94 m. The deck is 2.5 m by 1.9 m with seven grip ribs, edge channels and amber bands, over two amber floor kerbs and a control box with a lamp. Overall size 3.2 x 1.1 x 2.2 m in metres, +Y up, +Z forward, resting on y=0. Node `deck` pivots on the trunnion axle at y=0.94, parallel to X, so the whole deck tips both ways. Clips: `idle` tips the deck 17 degrees each way and back through level over 4 s. Node TRS animation on named nodes only; no skinned rig, skeleton, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-tilting-platform-e1cb4c09","cdnUrl":"https://cdn.3dassets.dev/assets/8549/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-tilting-platform-e1cb4c09","thumbnailUrl":"https://cdn.3dassets.dev/assets/8549/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8549/v1/poster.webp","blurhash":"U8C6#]xu00M}~Vo#9ZV=00WB.8RP02r:%NI^","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"animated","title":"Animated"},{"slug":"interior","title":"Interior"},{"slug":"exterior","title":"Exterior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":22084,"triangles":368,"vertices":1104,"meshes":8,"materials":5,"textures":0,"animations":["idle"],"boundingBox":{"min":[-1.600000023841858,0.000052150144136620113,-1.0999359275204228],"max":[1.600000023841858,1.1000607270654856,1.0999359275204228]},"sizeMeters":[3.2,1.1,2.2],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:07.061Z","updatedAt":"2026-09-06T13:57:07.819Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8549/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n  mixer = new AnimationMixer(gltf.scene)\n  mixer.clipAction(gltf.animations[0]).play()\n})\n\n// Call from your render loop; deltaSeconds is time since the previous frame.\nfunction updateAssetAnimation(deltaSeconds) {\n  mixer?.update(deltaSeconds)\n}","r3f":"import { useGLTF, useAnimations } from '@react-three/drei'\nimport { useEffect } from 'react'\n\nexport function TiltingPlatformOnATrunnionAxleAnimatedMechanismsKit(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/8549/v1/model.glb')\n  const { actions, names } = useAnimations(animations, scene)\n  useEffect(() => {\n    const action = actions[names[0]]\n    action?.reset().play()\n    return () => { action?.stop() }\n  }, [actions, names])\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8549/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8549/v1/model.glb\" alt=\"Tilting platform on a trunnion axle (Animated Mechanisms Kit)\" camera-controls auto-rotate autoplay></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8549/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.\n# Clips arrive as actions; play them from the Dope Sheet > Action Editor.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)\nvar player := model.find_child(\"AnimationPlayer\", true, false) as AnimationPlayer\nplayer.play(player.get_animation_list()[0])","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8549/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"8552","slug":"animated-mechanisms-kit-machine-room-0c84ab1d-starter-scene","title":"Working machine room (Animated Mechanisms Kit)","summary":"Composed example for Animated Mechanisms Kit.","description":"A plant floor on a 4.6 m grid: a bucket elevator, three conveyors and an inclined feed lift along the back, a gear train, crank and flywheel, piston assembly and stamping press through the middle, a scissor lift, gantry hoist, crusher and travelling saw, and a front row of controls with a gear pair and an extractor fan. Every model is at its rest pose.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-machine-room-0c84ab1d-starter-scene","cdnUrl":"https://cdn.3dassets.dev/assets/8552/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-machine-room-0c84ab1d-starter-scene","thumbnailUrl":"https://cdn.3dassets.dev/assets/8552/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8552/v1/poster.webp","blurhash":"U37_4p-n00R%R+D$s+%M00Ib.ARQRP_4XTD%","category":{"slug":"environments","title":"Environments & Scenes"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"kit","title":"Kit / Set"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":836744,"triangles":21846,"vertices":45985,"meshes":161,"materials":7,"textures":0,"animations":[],"boundingBox":{"min":[-9.100033637539708,-0.00009021346801252328,-9.674999904632568],"max":[9.159999990463255,5.360000133514404,11.72000002861023]},"sizeMeters":[18.26,5.36,21.395],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:07.590Z","updatedAt":"2026-09-06T13:57:08.391Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8552/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function WorkingMachineRoomAnimatedMechanismsKit(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/8552/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8552/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8552/v1/model.glb\" alt=\"Working machine room (Animated Mechanisms Kit)\" camera-controls auto-rotate></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8552/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8552/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"8555","slug":"animated-mechanisms-kit-door-and-gate-wall-7e348e0d","title":"Door and gate wall (Animated Mechanisms Kit)","summary":"Composed example for Animated Mechanisms Kit.","description":"The eight wall bay doors tiled into one continuous 24 m wall at their rest pose, proving the shared 3 m bay module and its left and right connectors, with the four free standing gates set out in front of it.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-door-and-gate-wall-7e348e0d","cdnUrl":"https://cdn.3dassets.dev/assets/8555/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-door-and-gate-wall-7e348e0d","thumbnailUrl":"https://cdn.3dassets.dev/assets/8555/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8555/v1/poster.webp","blurhash":"U49aHh_400xtR._3xuDi009E?HM{nM00IW.9","category":{"slug":"environments","title":"Environments & Scenes"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"kit","title":"Kit / Set"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":347548,"triangles":8042,"vertices":17806,"meshes":99,"materials":7,"textures":0,"animations":[],"boundingBox":{"min":[-12.309999942779541,-0.0000829839523062148,-0.36992035165897974],"max":[14.239999904632569,7.239999771118164,9.300404923819395]},"sizeMeters":[26.55,7.24,9.67],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_materials_transmission","KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:07.929Z","updatedAt":"2026-09-06T13:57:08.690Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8555/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function DoorAndGateWallAnimatedMechanismsKit(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/8555/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8555/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8555/v1/model.glb\" alt=\"Door and gate wall (Animated Mechanisms Kit)\" camera-controls auto-rotate></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8555/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8555/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"8557","slug":"animated-mechanisms-kit-fixtures-and-motion-yard-e74e94a9","title":"Fixtures and motion yard (Animated Mechanisms Kit)","summary":"Composed example for Animated Mechanisms Kit.","description":"Every rotating fixture, switch, hanging fitting and hazard in the kit laid out on a 6.4 m grid at real scale, five rows deep, so relative size and rest pose can be compared side by side. Large turning fixtures sit along the back, controls and hazards along the front.","status":"published","url":"https://3dassets.dev/assets/animated-mechanisms-kit-fixtures-and-motion-yard-e74e94a9","cdnUrl":"https://cdn.3dassets.dev/assets/8557/v1/model.glb","downloadUrl":"https://3dassets.dev/download/animated-mechanisms-kit-fixtures-and-motion-yard-e74e94a9","thumbnailUrl":"https://cdn.3dassets.dev/assets/8557/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/8557/v1/poster.webp","blurhash":"U58z=LRk00%KM_x[ozM{00j=~qMzx^D%V?x]","category":{"slug":"environments","title":"Environments & Scenes"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"low-poly","title":"Low Poly"},{"slug":"kit","title":"Kit / Set"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":1248004,"triangles":30972,"vertices":71889,"meshes":259,"materials":8,"textures":0,"animations":[],"boundingBox":{"min":[-24.630000138282778,-0.00007842533752196179,-15.684999990463258],"max":[24.00000002384186,5.980003615539024,13.899935927520424]},"sizeMeters":[48.63,5.98,29.585],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_materials_transmission","KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5 (1M context)","downloads":0,"publishedAt":"2026-09-06T13:57:09.581Z","updatedAt":"2026-09-06T13:57:10.228Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/8557/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function FixturesAndMotionYardAnimatedMechanismsKit(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/8557/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/8557/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/8557/v1/model.glb\" alt=\"Fixtures and motion yard (Animated Mechanisms Kit)\" camera-controls auto-rotate></model-viewer>","blender":"# Blender 4.x: File > Import > glTF 2.0, or from the Python console after downloading the file.\nimport bpy\nbpy.ops.import_scene.gltf(filepath='model.glb')  # from https://cdn.3dassets.dev/assets/8557/v1/model.glb\n# Metres and +Y up are converted to Blender's Z-up scene automatically.","godot":"# Godot 4: copy model.glb into res://models/ and the editor imports it as a scene.\nvar packed := load(\"res://models/model.glb\") as PackedScene\nvar model := packed.instantiate()\nadd_child(model)","unity":"// Unity: import model.glb with glTFast (Package Manager: com.unity.cloud.gltfast) and drag the prefab in,\n// or load it at runtime straight from the CDN:\nusing GLTFast;\nvar gltf = new GltfImport();\nif (await gltf.Load(\"https://cdn.3dassets.dev/assets/8557/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}}]}}