{"data":{"id":"28848","slug":"medieval-siege-and-castle-defence-counterweight-trebuc-28bdf307","title":"Counterweight Trebuchet (Medieval Siege and Castle Defence)","summary":"Six metre counterweight trebuchet on a timber bed, with a rocking throwing arm, a hinged stone counterweight box and a windlass.","description":"The heavy engine of the siege. Two A-frames on a bedded timber sole carry an iron axle, and a single oak beam hangs on it with a hinged limestone counterweight box on the short arm and a loaded sling pouch at the long tip. The throw clip rocks the arm through the armed and the loosed extremes about its own axle. The sling and its release hook are a linkage that a rigid node transform cannot carry, so they are modelled loaded and left still; the armed and loosed variants bake the deeper poses. Dimensions 4.04 × 4.90 × 6.72 m (X × Y × Z). Ground-contact origin under the footprint. Metre units, +Y up, +Z forward. Kingdom limestone, ashlar, timber, oak, iron, cloth, slate and straw, the palette shared with the castle construction and faction building packs. Rigid node-transform clips throw turn named parts on their own pivots. No skinning, no skeleton, no collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-counterweight-trebuc-28bdf307","cdnUrl":"https://cdn.3dassets.dev/assets/28848/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-counterweight-trebuc-28bdf307","thumbnailUrl":"https://cdn.3dassets.dev/assets/28848/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28848/v1/poster.webp","blurhash":"U6Bo{i^%004;0g4;-A~B01D*^*?axGt7xHwI","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"slug":"exterior","title":"Exterior"},{"slug":"animated","title":"Animated"}],"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":43384,"triangles":772,"vertices":2316,"meshes":8,"materials":5,"textures":0,"animations":["throw"],"boundingBox":{"min":[-2.2282536029815674,-0.00008930874601364991,-4.6234348575631286],"max":[1.8074409188533587,4.89924035627772,2.0999999046325684]},"sizeMeters":[4.036,4.899,6.723],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:30.617Z","updatedAt":"2026-09-08T03:57:30.718Z","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/28848/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 CounterweightTrebuchetMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28848/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/28848/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28848/v1/model.glb\" alt=\"Counterweight Trebuchet (Medieval Siege and Castle Defence)\" 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/28848/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/28848/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}}}