{"data":{"id":177,"slug":"medieval-siege-and-castle-defence","title":"Medieval Siege and Castle Defence","summary":"Working siege engines, a wall under assault, foot and mounted units and a besiegers camp for a medieval RTS.","description":"The assault and the defence of a castle at metre scale, in the kingdom low-poly art family shared with the castle construction and faction building packs. Trebuchets, a mangonel, a springald, a ram penthouse and a siege tower are rigged machines on their own pivots; a modular 4 m wall run carries a barred gate, a winched portcullis, bracketed hoardings and a breach; eleven silhouette-readable unit designs and a camp of tents, carts and a gated palisade finish the picture. Sling ropes, skeins and hoist lines are linkages a rigid node transform cannot carry, so they are modelled in one pose and left still, and the units are static posed studies with no skinning.","url":"https://3dassets.dev/packs/medieval-siege-and-castle-defence","coverUrl":"https://cdn.3dassets.dev/assets/28895/v1/poster.webp","assetCount":58,"aiGenerated":true,"aiGeneratedAssetCount":58,"aiModels":["Claude Fable 5.1"],"aiModelUnspecifiedCount":0,"featured":true,"licenseLabel":"CC0 1.0 Universal","totalBytes":3006804,"totalTriangles":61704,"starterScene":{"id":"28895","slug":"medieval-siege-and-castle-defence-castle-639472aa-starter-scene","title":"Castle Wall Under Assault (Medieval Siege and Castle Defence)","summary":"Forty metres of defended curtain on the 4 m wall grid, with a barred gate, a cracked bay and an open breach in it. Timber hoardings bracket the wall head in two runs, defenders work the merlons over a pitch cauldron, braziers and stocked arrows, and a repair scaffold stands...","description":"Forty metres of defended curtain on the 4 m wall grid, with a barred gate, a cracked bay and an open breach in it. Timber hoardings bracket the wall head in two runs, defenders work the merlons over a pitch cauldron, braziers and stocked arrows, and a repair scaffold stands behind the breach. Below, the ram penthouse is at the gate, the siege tower is closing on the eastern wall and hooked ladders are on the stone with men climbing them. Back in the field the trebuchets, the mangonel and the springald shoot from behind gabions and mantlets with their crews, and the besiegers camp sits inside its own gated palisade at the rear.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-castle-639472aa-starter-scene","cdnUrl":"https://cdn.3dassets.dev/assets/28895/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-castle-639472aa-starter-scene","thumbnailUrl":"https://cdn.3dassets.dev/assets/28895/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28895/v1/poster.webp","blurhash":"U8AmbnNG00w]IVRQobtR00xu~VNH-.x]t8Mw","category":{"slug":"environments","title":"Environments & Scenes"},"tags":[{"slug":"medieval","title":"Medieval"},{"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":1313892,"triangles":28904,"vertices":67012,"meshes":281,"materials":8,"textures":0,"animations":[],"boundingBox":{"min":[-22,-0.0003342640775745309,-6.359866537577422],"max":[18.245482490420386,9.12242603302002,34.017259162095236]},"sizeMeters":[40.245,9.123,40.377],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:40.779Z","updatedAt":"2026-09-08T03:57:40.984Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28895/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CastleWallUnderAssaultMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28895/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28895/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28895/v1/model.glb\" alt=\"Castle Wall Under Assault (Medieval Siege and Castle Defence)\" 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/28895/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/28895/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},"assets":[{"id":"28834","slug":"medieval-siege-and-castle-defence-assault-wall-4m-0d850b94","title":"Assault Wall Bay 4 m (Medieval Siege and Castle Defence)","summary":"Four metre limestone wall bay with a battered plinth, a buttress, arrow loops and a crenellated wall head over a 1.4 m walk.","description":"A 4 m bay of defended curtain: a battered plinth, a solid body with one outer buttress and two arrow loops, a crenellated parapet on the assault face and a low kerb behind a 1.4 m wall walk. West and east ports on the 4 m grid chain bays into a run of any length, and the cracked and breached variants drop into the same run. Dimensions 4.00 × 4.60 × 2.45 m (X × Y × Z). Pivot on the grid origin with named connector ports. 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-assault-wall-4m-0d850b94","cdnUrl":"https://cdn.3dassets.dev/assets/28834/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-assault-wall-4m-0d850b94","thumbnailUrl":"https://cdn.3dassets.dev/assets/28834/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28834/v1/poster.webp","blurhash":"U7H2WT-@0001D*-:xuE100x-_3%LD$xv?bIU","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"slug":"kit","title":"Kit / Set"},{"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":9268,"triangles":144,"vertices":432,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-2,-0.00004277359698212635,-1.2000129942083853],"max":[2,4.599940488906522,1.2500129465246694]},"sizeMeters":[4,4.6,2.45],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:27.274Z","updatedAt":"2026-09-08T03:57:27.399Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28834/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function AssaultWallBay4MMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28834/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28834/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28834/v1/model.glb\" alt=\"Assault Wall Bay 4 m (Medieval Siege and Castle Defence)\" 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/28834/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/28834/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28837","slug":"medieval-siege-and-castle-defence-assault-wall-cracked-6b49748c","title":"Assault Wall Bay Cracked (Medieval Siege and Castle Defence)","summary":"The same 4 m bay after a stone strike: a stepped crack through the face, a shattered merlon and spalled blocks at the foot.","description":"The 4 m bay taking damage. A stepped crack runs from the plinth to the wall head, one merlon is shot away and spalled blocks lie at the foot, so a wall run can show the engines working without changing its geometry anywhere else. Dimensions 4.00 × 4.65 × 3.42 m (X × Y × Z). Pivot on the grid origin with named connector ports. 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. Static geometry; no rig, animation, collision or navigation data. Functional variant of assault-wall-4m.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-assault-wall-cracked-6b49748c","cdnUrl":"https://cdn.3dassets.dev/assets/28837/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-assault-wall-cracked-6b49748c","thumbnailUrl":"https://cdn.3dassets.dev/assets/28837/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28837/v1/poster.webp","blurhash":"U6GuzQ%N004nRo-pM_D*00j=~qagIVxuxuIT","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"slug":"kit","title":"Kit / Set"},{"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":14632,"triangles":252,"vertices":756,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-2.0001372918256943,0,-1.2001183081921811],"max":[2.0001372918256943,4.650000095367432,2.2247537940001143]},"sizeMeters":[4,4.65,3.425],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:27.610Z","updatedAt":"2026-09-08T03:57:27.717Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28837/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function AssaultWallBayCrackedMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28837/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28837/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28837/v1/model.glb\" alt=\"Assault Wall Bay Cracked (Medieval Siege and Castle Defence)\" 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/28837/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/28837/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28836","slug":"medieval-siege-and-castle-defence-assault-wall-breache-5bf684bc","title":"Assault Wall Bay Breached (Medieval Siege and Castle Defence)","summary":"The 4 m bay opened by a breach: two jagged stubs, a rubble ramp through the gap and fallen ashlar on both faces.","description":"The bay after the wall has come down. Two jagged stubs keep the grid ports so the breach drops into a standing run, and a rubble ramp fills the gap at a climbable slope with fallen ashlar spilled on both faces. Dimensions 4.00 × 3.90 × 4.20 m (X × Y × Z). Pivot on the grid origin with named connector ports. 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. Static geometry; no rig, animation, collision or navigation data. Functional variant of assault-wall-4m.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-assault-wall-breache-5bf684bc","cdnUrl":"https://cdn.3dassets.dev/assets/28836/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-assault-wall-breache-5bf684bc","thumbnailUrl":"https://cdn.3dassets.dev/assets/28836/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28836/v1/poster.webp","blurhash":"UAF62w.7009F01%M-;D*00IU~p%Mx]V@ozoe","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"slug":"kit","title":"Kit / Set"},{"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":9048,"triangles":152,"vertices":456,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-2,-0.00003514396961312727,-2.0457863807678223],"max":[2.001297651810064,3.900036259748481,2.1515603065490723]},"sizeMeters":[4.001,3.9,4.197],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:27.378Z","updatedAt":"2026-09-08T03:57:27.489Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28836/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function AssaultWallBayBreachedMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28836/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28836/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28836/v1/model.glb\" alt=\"Assault Wall Bay Breached (Medieval Siege and Castle Defence)\" 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/28836/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/28836/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28838","slug":"medieval-siege-and-castle-defence-assault-gate-4m-e03bd748","title":"Iron Bound Gate Bay 4 m (Medieval Siege and Castle Defence)","summary":"Gate bay on the wall grid: an arched tunnel, two iron bound oak leaves on their hinges and a drawbar that slides into the wall socket.","description":"The gate bay of the wall run. A 1.8 m arched tunnel through a 4 m bay carries two oak leaves strapped and studded in iron, hung on the jambs, with a squared drawbar behind them that slides into a socket cut in the pier. The gate clips swing both leaves together and the bar clips run it into and out of its socket, so the bay reads shut, barred or forced. Dimensions 4.10 × 4.60 × 2.47 m (X × Y × Z). Pivot on the grid origin with named connector ports. 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 gate-open, gate-close, bar-open, bar-close 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-assault-gate-4m-e03bd748","cdnUrl":"https://cdn.3dassets.dev/assets/28838/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-assault-gate-4m-e03bd748","thumbnailUrl":"https://cdn.3dassets.dev/assets/28838/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28838/v1/poster.webp","blurhash":"UFHV3Z~q00IVfT-pt7IU00M{s:IUIUt7%MM{","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"slug":"kit","title":"Kit / Set"},{"slug":"animated","title":"Animated"},{"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":54756,"triangles":1048,"vertices":3144,"meshes":8,"materials":4,"textures":0,"animations":["gate-open","gate-close","bar-open","bar-close"],"boundingBox":{"min":[-2.049999952316284,0,-1.2700036371871044],"max":[2.049999952316284,4.599999904632568,1.2013336309206606]},"sizeMeters":[4.1,4.6,2.471],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:27.653Z","updatedAt":"2026-09-08T03:57:27.747Z","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/28838/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 IronBoundGateBay4MMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28838/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/28838/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28838/v1/model.glb\" alt=\"Iron Bound Gate Bay 4 m (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/28838/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/28838/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28839","slug":"medieval-siege-and-castle-defence-portcullis-winched-5029dd0e","title":"Winched Portcullis (Medieval Siege and Castle Defence)","summary":"Stone gate frame with a spiked iron portcullis that lifts 2.5 m in its slots, over a squared winch drum on brackets.","description":"The inner defence of a gate passage: two dressed piers, a lintel, a slotted iron grille of six spiked bars on three cross straps, and a squared oak winch drum on iron brackets above the arch. The grille lifts clear of the passage and the drum turns with it. The winch rope and its chains are a linkage no rigid node transform can carry, so they are not modelled. Dimensions 3.74 × 5.44 × 1.74 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 open, close, spin 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-portcullis-winched-5029dd0e","cdnUrl":"https://cdn.3dassets.dev/assets/28839/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-portcullis-winched-5029dd0e","thumbnailUrl":"https://cdn.3dassets.dev/assets/28839/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28839/v1/poster.webp","blurhash":"U4EyVr~q00M_s*_3NL0000ae?bD*00xv~WM{","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"slug":"kit","title":"Kit / Set"},{"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":25516,"triangles":428,"vertices":1284,"meshes":5,"materials":4,"textures":0,"animations":["open","close","spin"],"boundingBox":{"min":[-1.8699927386693982,-5.960463234089275e-10,-0.8700694798278129],"max":[1.8699927386693982,5.439996279653538,0.8700694798278129]},"sizeMeters":[3.74,5.44,1.74],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:27.824Z","updatedAt":"2026-09-08T03:57:27.928Z","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/28839/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 WinchedPortcullisMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28839/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/28839/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28839/v1/model.glb\" alt=\"Winched Portcullis (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/28839/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/28839/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28842","slug":"medieval-siege-and-castle-defence-machicolation-course-c6b290ca","title":"Machicolation Course (Medieval Siege and Castle Defence)","summary":"Corbelled stone course for a wall head over a gate: five brackets, four drop openings and a crenellated parapet above.","description":"A 4 m corbelled course that oversails a gate. Five stepped brackets carry four slab strips with real drop openings between them, and a crenellated parapet stands on the course, so the ground below a gate can be covered from directly overhead. Sets on the wall head of the 4 m bays. Dimensions 4.00 × 1.82 × 1.49 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-machicolation-course-c6b290ca","cdnUrl":"https://cdn.3dassets.dev/assets/28842/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-machicolation-course-c6b290ca","thumbnailUrl":"https://cdn.3dassets.dev/assets/28842/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28842/v1/poster.webp","blurhash":"UDFYx;_300xus:~p-;D%00IU?bs;Rj00IUxa","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"medieval","title":"Medieval"},{"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":13208,"triangles":240,"vertices":720,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-2,-8.893292405831588e-7,-0.4899568210774631],"max":[2,1.8200009417813279,0.9999568115407199]},"sizeMeters":[4,1.82,1.49],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:28.887Z","updatedAt":"2026-09-08T03:57:28.998Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28842/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function MachicolationCourseMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28842/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28842/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28842/v1/model.glb\" alt=\"Machicolation Course (Medieval Siege and Castle Defence)\" 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/28842/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/28842/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28841","slug":"medieval-siege-and-castle-defence-parapet-hoarding-4m-b1b0a128","title":"Parapet Hoarding 4 m (Medieval Siege and Castle Defence)","summary":"Bracketed timber fighting gallery for a wall head, with two drop shutters that lift on their top hinges and a shingled pent roof.","description":"A 4 m timber hoarding that brackets onto a parapet. A sill on four rearward bearer beams carries a plank breastwork, two top-hinged drop shutters that lift outward on their own hinges to open the shooting line, and a pent roof of three wide boards sloping to the front. West and east ports on the 4 m grid run a continuous gallery along the wall head. Dimensions 4.06 × 2.21 × 1.80 m (X × Y × Z). Pivot on the grid origin with named connector ports. 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 open, close 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-parapet-hoarding-4m-b1b0a128","cdnUrl":"https://cdn.3dassets.dev/assets/28841/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-parapet-hoarding-4m-b1b0a128","thumbnailUrl":"https://cdn.3dassets.dev/assets/28841/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28841/v1/poster.webp","blurhash":"UCF=dN~V00jJF#^*=sM{009bxuxA$II]ERD*","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"slug":"kit","title":"Kit / Set"},{"slug":"animated","title":"Animated"},{"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":13996,"triangles":204,"vertices":612,"meshes":6,"materials":3,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-2.0299999713897705,-0.00007629627368999081,-1.1499706831574166],"max":[2.0299999713897705,2.2087438458121866,0.651642822587545]},"sizeMeters":[4.06,2.209,1.802],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:28.866Z","updatedAt":"2026-09-08T03:57:28.987Z","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/28841/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 ParapetHoarding4MMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28841/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/28841/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28841/v1/model.glb\" alt=\"Parapet Hoarding 4 m (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/28841/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/28841/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28843","slug":"medieval-siege-and-castle-defence-brattice-box-c7b62509","title":"Brattice Box (Medieval Siege and Castle Defence)","summary":"Small timber brattice on two corbel beams: a covered box that oversails a wall face with a floor slot and a front loophole.","description":"A single-man timber brattice for a wall head or a tower corner. Two corbel beams carry a boarded box with a slot through its floor and a loophole in the front board, under a shallow gable. It hangs clear of the wall face so a defender can reach the foot of the stone. Dimensions 1.50 × 2.16 × 1.50 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-brattice-box-c7b62509","cdnUrl":"https://cdn.3dassets.dev/assets/28843/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-brattice-box-c7b62509","thumbnailUrl":"https://cdn.3dassets.dev/assets/28843/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28843/v1/poster.webp","blurhash":"U7D]C%^*00E2CAIV#P-:009G^h?b]es:ETR-","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"medieval","title":"Medieval"},{"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":7400,"triangles":104,"vertices":312,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.7499618853890624,0.000014040546259419528,-0.7499618853890624],"max":[0.7499618853890624,2.1600000858306885,0.7499618853890624]},"sizeMeters":[1.5,2.16,1.5],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:28.934Z","updatedAt":"2026-09-08T03:57:29.064Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28843/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function BratticeBoxMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28843/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28843/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28843/v1/model.glb\" alt=\"Brattice Box (Medieval Siege and Castle Defence)\" 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/28843/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/28843/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28844","slug":"medieval-siege-and-castle-defence-pitch-cauldron-tripo-b05b7573","title":"Pitch Cauldron on a Tripod (Medieval Siege and Castle Defence)","summary":"Iron cauldron of boiling pitch swinging on trunnions in a tripod, over a fire crib, with a tipping clip.","description":"The wall-head cauldron. An iron cauldron hangs on trunnions inside a three-legged iron stand over a timber fire crib, with a stirring iron and two pitch casks beside it. The tilt clip swings the cauldron through its trunnions to pour and back. The pouring pitch itself is not modelled; there are no particle or fluid effects anywhere in this library. Dimensions 2.02 × 1.46 × 1.83 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 tilt 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-pitch-cauldron-tripo-b05b7573","cdnUrl":"https://cdn.3dassets.dev/assets/28844/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-pitch-cauldron-tripo-b05b7573","thumbnailUrl":"https://cdn.3dassets.dev/assets/28844/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28844/v1/poster.webp","blurhash":"U47^*,^K4nNz58RPV@kX005T%g-O~AtRg3s7","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":55760,"triangles":1056,"vertices":3168,"meshes":6,"materials":4,"textures":0,"animations":["tilt"],"boundingBox":{"min":[-1.2869999408721924,-0.000012921156269052325,-0.49460837507657573],"max":[0.7333402037620544,1.457946704687458,1.3370589938204722]},"sizeMeters":[2.02,1.458,1.832],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:28.983Z","updatedAt":"2026-09-08T03:57:29.142Z","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/28844/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 PitchCauldronOnATripodMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28844/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/28844/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28844/v1/model.glb\" alt=\"Pitch Cauldron on a Tripod (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/28844/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/28844/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28845","slug":"medieval-siege-and-castle-defence-parapet-brazier-51454e80","title":"Parapet Brazier and Fuel (Medieval Siege and Castle Defence)","summary":"Iron fire basket on three legs beside a fuel crib of split logs and four bundles of pitched faggots.","description":"Light and fire for a wall head at night. A riveted iron basket on three splayed legs holds a bed of embers, with a crib of split logs and four bundles of pitched faggots stacked beside it and a long fire iron leaning on the crib. Dimensions 3.58 × 1.42 × 1.03 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-parapet-brazier-51454e80","cdnUrl":"https://cdn.3dassets.dev/assets/28845/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-parapet-brazier-51454e80","thumbnailUrl":"https://cdn.3dassets.dev/assets/28845/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28845/v1/poster.webp","blurhash":"U8BW9,t,Vs={5W~BxZ9a009HNJR%-403NI?G","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":44332,"triangles":840,"vertices":2520,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-1.6801937818527222,0.00003660517519699091,-0.4949088516054029],"max":[1.899999976158142,1.4240657011907698,0.5307207547925625]},"sizeMeters":[3.58,1.424,1.026],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:29.239Z","updatedAt":"2026-09-08T03:57:29.385Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28845/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ParapetBrazierAndFuelMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28845/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28845/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28845/v1/model.glb\" alt=\"Parapet Brazier and Fuel (Medieval Siege and Castle Defence)\" 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/28845/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/28845/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28846","slug":"medieval-siege-and-castle-defence-missile-stock-rack-c0f1b943","title":"Arrow and Bolt Stock (Medieval Siege and Castle Defence)","summary":"Wall-head stock rack: two open bins of crossbow bolts, four standing sheaves of arrows and a rack of spare bowstaves.","description":"What a wall head is fed from. A timber frame holds two open bins of crossbow bolts, four standing sheaves of arrows in their straw bindings and a rack of four spare bowstaves, with a coiled spare string on the end post. Dimensions 2.10 × 1.64 × 0.94 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-missile-stock-rack-c0f1b943","cdnUrl":"https://cdn.3dassets.dev/assets/28846/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-missile-stock-rack-c0f1b943","thumbnailUrl":"https://cdn.3dassets.dev/assets/28846/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28846/v1/poster.webp","blurhash":"U6G8P;oz00Or02%0kW9a02E2aKr@~U~Aae9u","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":30496,"triangles":584,"vertices":1752,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-1.090000033378601,-0.000005438747843200531,-0.4899537746488155],"max":[1.0099999904632568,1.6399404749708095,0.4499954222235786]},"sizeMeters":[2.1,1.64,0.94],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:29.263Z","updatedAt":"2026-09-08T03:57:29.404Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28846/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ArrowAndBoltStockMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28846/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28846/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28846/v1/model.glb\" alt=\"Arrow and Bolt Stock (Medieval Siege and Castle Defence)\" 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/28846/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/28846/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28847","slug":"medieval-siege-and-castle-defence-repair-scaffold-hois-8246e761","title":"Wall Repair Scaffold and Hoist (Medieval Siege and Castle Defence)","summary":"Two-lift timber scaffold with a braced jib, a turning hoist drum, a stone skip and a mortar tub for repairing a breach.","description":"The masons behind the breach. A braced two-lift scaffold with plank decks and a ladder carries a jib and a squared hoist drum that turns, with a stone skip standing on the ground under it and a mortar tub, a hod and dressed replacement blocks at the foot. The hoist rope is a linkage, so it is not modelled and the skip does not rise with the drum. Dimensions 5.14 × 5.08 × 2.64 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 spin 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-repair-scaffold-hois-8246e761","cdnUrl":"https://cdn.3dassets.dev/assets/28847/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-repair-scaffold-hois-8246e761","thumbnailUrl":"https://cdn.3dassets.dev/assets/28847/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28847/v1/poster.webp","blurhash":"U9C$cQIv00xAE3jFR*X901xV~AR.ohtR$#R5","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":31844,"triangles":556,"vertices":1668,"meshes":6,"materials":5,"textures":0,"animations":["spin"],"boundingBox":{"min":[-2.9100000858306885,-0.0001312095579688588,-0.6799804622023025],"max":[2.234911141678417,5.080293520490777,1.959866537577422]},"sizeMeters":[5.145,5.08,2.64],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:29.467Z","updatedAt":"2026-09-08T03:57:29.573Z","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/28847/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 WallRepairScaffoldAndHoistMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28847/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/28847/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28847/v1/model.glb\" alt=\"Wall Repair Scaffold and Hoist (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/28847/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/28847/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28851","slug":"medieval-siege-and-castle-defence-rubble-breach-pile-ab226771","title":"Breach Rubble Pile (Medieval Siege and Castle Defence)","summary":"Loose spill of fallen ashlar, broken limestone and mortar dust to fill and dress the foot of a breach.","description":"The spoil that a breach leaves. Sixteen fallen blocks in three sizes, three broken drums and a spread of mortar dust, at rotations that read as a collapse rather than a stack. Drops at the foot of the breached bay or anywhere a wall has come down. Dimensions 4.25 × 0.98 × 3.36 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-rubble-breach-pile-ab226771","cdnUrl":"https://cdn.3dassets.dev/assets/28851/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-rubble-breach-pile-ab226771","thumbnailUrl":"https://cdn.3dassets.dev/assets/28851/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28851/v1/poster.webp","blurhash":"UCCGY|V]00aes,t7R*ae00k8~qkCNIMxxuog","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":18648,"triangles":336,"vertices":1008,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-2.1548964977264404,-0.00004615464212548437,-1.5771060502954437],"max":[2.0999999046325684,0.982446154737493,1.7819237029977752]},"sizeMeters":[4.255,0.982,3.359],"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.792Z","updatedAt":"2026-09-08T03:57:30.917Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28851/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function BreachRubblePileMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28851/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28851/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28851/v1/model.glb\" alt=\"Breach Rubble Pile (Medieval Siege and Castle Defence)\" 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/28851/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/28851/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"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."}},{"id":"28849","slug":"medieval-siege-and-castle-defence-counterweight-trebuc-5c7b4bb4","title":"Counterweight Trebuchet Armed (Medieval Siege and Castle Defence)","summary":"The trebuchet wound down and loaded: long arm at the ground, counterweight raised, sling laid out ready to loose.","description":"The trebuchet held at the armed extreme. The long arm is winched down to the bed with the sling laid out and the counterweight box raised over the frame, which is the pose a crew works around. The arm is baked into this pose and stays still. Dimensions 4.04 × 6.10 × 6.40 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. Static geometry; no rig, animation, collision or navigation data. Functional variant of counterweight-trebuchet.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-counterweight-trebuc-5c7b4bb4","cdnUrl":"https://cdn.3dassets.dev/assets/28849/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-counterweight-trebuc-5c7b4bb4","thumbnailUrl":"https://cdn.3dassets.dev/assets/28849/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28849/v1/poster.webp","blurhash":"U7BC-~~W00000,tR^OMx01RP?Zo#n14.R:~p","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":41196,"triangles":772,"vertices":2316,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-2.2280556223475942,-0.00008930874601364991,-4.12825345993042],"max":[1.8076181189819684,6.098817334549127,2.2722723484039307]},"sizeMeters":[4.036,6.099,6.401],"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.764Z","updatedAt":"2026-09-08T03:57:30.878Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28849/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CounterweightTrebuchetArmedMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28849/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28849/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28849/v1/model.glb\" alt=\"Counterweight Trebuchet Armed (Medieval Siege and Castle Defence)\" 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/28849/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/28849/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28850","slug":"medieval-siege-and-castle-defence-counterweight-trebuc-6f58cd6a","title":"Counterweight Trebuchet Loosed (Medieval Siege and Castle Defence)","summary":"The trebuchet just after release: arm swung over the frame, counterweight dropped, sling empty.","description":"The trebuchet at the loosed extreme, arm swung over the frame with the counterweight box dropped between the A-frames and the pouch empty. The arm is baked into this pose and stays still. Dimensions 4.04 × 7.68 × 6.23 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. Static geometry; no rig, animation, collision or navigation data. Functional variant of counterweight-trebuchet.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-counterweight-trebuc-6f58cd6a","cdnUrl":"https://cdn.3dassets.dev/assets/28850/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-counterweight-trebuc-6f58cd6a","thumbnailUrl":"https://cdn.3dassets.dev/assets/28850/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28850/v1/poster.webp","blurhash":"U7BC-^-U00Io5S9a$$~UD%IV-p?a-oS5S1$y","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":41208,"triangles":772,"vertices":2316,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-2.2281627018359598,-0.00008930874601364991,-4.128119336002315],"max":[1.8075540977989122,7.678252220153809,2.0999999046325684]},"sizeMeters":[4.036,7.678,6.228],"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.776Z","updatedAt":"2026-09-08T03:57:30.901Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28850/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CounterweightTrebuchetLoosedMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28850/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28850/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28850/v1/model.glb\" alt=\"Counterweight Trebuchet Loosed (Medieval Siege and Castle Defence)\" 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/28850/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/28850/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28852","slug":"medieval-siege-and-castle-defence-traction-mangonel-2b9b45ea","title":"Traction Mangonel (Medieval Siege and Castle Defence)","summary":"Wheeled traction mangonel: a rocking throwing arm with a bowl, a padded crossbeam stop and four solid wheels that roll.","description":"The light engine that a crew hauls by hand. A braced timber carriage on four solid wheels carries a single arm with a leather bowl at the tip and eight pull ropes at the butt, working against a padded crossbeam stop. The throw clip rocks the arm through its full travel and the wheels roll. The pull ropes are a linkage and are modelled slack and still. Dimensions 2.77 × 1.99 × 4.51 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, wheel-roll 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-traction-mangonel-2b9b45ea","cdnUrl":"https://cdn.3dassets.dev/assets/28852/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-traction-mangonel-2b9b45ea","thumbnailUrl":"https://cdn.3dassets.dev/assets/28852/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28852/v1/poster.webp","blurhash":"UABMe^xG01x[Nd9aV@?G01Ip~Ut5-P?Gx[Ip","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":29288,"triangles":784,"vertices":2352,"meshes":15,"materials":5,"textures":0,"animations":["throw","wheel-roll"],"boundingBox":{"min":[-1.3825999617576599,0.000003586067299887752,-2.7300000190734863],"max":[1.3825999617576599,1.9914270489492836,1.7799999713897705]},"sizeMeters":[2.765,1.991,4.51],"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.841Z","updatedAt":"2026-09-08T03:57:30.960Z","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/28852/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 TractionMangonelMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28852/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/28852/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28852/v1/model.glb\" alt=\"Traction Mangonel (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/28852/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/28852/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28853","slug":"medieval-siege-and-castle-defence-carriage-springald-6d00cea5","title":"Carriage Springald (Medieval Siege and Castle Defence)","summary":"Bolt-shooting springald on a wheeled carriage, with twisted skein boxes, a windlass slider, a loaded bolt and a pavise front.","description":"A bolt shooter for a siege line. Two skein boxes on a stout carriage throw a pair of inswinging arms against a bowstring, over a slotted stock with a windlass slider and a loaded bolt, behind a hinged pavise front with a shooting slot. Four solid wheels roll. The skeins, the string and the trigger are a linkage held in one pose, so only the wheels move. Dimensions 2.48 × 1.99 × 2.68 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 wheel-roll 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-carriage-springald-6d00cea5","cdnUrl":"https://cdn.3dassets.dev/assets/28853/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-carriage-springald-6d00cea5","thumbnailUrl":"https://cdn.3dassets.dev/assets/28853/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28853/v1/poster.webp","blurhash":"UAC$fb9b01-o~U9bE2?F01V@^%%L9a-n%2NH","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":35556,"triangles":948,"vertices":2844,"meshes":13,"materials":5,"textures":0,"animations":["wheel-roll"],"boundingBox":{"min":[-1.241400009393692,0.0000032168684765410127,-1.3799862380605064],"max":[1.241400009393692,1.9910289156808734,1.2999999523162842]},"sizeMeters":[2.483,1.991,2.68],"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.967Z","updatedAt":"2026-09-08T03:57:31.092Z","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/28853/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 CarriageSpringaldMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28853/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/28853/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28853/v1/model.glb\" alt=\"Carriage Springald (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/28853/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/28853/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28854","slug":"medieval-siege-and-castle-defence-siege-ram-penthouse-8c424d49","title":"Battering Ram Penthouse (Medieval Siege and Castle Defence)","summary":"Six metre wheeled penthouse over a slung ram beam with an iron head; the beam swings on its slings and six wheels roll.","description":"The ram brought up to a gate. A six metre timber penthouse on eight posts and six solid wheels carries a hide and turf roof against dropped stones, and an oak ram beam with a banded iron head hangs under the ridge on two slings. The swing clip runs the beam through its stroke and back and the wheels roll. The rope suspension is a linkage a rigid node transform cannot carry, so the slings stay in one pose while the beam swings under them. Dimensions 3.33 × 3.77 × 6.30 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 swing, wheel-roll 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-siege-ram-penthouse-8c424d49","cdnUrl":"https://cdn.3dassets.dev/assets/28854/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-siege-ram-penthouse-8c424d49","thumbnailUrl":"https://cdn.3dassets.dev/assets/28854/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28854/v1/poster.webp","blurhash":"U6CsQ,D%00-p.T9Fad%N00RN-=bwvdxtXV%0","category":{"slug":"vehicles","title":"Vehicles"},"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":36724,"triangles":1168,"vertices":3504,"meshes":18,"materials":5,"textures":0,"animations":["swing","wheel-roll"],"boundingBox":{"min":[-1.6634999632835388,0.00005763487743526419,-2.799999952316284],"max":[1.6634999632835388,3.7700160180448767,3.5]},"sizeMeters":[3.327,3.77,6.3],"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.984Z","updatedAt":"2026-09-08T03:57:31.090Z","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/28854/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 BatteringRamPenthouseMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28854/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/28854/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28854/v1/model.glb\" alt=\"Battering Ram Penthouse (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/28854/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/28854/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28855","slug":"medieval-siege-and-castle-defence-siege-tower-5cd6475b","title":"Siege Tower (Medieval Siege and Castle Defence)","summary":"Two-stage boarded siege tower on six wheels, with hide facing, an internal ladder and a drop bridge that falls onto a parapet.","description":"The belfry that puts men on a wall head. A boarded timber tower on six solid wheels carries two fighting stages, shuttered loopholes on both flanks, an internal ladder and a green hide facing over the roof against fire. The drop bridge stands upright against the front at rest and falls forward onto a parapet, and all six wheels roll. Dimensions 4.47 × 7.33 × 3.59 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 open, close, wheel-roll 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-siege-tower-5cd6475b","cdnUrl":"https://cdn.3dassets.dev/assets/28855/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-siege-tower-5cd6475b","thumbnailUrl":"https://cdn.3dassets.dev/assets/28855/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28855/v1/poster.webp","blurhash":"U8DSK;nN00I[aeRjayt700tR~Ae-M|t7xtM|","category":{"slug":"vehicles","title":"Vehicles"},"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":39248,"triangles":1040,"vertices":3120,"meshes":17,"materials":5,"textures":0,"animations":["open","close","wheel-roll"],"boundingBox":{"min":[-2.2349998664855955,0.000004296121498326144,-1.75],"max":[2.2349998664855955,7.32971133142222,1.839996362351754]},"sizeMeters":[4.47,7.33,3.59],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:31.138Z","updatedAt":"2026-09-08T03:57:31.320Z","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/28855/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 SiegeTowerMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28855/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/28855/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28855/v1/model.glb\" alt=\"Siege Tower (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/28855/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/28855/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28856","slug":"medieval-siege-and-castle-defence-siege-tower-tall-1b230d59","title":"Siege Tower Three Stage (Medieval Siege and Castle Defence)","summary":"The taller three-stage belfry for a high curtain, at eight metres to the bridge hinge, on the same six-wheel chassis.","description":"The tall belfry for a higher curtain: three fighting stages on the same six-wheel chassis, with the bridge hinge two metres further up. The drop bridge and the wheels work exactly as they do on the two-stage tower. Dimensions 4.47 × 9.33 × 3.59 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 open, close, wheel-roll turn named parts on their own pivots. No skinning, no skeleton, no collision or navigation data. Functional variant of siege-tower.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-siege-tower-tall-1b230d59","cdnUrl":"https://cdn.3dassets.dev/assets/28856/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-siege-tower-tall-1b230d59","thumbnailUrl":"https://cdn.3dassets.dev/assets/28856/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28856/v1/poster.webp","blurhash":"U7Cr.ZxZ00Ip$~afM}oy03ah~AofRQoLt7R*","category":{"slug":"vehicles","title":"Vehicles"},"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":44488,"triangles":1148,"vertices":3444,"meshes":17,"materials":5,"textures":0,"animations":["open","close","wheel-roll"],"boundingBox":{"min":[-2.2349998664855955,0.000004296121498326144,-1.75],"max":[2.2349998664855955,9.329711093003642,1.839996362351754]},"sizeMeters":[4.47,9.33,3.59],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:32.320Z","updatedAt":"2026-09-08T03:57:32.410Z","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/28856/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 SiegeTowerThreeStageMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28856/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/28856/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28856/v1/model.glb\" alt=\"Siege Tower Three Stage (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/28856/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/28856/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28857","slug":"medieval-siege-and-castle-defence-hooked-scaling-ladde-08284588","title":"Hooked Scaling Ladder (Medieval Siege and Castle Defence)","summary":"Six and a half metre scaling ladder with iron top hooks that bite a parapet, an iron foot shoe and spiked heels.","description":"The ladder an assault goes up. Two heavy oak rails with eighteen rungs, a pair of forged iron hooks at the head that bite over a parapet so the ladder cannot be thrown back, an iron shoe and two spiked heels at the foot, and three iron cross straps. Leans at about seventy degrees against a five metre wall. Dimensions 0.86 × 7.12 × 0.90 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-hooked-scaling-ladde-08284588","cdnUrl":"https://cdn.3dassets.dev/assets/28857/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-hooked-scaling-ladde-08284588","thumbnailUrl":"https://cdn.3dassets.dev/assets/28857/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28857/v1/poster.webp","blurhash":"U58zi5D;00~fxWfRNKf506xr~RD-jbj[bGae","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":18856,"triangles":340,"vertices":1020,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.42994963336581005,0,-0.20006247517673642],"max":[0.42994963336581005,7.122426509857178,0.7033099597415176]},"sizeMeters":[0.86,7.122,0.903],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:32.424Z","updatedAt":"2026-09-08T03:57:32.560Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28857/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function HookedScalingLadderMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28857/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28857/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28857/v1/model.glb\" alt=\"Hooked Scaling Ladder (Medieval Siege and Castle Defence)\" 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/28857/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/28857/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28859","slug":"medieval-siege-and-castle-defence-hooked-scaling-ladde-7e81914f","title":"Hooked Scaling Ladder Long (Medieval Siege and Castle Defence)","summary":"The eight and a half metre reach of the same hooked ladder, for a high curtain or a wall on a bank.","description":"The long reach of the hooked ladder: two more metres of rail and six more rungs for a high curtain or a wall standing on a bank. Head hooks, foot shoe and cross straps are unchanged. Dimensions 0.86 × 9.12 × 0.90 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. Static geometry; no rig, animation, collision or navigation data. Functional variant of hooked-scaling-ladder.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-hooked-scaling-ladde-7e81914f","cdnUrl":"https://cdn.3dassets.dev/assets/28859/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-hooked-scaling-ladde-7e81914f","thumbnailUrl":"https://cdn.3dassets.dev/assets/28859/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28859/v1/poster.webp","blurhash":"U37m?6r?00KO%MWUIVs;0gbb~AnOazkCjsV[","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":22324,"triangles":412,"vertices":1236,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.4298539931938508,0,-0.19994567284741904],"max":[0.4298539931938508,9.12242603302002,0.7031931574122002]},"sizeMeters":[0.86,9.122,0.903],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:32.461Z","updatedAt":"2026-09-08T03:57:32.570Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28859/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function HookedScalingLadderLongMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28859/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28859/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28859/v1/model.glb\" alt=\"Hooked Scaling Ladder Long (Medieval Siege and Castle Defence)\" 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/28859/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/28859/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28858","slug":"medieval-siege-and-castle-defence-wheeled-mantlet-scre-fc15f895","title":"Wheeled Mantlet Screen (Medieval Siege and Castle Defence)","summary":"Man-high wheeled plank screen with a hinged loophole shutter, a straw padded head and a prop leg; the wheels roll.","description":"The screen a crossbowman works behind. A planked oak face on two braced posts, a straw padded head that soaks a shot, a hinged loophole shutter that lifts on its top hinge to open the shooting slot, a rear prop leg and two small wheels so one man can walk it forward. Dimensions 2.52 × 2.69 × 1.37 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 open, close, wheel-roll 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-wheeled-mantlet-scre-fc15f895","cdnUrl":"https://cdn.3dassets.dev/assets/28858/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-wheeled-mantlet-scre-fc15f895","thumbnailUrl":"https://cdn.3dassets.dev/assets/28858/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28858/v1/poster.webp","blurhash":"UACY{s~U0002x[%LaLD*03Ip~A-nnPR,tQxZ","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":19712,"triangles":396,"vertices":1188,"meshes":10,"materials":5,"textures":0,"animations":["open","close","wheel-roll"],"boundingBox":{"min":[-1.2589999556541442,0.0000025493294506517827,-1.181827194644246],"max":[1.2589999556541442,2.692676544189453,0.1899740502607085]},"sizeMeters":[2.518,2.693,1.372],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:32.445Z","updatedAt":"2026-09-08T03:57:32.552Z","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/28858/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 WheeledMantletScreenMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28858/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/28858/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28858/v1/model.glb\" alt=\"Wheeled Mantlet Screen (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/28858/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/28858/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28860","slug":"medieval-siege-and-castle-defence-mantlet-screen-wide-3768f376","title":"Wheeled Mantlet Screen Wide (Medieval Siege and Castle Defence)","summary":"The two and a half metre mantlet with three hinged loopholes, for screening an engine crew rather than one shooter.","description":"The wide mantlet: two and a half metres of face with three independently hinged loopholes, sized to screen a mangonel crew or a working party rather than one shooter. Padding, prop leg and wheels are unchanged. Dimensions 3.42 × 2.69 × 1.37 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 open, close, wheel-roll turn named parts on their own pivots. No skinning, no skeleton, no collision or navigation data. Functional variant of wheeled-mantlet-screen.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-mantlet-screen-wide-3768f376","cdnUrl":"https://cdn.3dassets.dev/assets/28860/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-mantlet-screen-wide-3768f376","thumbnailUrl":"https://cdn.3dassets.dev/assets/28860/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28860/v1/poster.webp","blurhash":"UDDSUC~U009H%L%Kn$IV02Ip^%%0M{Sgo|jZ","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":22800,"triangles":456,"vertices":1368,"meshes":13,"materials":5,"textures":0,"animations":["open","close","wheel-roll"],"boundingBox":{"min":[-1.7089999854564668,0.0000025209860022856745,-1.181754345949086],"max":[1.7089999854564668,2.6926701110511564,0.19000152795647385]},"sizeMeters":[3.418,2.693,1.372],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:32.487Z","updatedAt":"2026-09-08T03:57:32.590Z","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/28860/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 WheeledMantletScreenWideMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28860/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/28860/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28860/v1/model.glb\" alt=\"Wheeled Mantlet Screen Wide (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/28860/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/28860/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28861","slug":"medieval-siege-and-castle-defence-gabion-basket-9940bbb2","title":"Gabion Basket (Medieval Siege and Castle Defence)","summary":"Woven wicker basket rammed with earth, the portable cover a siege line is built from.","description":"One gabion: eleven uprights woven with three withy bands, filled with rammed earth and capped with a turf. Stands where it is dropped and stops what a mantlet would not. Line them up for a battery or stack a second course on top. Dimensions 1.21 × 1.36 × 1.23 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-gabion-basket-9940bbb2","cdnUrl":"https://cdn.3dassets.dev/assets/28861/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-gabion-basket-9940bbb2","thumbnailUrl":"https://cdn.3dassets.dev/assets/28861/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28861/v1/poster.webp","blurhash":"U7EVD]-o00RO.mfPDOof02I;-oxaH?WBtlkW","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":24880,"triangles":452,"vertices":1356,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.5949141355658026,0.00002718953358393783,-0.6136893033981323],"max":[0.6200284930372687,1.3600021149927555,0.6136893033981323]},"sizeMeters":[1.215,1.36,1.227],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:32.647Z","updatedAt":"2026-09-08T03:57:32.777Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28861/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function GabionBasketMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28861/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28861/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28861/v1/model.glb\" alt=\"Gabion Basket (Medieval Siege and Castle Defence)\" 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/28861/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/28861/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28862","slug":"medieval-siege-and-castle-defence-gabion-battery-d2507b7a","title":"Gabion Battery (Medieval Siege and Castle Defence)","summary":"Five gabions in a curved line with a second course and three fascines, the finished cover for an engine position.","description":"The battery an engine shoots from: five gabions set in a shallow curve with two of the second course above and three lashed fascines closing the gaps, on a low earth bank. Four metres of cover with a shooting notch in the middle. Dimensions 5.01 × 2.21 × 1.88 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. Static geometry; no rig, animation, collision or navigation data. Functional variant of gabion-basket.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-gabion-battery-d2507b7a","cdnUrl":"https://cdn.3dassets.dev/assets/28862/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-gabion-battery-d2507b7a","thumbnailUrl":"https://cdn.3dassets.dev/assets/28862/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28862/v1/poster.webp","blurhash":"U8EoVn^$00xB4:~U%19b004;^%NH-:E2S#RQ","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":159696,"triangles":3260,"vertices":9780,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-2.4948856830596924,0.0000406585752673605,-1.0139274560950784],"max":[2.5199999809265137,2.209892180046957,0.8636805523004677]},"sizeMeters":[5.015,2.21,1.878],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:32.623Z","updatedAt":"2026-09-08T03:57:32.732Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28862/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function GabionBatteryMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28862/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28862/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28862/v1/model.glb\" alt=\"Gabion Battery (Medieval Siege and Castle Defence)\" 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/28862/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/28862/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28863","slug":"medieval-siege-and-castle-defence-bore-shelter-ee051cf8","title":"Bore Shelter (Medieval Siege and Castle Defence)","summary":"Low hide-roofed shelter on skids with an iron pick bore through the front, for working stone out of a wall foot.","description":"The sow that gets a mining party to the foot of a wall. A steep hide and turf roof on eight posts, low enough to shed a dropped stone, riding on two oak skids, with an iron shod bore on a slung cradle protruding through the front board and a pile of prised blocks and a mattock behind. Nothing on it moves: the bore is hand worked and its cradle is a rope linkage. Dimensions 2.50 × 3.26 × 5.40 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-bore-shelter-ee051cf8","cdnUrl":"https://cdn.3dassets.dev/assets/28863/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-bore-shelter-ee051cf8","thumbnailUrl":"https://cdn.3dassets.dev/assets/28863/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28863/v1/poster.webp","blurhash":"U9DSwC0100N[E:IA-Q%M00xV%N-:}%o#NgW.","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":22260,"triangles":368,"vertices":1104,"meshes":6,"materials":6,"textures":0,"animations":[],"boundingBox":{"min":[-1.249983487437867,-0.00009614448215278237,-2],"max":[1.249983487437867,3.2599489443629657,3.4000000953674316]},"sizeMeters":[2.5,3.26,5.4],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:32.819Z","updatedAt":"2026-09-08T03:57:32.975Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28863/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function BoreShelterMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28863/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28863/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28863/v1/model.glb\" alt=\"Bore Shelter (Medieval Siege and Castle Defence)\" 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/28863/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/28863/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28864","slug":"medieval-siege-and-castle-defence-spearman-8d0f869a","title":"Spearman (Medieval Siege and Castle Defence)","summary":"Levy spearman in a kettle hat and surcoat, spear grounded at the ready with a heater shield on the left arm.","description":"A spearman standing to receive: kettle hat, mail hauberk under a surcoat, a 2.7 m ash spear grounded at the ready and a heater shield on the left arm. Built to read as a silhouette at an overhead camera, with no face and no fingers. Dimensions 1.06 × 3.02 × 0.66 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-spearman-8d0f869a","cdnUrl":"https://cdn.3dassets.dev/assets/28864/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-spearman-8d0f869a","thumbnailUrl":"https://cdn.3dassets.dev/assets/28864/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28864/v1/poster.webp","blurhash":"U46@_{o#00VX00n$~pSjH=RPyE%MyEkDVqV?","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":17544,"triangles":300,"vertices":900,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.6282840371131897,0,-0.27587383568275986],"max":[0.42700591328628523,3.0199999809265137,0.38002386271942673]},"sizeMeters":[1.055,3.02,0.656],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:33.987Z","updatedAt":"2026-09-08T03:57:34.137Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28864/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function SpearmanMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28864/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28864/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28864/v1/model.glb\" alt=\"Spearman (Medieval Siege and Castle Defence)\" 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/28864/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/28864/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28867","slug":"medieval-siege-and-castle-defence-spearman-red-44884f0c","title":"Spearman Crimson (Medieval Siege and Castle Defence)","summary":"The spearman in a crimson faction surcoat and shield.","description":"The same spearman in crimson faction colours on the surcoat and the shield face. Dimensions 1.06 × 3.02 × 0.66 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig. Cosmetic variant of spearman.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-spearman-red-44884f0c","cdnUrl":"https://cdn.3dassets.dev/assets/28867/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-spearman-red-44884f0c","thumbnailUrl":"https://cdn.3dassets.dev/assets/28867/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28867/v1/poster.webp","blurhash":"U57dLGt700M{0Ln$~BX99[NH,[-U+}ofKMR%","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":17588,"triangles":300,"vertices":900,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.6282840371131897,0,-0.27587383568275986],"max":[0.42700591328628523,3.0199999809265137,0.38002386271942673]},"sizeMeters":[1.055,3.02,0.656],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:34.107Z","updatedAt":"2026-09-08T03:57:34.248Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28867/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function SpearmanCrimsonMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28867/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28867/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28867/v1/model.glb\" alt=\"Spearman Crimson (Medieval Siege and Castle Defence)\" 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/28867/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/28867/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28866","slug":"medieval-siege-and-castle-defence-spearman-green-9d56a337","title":"Spearman Green (Medieval Siege and Castle Defence)","summary":"The spearman in a green faction surcoat and shield.","description":"The same spearman in green faction colours on the surcoat and the shield face. Dimensions 1.06 × 3.02 × 0.66 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig. Cosmetic variant of spearman.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-spearman-green-9d56a337","cdnUrl":"https://cdn.3dassets.dev/assets/28866/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-spearman-green-9d56a337","thumbnailUrl":"https://cdn.3dassets.dev/assets/28866/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28866/v1/poster.webp","blurhash":"U46*aMoz00VY02n$~oSiH@RQyB%Kt*kCa1V@","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":17604,"triangles":300,"vertices":900,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.6282840371131897,0,-0.27587383568275986],"max":[0.42700591328628523,3.0199999809265137,0.38002386271942673]},"sizeMeters":[1.055,3.02,0.656],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:34.118Z","updatedAt":"2026-09-08T03:57:34.262Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28866/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function SpearmanGreenMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28866/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28866/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28866/v1/model.glb\" alt=\"Spearman Green (Medieval Siege and Castle Defence)\" 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/28866/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/28866/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28865","slug":"medieval-siege-and-castle-defence-archer-377dc2b3","title":"Archer (Medieval Siege and Castle Defence)","summary":"Longbow archer in a padded gambeson and bascinet, bow raised in the left hand with a back quiver of arrows.","description":"An archer at the shooting line: bascinet, padded gambeson, a longbow held out in the left hand and a quiver of five arrows at the hip. No mail and no shield, which is what an archer looks like from above. Dimensions 0.81 × 2.04 × 0.96 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-archer-377dc2b3","cdnUrl":"https://cdn.3dassets.dev/assets/28865/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-archer-377dc2b3","thumbnailUrl":"https://cdn.3dassets.dev/assets/28865/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28865/v1/poster.webp","blurhash":"U7Aw0M$%00Sht8xtxpIV00R-?wn#ITRjo#tR","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":19148,"triangles":320,"vertices":960,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-0.4450699153414549,0,-0.3099701044973639],"max":[0.36498779683025495,2.037261962890625,0.6549254066735769]},"sizeMeters":[0.81,2.037,0.965],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:34.071Z","updatedAt":"2026-09-08T03:57:34.185Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28865/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ArcherMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28865/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28865/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28865/v1/model.glb\" alt=\"Archer (Medieval Siege and Castle Defence)\" 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/28865/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/28865/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28868","slug":"medieval-siege-and-castle-defence-archer-red-be8d1831","title":"Archer Crimson (Medieval Siege and Castle Defence)","summary":"The archer in a crimson faction gambeson.","description":"The same archer in crimson faction colours on the gambeson and sleeves. Dimensions 0.81 × 2.04 × 0.96 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig. Cosmetic variant of archer.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-archer-red-be8d1831","cdnUrl":"https://cdn.3dassets.dev/assets/28868/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-archer-red-be8d1831","thumbnailUrl":"https://cdn.3dassets.dev/assets/28868/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28868/v1/poster.webp","blurhash":"U8BV-6xa00WUwhxttPIV0MWC}Zf$EMRkwLxa","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":19204,"triangles":320,"vertices":960,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-0.4450699153414549,0,-0.3099701044973639],"max":[0.36498779683025495,2.037261962890625,0.6549254066735769]},"sizeMeters":[0.81,2.037,0.965],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:34.141Z","updatedAt":"2026-09-08T03:57:34.278Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28868/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ArcherCrimsonMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28868/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28868/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28868/v1/model.glb\" alt=\"Archer Crimson (Medieval Siege and Castle Defence)\" 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/28868/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/28868/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28869","slug":"medieval-siege-and-castle-defence-crossbowman-7aac2cc9","title":"Crossbowman (Medieval Siege and Castle Defence)","summary":"Crossbowman spanning a windlass crossbow, with a bolt quiver at the belt and a pavise slung on the back.","description":"A crossbowman between shots: a spanned crossbow held level in both hands, a stirrup at the lath, a bolt quiver at the belt and a small pavise slung across the back, the way one is carried between the screen and the line. Dimensions 0.94 × 1.80 × 1.27 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-crossbowman-7aac2cc9","cdnUrl":"https://cdn.3dassets.dev/assets/28869/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-crossbowman-7aac2cc9","thumbnailUrl":"https://cdn.3dassets.dev/assets/28869/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28869/v1/poster.webp","blurhash":"U69a52D*00_2XUt6$xE200xt~qRPD$NHNh?F","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":24308,"triangles":424,"vertices":1272,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-0.490016958450916,0,-0.3529999852180481],"max":[0.4511594277840602,1.7999921281529756,0.9152628183364868]},"sizeMeters":[0.941,1.8,1.268],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:34.435Z","updatedAt":"2026-09-08T03:57:34.636Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28869/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CrossbowmanMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28869/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28869/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28869/v1/model.glb\" alt=\"Crossbowman (Medieval Siege and Castle Defence)\" 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/28869/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/28869/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28870","slug":"medieval-siege-and-castle-defence-man-at-arms-2d9af110","title":"Man at Arms (Medieval Siege and Castle Defence)","summary":"Armoured man at arms in a great helm, sword raised, heater shield forward over a mail hauberk and surcoat.","description":"The professional of the line: great helm with a vision slit, mail hauberk under a belted surcoat, a raised sword and a heater shield brought forward. Taller and heavier in silhouette than the levy spearman so the two read apart from above. Dimensions 1.25 × 2.50 × 0.75 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-man-at-arms-2d9af110","cdnUrl":"https://cdn.3dassets.dev/assets/28870/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-man-at-arms-2d9af110","thumbnailUrl":"https://cdn.3dassets.dev/assets/28870/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28870/v1/poster.webp","blurhash":"U46*jvXB00Z|02WU~ojd4TVr%%yE%Mt6IUM|","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":14464,"triangles":228,"vertices":684,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-0.6823161244392395,0,-0.32499434616687617],"max":[0.5699999928474426,2.5,0.42610875615108207]},"sizeMeters":[1.252,2.5,0.751],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:34.426Z","updatedAt":"2026-09-08T03:57:34.642Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28870/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ManAtArmsMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28870/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28870/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28870/v1/model.glb\" alt=\"Man at Arms (Medieval Siege and Castle Defence)\" 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/28870/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/28870/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28871","slug":"medieval-siege-and-castle-defence-man-at-arms-red-6d35e467","title":"Man at Arms Crimson (Medieval Siege and Castle Defence)","summary":"The man at arms in a crimson surcoat and shield.","description":"The same man at arms in crimson faction colours on the surcoat and the shield face. Dimensions 1.25 × 2.50 × 0.75 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig. Cosmetic variant of man-at-arms.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-man-at-arms-red-6d35e467","cdnUrl":"https://cdn.3dassets.dev/assets/28871/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-man-at-arms-red-6d35e467","thumbnailUrl":"https://cdn.3dassets.dev/assets/28871/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28871/v1/poster.webp","blurhash":"U57wTmw300G90Max~UfA0yNt=g-B$%t6EMM|","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":14520,"triangles":228,"vertices":684,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-0.6823161244392395,0,-0.32499434616687617],"max":[0.5699999928474426,2.5,0.42610875615108207]},"sizeMeters":[1.252,2.5,0.751],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:34.592Z","updatedAt":"2026-09-08T03:57:34.690Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28871/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ManAtArmsCrimsonMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28871/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28871/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28871/v1/model.glb\" alt=\"Man at Arms Crimson (Medieval Siege and Castle Defence)\" 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/28871/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/28871/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28873","slug":"medieval-siege-and-castle-defence-man-at-arms-green-aca4d993","title":"Man at Arms Green (Medieval Siege and Castle Defence)","summary":"The man at arms in a green surcoat and shield.","description":"The same man at arms in green faction colours on the surcoat and the shield face. Dimensions 1.25 × 2.50 × 0.75 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig. Cosmetic variant of man-at-arms.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-man-at-arms-green-aca4d993","cdnUrl":"https://cdn.3dassets.dev/assets/28873/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-man-at-arms-green-aca4d993","thumbnailUrl":"https://cdn.3dassets.dev/assets/28873/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28873/v1/poster.webp","blurhash":"U46*jkX800ix03WT~ojd8xVt%zyB%Kt7IWM{","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":14536,"triangles":228,"vertices":684,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-0.6823161244392395,0,-0.32499434616687617],"max":[0.5699999928474426,2.5,0.42610875615108207]},"sizeMeters":[1.252,2.5,0.751],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:35.874Z","updatedAt":"2026-09-08T03:57:36.066Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28873/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ManAtArmsGreenMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28873/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28873/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28873/v1/model.glb\" alt=\"Man at Arms Green (Medieval Siege and Castle Defence)\" 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/28873/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/28873/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28872","slug":"medieval-siege-and-castle-defence-mounted-knight-a8771064","title":"Mounted Knight (Medieval Siege and Castle Defence)","summary":"Knight on a caparisoned war horse, lance couched, three and a half metres to the helm crest.","description":"A knight at the walk on a caparisoned war horse, lance couched under the right arm and a shield on the left. Horse and rider are one static pose; a mounted charge needs skinning, and there is none anywhere in this library. Dimensions 1.24 × 3.52 × 3.86 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-mounted-knight-a8771064","cdnUrl":"https://cdn.3dassets.dev/assets/28872/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-mounted-knight-a8771064","thumbnailUrl":"https://cdn.3dassets.dev/assets/28872/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28872/v1/poster.webp","blurhash":"U597Id9a00-;t.NGe7%200tR~Wn3mjbJX.ad","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":20800,"triangles":344,"vertices":1032,"meshes":6,"materials":6,"textures":0,"animations":[],"boundingBox":{"min":[-0.6737609450863747,-0.00011196508141875228,-1.4401898384094238],"max":[0.5700337235974221,3.5200389060006354,2.4200000762939453]},"sizeMeters":[1.244,3.52,3.86],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:35.853Z","updatedAt":"2026-09-08T03:57:36.046Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28872/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function MountedKnightMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28872/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28872/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28872/v1/model.glb\" alt=\"Mounted Knight (Medieval Siege and Castle Defence)\" 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/28872/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/28872/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28874","slug":"medieval-siege-and-castle-defence-siege-crew-engineer-e6de505a","title":"Siege Crew Engineer (Medieval Siege and Castle Defence)","summary":"Engine crewman in a leather apron with a mallet and a measuring rod, no armour, reading as a worker not a soldier.","description":"The man who lays an engine. A hooded tunic, a leather apron, a mallet in one hand and a marked measuring rod in the other, with a tool roll at the belt. Unarmoured on purpose so a crew reads apart from a fighting line at an overhead camera. Dimensions 0.87 × 1.74 × 0.85 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-siege-crew-engineer-e6de505a","cdnUrl":"https://cdn.3dassets.dev/assets/28874/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-siege-crew-engineer-e6de505a","thumbnailUrl":"https://cdn.3dassets.dev/assets/28874/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28874/v1/poster.webp","blurhash":"U5A,n3$x00JX-=%LMx9H00It~V=?wEM~JF-m","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":14960,"triangles":248,"vertices":744,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-0.4447954297065735,0,-0.26002670296413527],"max":[0.42810142040252686,1.7400000095367432,0.5899653556677178]},"sizeMeters":[0.873,1.74,0.85],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:35.998Z","updatedAt":"2026-09-08T03:57:36.220Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28874/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function SiegeCrewEngineerMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28874/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28874/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28874/v1/model.glb\" alt=\"Siege Crew Engineer (Medieval Siege and Castle Defence)\" 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/28874/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/28874/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28876","slug":"medieval-siege-and-castle-defence-peasant-levy-02c84497","title":"Peasant Levy (Medieval Siege and Castle Defence)","summary":"Levy in a hood and jerkin with a billhook and a wicker shield, no mail, the cheapest body on a siege line.","description":"What a siege is mostly made of: a hooded jerkin, cross gartered legs, a billhook on a long haft and a round wicker shield. No mail and no helmet, so a levy reads instantly apart from a man at arms. Dimensions 1.18 × 2.66 × 0.63 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-peasant-levy-02c84497","cdnUrl":"https://cdn.3dassets.dev/assets/28876/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-peasant-levy-02c84497","thumbnailUrl":"https://cdn.3dassets.dev/assets/28876/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28876/v1/poster.webp","blurhash":"U78gZ^xt00IV9bWV-ooe00M|~p-oxuxZadIq","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":19380,"triangles":336,"vertices":1008,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.6800031389244258,0,-0.19997925992991328],"max":[0.4999847504621452,2.6600000858306885,0.42496773527418596]},"sizeMeters":[1.18,2.66,0.625],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:36.037Z","updatedAt":"2026-09-08T03:57:36.245Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28876/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function PeasantLevyMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28876/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28876/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28876/v1/model.glb\" alt=\"Peasant Levy (Medieval Siege and Castle Defence)\" 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/28876/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/28876/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28875","slug":"medieval-siege-and-castle-defence-banner-bearer-ba9fb5d5","title":"Banner Bearer (Medieval Siege and Castle Defence)","summary":"Standard bearer carrying a three and a half metre banner pole with a swallow-tailed field and a charge.","description":"The rally point of a company: a kettle hat and surcoat under a 3.4 m banner pole, with a hanging field, a swallow tail and a plain charge on the cloth. Tall enough to find in a crowd from an overhead camera. Dimensions 1.64 × 3.72 × 0.65 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-banner-bearer-ba9fb5d5","cdnUrl":"https://cdn.3dassets.dev/assets/28875/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-banner-bearer-ba9fb5d5","thumbnailUrl":"https://cdn.3dassets.dev/assets/28875/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28875/v1/poster.webp","blurhash":"U57UF.-:0001VtRQX7%L4TWA?wt7IWt7-pM{","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":18736,"triangles":316,"vertices":948,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-0.40304424051379223,0,-0.27574272102982134],"max":[1.2399995538223347,3.7200000286102295,0.3749363238301906]},"sizeMeters":[1.643,3.72,0.651],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:36.011Z","updatedAt":"2026-09-08T03:57:36.232Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28875/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function BannerBearerMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28875/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28875/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28875/v1/model.glb\" alt=\"Banner Bearer (Medieval Siege and Castle Defence)\" 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/28875/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/28875/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28877","slug":"medieval-siege-and-castle-defence-banner-bearer-red-6ffb9092","title":"Banner Bearer Crimson (Medieval Siege and Castle Defence)","summary":"The banner bearer under a crimson field.","description":"The same banner bearer in crimson faction colours on the surcoat and the banner field. Dimensions 1.64 × 3.72 × 0.65 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig. Cosmetic variant of banner-bearer.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-banner-bearer-red-6ffb9092","cdnUrl":"https://cdn.3dassets.dev/assets/28877/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-banner-bearer-red-6ffb9092","thumbnailUrl":"https://cdn.3dassets.dev/assets/28877/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28877/v1/poster.webp","blurhash":"U68g1?-o000MaLRkSg%L0zWB}tt7Ipof-oRj","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":18792,"triangles":316,"vertices":948,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-0.40304424051379223,0,-0.27574272102982134],"max":[1.2399995538223347,3.7200000286102295,0.3749363238301906]},"sizeMeters":[1.643,3.72,0.651],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:36.339Z","updatedAt":"2026-09-08T03:57:36.561Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28877/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function BannerBearerCrimsonMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28877/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28877/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28877/v1/model.glb\" alt=\"Banner Bearer Crimson (Medieval Siege and Castle Defence)\" 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/28877/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/28877/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28878","slug":"medieval-siege-and-castle-defence-defender-at-merlon-45fc9094","title":"Defender at the Merlon (Medieval Siege and Castle Defence)","summary":"Defender leaning out over a parapet with a crossbow, posed to sit against a merlon on a wall walk.","description":"A defender posed for a wall head: leaning forward over the parapet with a spanned crossbow braced on the stone and one foot back. Stands on a 1.4 m wall walk with the lean carrying his shoulders over the crenel. Dimensions 0.90 × 1.60 × 1.42 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-defender-at-merlon-45fc9094","cdnUrl":"https://cdn.3dassets.dev/assets/28878/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-defender-at-merlon-45fc9094","thumbnailUrl":"https://cdn.3dassets.dev/assets/28878/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28878/v1/poster.webp","blurhash":"U69%hm9b00?aEU-oxA9a00$*_2R5-24;NN~A","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":14388,"triangles":232,"vertices":696,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.45001128620160863,0,-0.4450261160860013],"max":[0.45001128620160863,1.600000023841858,0.9700024669721805]},"sizeMeters":[0.9,1.6,1.415],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:36.337Z","updatedAt":"2026-09-08T03:57:36.557Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28878/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function DefenderAtTheMerlonMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28878/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28878/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28878/v1/model.glb\" alt=\"Defender at the Merlon (Medieval Siege and Castle Defence)\" 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/28878/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/28878/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28879","slug":"medieval-siege-and-castle-defence-defender-hurling-sto-4980735d","title":"Defender Hurling a Stone (Medieval Siege and Castle Defence)","summary":"Defender at full stretch heaving a block over a parapet, both arms above the head.","description":"A defender in the act of dropping stone: both arms above the head with a dressed block held over them, weight on the front foot and the body arched back. The most legible defence pose there is at an overhead camera. Dimensions 0.76 × 2.36 × 0.73 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-defender-hurling-sto-4980735d","cdnUrl":"https://cdn.3dassets.dev/assets/28879/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-defender-hurling-sto-4980735d","thumbnailUrl":"https://cdn.3dassets.dev/assets/28879/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28879/v1/poster.webp","blurhash":"U6A,wV-;004m?wRk8_xa^iRj9bx]~on%8{bF","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":11132,"triangles":164,"vertices":492,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.3811700975567136,0,-0.4699612187095052],"max":[0.3811700975567136,2.3599931560528375,0.26499984441967134]},"sizeMeters":[0.762,2.36,0.735],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:36.534Z","updatedAt":"2026-09-08T03:57:36.717Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28879/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function DefenderHurlingAStoneMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28879/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28879/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28879/v1/model.glb\" alt=\"Defender Hurling a Stone (Medieval Siege and Castle Defence)\" 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/28879/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/28879/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28880","slug":"medieval-siege-and-castle-defence-ladder-climber-543c424a","title":"Ladder Climber (Medieval Siege and Castle Defence)","summary":"Attacker climbing at about seventy degrees, shield over the head, posed to sit on a scaling ladder.","description":"An attacker on the way up: body pitched to about seventy degrees with one hand on a rung, the other holding a shield over the head, and a sword at the hip. Built to sit on the hooked scaling ladder at any height, so place it against the rails rather than on the ground. Dimensions 0.85 × 2.02 × 1.36 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. Static geometry; no rig, animation, collision or navigation data. A static posed study, not a rigged character: there is no skeleton, no skinning and no clip, and animating one means driving it as a whole node or replacing it with your own rig.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-ladder-climber-543c424a","cdnUrl":"https://cdn.3dassets.dev/assets/28880/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-ladder-climber-543c424a","thumbnailUrl":"https://cdn.3dassets.dev/assets/28880/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28880/v1/poster.webp","blurhash":"U57BTDOu00$cyD%gV@8_00$x?cE5H=9Foz_4","category":{"slug":"characters","title":"Characters & Creatures"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":11532,"triangles":188,"vertices":564,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.41220854060458856,0,-0.8150366292328755],"max":[0.44149164693164544,2.0199999809265137,0.5435680999252975]},"sizeMeters":[0.854,2.02,1.359],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:37.822Z","updatedAt":"2026-09-08T03:57:37.961Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28880/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function LadderClimberMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28880/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28880/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28880/v1/model.glb\" alt=\"Ladder Climber (Medieval Siege and Castle Defence)\" 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/28880/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/28880/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28881","slug":"medieval-siege-and-castle-defence-siege-command-pavili-f3c08194","title":"Siege Command Pavilion (Medieval Siege and Castle Defence)","summary":"Round guyed marquee with a scalloped valance, a swinging door flap, a centre pole pennant and a map table under the eaves.","description":"The captain of the siege lives here. A twelve-sided round pavilion, 6.7 m across, with a cloth wall, a scalloped valance under the overhanging eaves, six guy ropes to their pegs, a pennant at the centre pole and a trestle map table and two campaign chests under the eaves. The door flap swings on the doorpost. Dimensions 9.10 × 4.63 × 8.03 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 open, close 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-siege-command-pavili-f3c08194","cdnUrl":"https://cdn.3dassets.dev/assets/28881/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-siege-command-pavili-f3c08194","thumbnailUrl":"https://cdn.3dassets.dev/assets/28881/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28881/v1/poster.webp","blurhash":"UBATs8x[00M{MxWBo}s.00RQ?wogo#oes+Wq","category":{"slug":"buildings","title":"Buildings & Architecture"},"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":39076,"triangles":696,"vertices":2088,"meshes":7,"materials":5,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-4.549912929534912,-0.0003342640775745309,-4.017259162095234],"max":[4.549912929534912,4.633586884774596,4.017259162095234]},"sizeMeters":[9.1,4.634,8.035],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:37.836Z","updatedAt":"2026-09-08T03:57:37.977Z","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/28881/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 SiegeCommandPavilionMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28881/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/28881/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28881/v1/model.glb\" alt=\"Siege Command Pavilion (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/28881/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/28881/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28884","slug":"medieval-siege-and-castle-defence-bell-tent-9ace24d9","title":"Bell Tent (Medieval Siege and Castle Defence)","summary":"Four man conical bell tent on a centre pole with six guy ropes, a pennant and a door flap that swings.","description":"The soldier tent of a siege camp: a ten-sided cone on a 3 m centre pole with a low cloth wall, six guy ropes to their pegs, a small pennant at the top and a door flap that swings on the doorpost. Sits at 4.6 m across the guys. Dimensions 4.59 × 3.24 × 4.51 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 open, close 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-bell-tent-9ace24d9","cdnUrl":"https://cdn.3dassets.dev/assets/28884/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-bell-tent-9ace24d9","thumbnailUrl":"https://cdn.3dassets.dev/assets/28884/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28884/v1/poster.webp","blurhash":"UA9aNyt700M{8_aex^oz00V@?wt7~qkDROV@","category":{"slug":"buildings","title":"Buildings & Architecture"},"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":20768,"triangles":340,"vertices":1020,"meshes":5,"materials":4,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-2.2966012954711914,-0.000041533423091433264,-2.2534265648577616],"max":[2.2966012954711914,3.240000009536743,2.2534265648577616]},"sizeMeters":[4.593,3.24,4.507],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:38.117Z","updatedAt":"2026-09-08T03:57:38.289Z","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/28884/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 BellTentMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28884/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/28884/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28884/v1/model.glb\" alt=\"Bell Tent (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/28884/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/28884/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28882","slug":"medieval-siege-and-castle-defence-bell-tent-open-88cc714a","title":"Bell Tent Open (Medieval Siege and Castle Defence)","summary":"The bell tent with its flap tied back, a straw pallet and a kit chest inside.","description":"The bell tent lived in: the flap is tied back against the wall, and a straw pallet and a kit chest are visible inside. The flap pose is baked into the geometry, so it stays still. Dimensions 4.59 × 3.24 × 4.53 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. Static geometry; no rig, animation, collision or navigation data. Functional variant of bell-tent.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-bell-tent-open-88cc714a","cdnUrl":"https://cdn.3dassets.dev/assets/28882/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-bell-tent-open-88cc714a","thumbnailUrl":"https://cdn.3dassets.dev/assets/28882/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28882/v1/poster.webp","blurhash":"UA9aKrtR00M{4naKx^kW00WB?ws;~qbvR5nh","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":21812,"triangles":364,"vertices":1092,"meshes":6,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-2.2966012954711914,-0.000041533423091433264,-2.2534265648577616],"max":[2.2966012954711914,3.240000009536743,2.2796458834300033]},"sizeMeters":[4.593,3.24,4.533],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:38.091Z","updatedAt":"2026-09-08T03:57:38.271Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28882/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function BellTentOpenMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28882/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28882/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28882/v1/model.glb\" alt=\"Bell Tent Open (Medieval Siege and Castle Defence)\" 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/28882/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/28882/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28883","slug":"medieval-siege-and-castle-defence-cook-fire-36b7d93b","title":"Camp Cook Fire (Medieval Siege and Castle Defence)","summary":"Iron tripod and cauldron over a ringed fire, with a log bench, a water butt and a stack of split wood.","description":"What a camp gathers round. An iron tripod carries a cauldron over a stone ringed fire of split logs, with a felled log bench, a water butt, a stack of firewood and two bowls on a board. The fire is geometry, not an effect: there is no light, no particle and no emissive flame anywhere in this library. Dimensions 4.84 × 1.83 × 3.88 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-cook-fire-36b7d93b","cdnUrl":"https://cdn.3dassets.dev/assets/28883/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-cook-fire-36b7d93b","thumbnailUrl":"https://cdn.3dassets.dev/assets/28883/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28883/v1/poster.webp","blurhash":"U9A0aYWY01W99Hj[-oWV00oI_2og~Vj?D*ah","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":47016,"triangles":884,"vertices":2652,"meshes":6,"materials":6,"textures":0,"animations":[],"boundingBox":{"min":[-2.4439475536346436,-0.00007530101964492442,-1.8461245788868343],"max":[2.4000000953674316,1.8324784840030435,2.0301068844268286]},"sizeMeters":[4.844,1.833,3.876],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:38.113Z","updatedAt":"2026-09-08T03:57:38.291Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28883/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CampCookFireMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28883/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28883/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28883/v1/model.glb\" alt=\"Camp Cook Fire (Medieval Siege and Castle Defence)\" 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/28883/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/28883/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28885","slug":"medieval-siege-and-castle-defence-siege-hand-cart-9da2fcdf","title":"Siege Hand Cart (Medieval Siege and Castle Defence)","summary":"Two-wheel hand cart with shafts down, loaded with dressed shot, a cask and lashed fascines; the wheels roll.","description":"The cart that keeps a battery fed. A planked two-wheel body with side rails and a pair of shafts resting on the ground, loaded with six dressed stone shot, a cask and two lashed fascines under a rope. Both wheels roll on their own axles. Dimensions 2.96 × 1.57 × 3.83 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 wheel-roll 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-siege-hand-cart-9da2fcdf","cdnUrl":"https://cdn.3dassets.dev/assets/28885/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-siege-hand-cart-9da2fcdf","thumbnailUrl":"https://cdn.3dassets.dev/assets/28885/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28885/v1/poster.webp","blurhash":"U8A,L4Ri01og~U9a9a?G02WF~BxX02^%^%9a","category":{"slug":"vehicles","title":"Vehicles"},"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":53756,"triangles":1112,"vertices":3336,"meshes":9,"materials":5,"textures":0,"animations":["wheel-roll"],"boundingBox":{"min":[-1.478000030517578,-0.00003139595580559096,-1.100000023841858],"max":[1.478000030517578,1.5666350565393017,2.7250969409942627]},"sizeMeters":[2.956,1.567,3.825],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:38.330Z","updatedAt":"2026-09-08T03:57:38.430Z","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/28885/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 SiegeHandCartMedievalSiegeAndCastleDefence(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/28885/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/28885/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28885/v1/model.glb\" alt=\"Siege Hand Cart (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/28885/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/28885/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"28887","slug":"medieval-siege-and-castle-defence-supply-stack-bb4146c6","title":"Lashed Supply Stack (Medieval Siege and Castle Defence)","summary":"Crates and casks stacked on a dunnage pallet under a tarpaulin, roped down against the weather.","description":"A siege camp store: five crates and three casks on a raised dunnage pallet, under a pegged tarpaulin roped down over the top and one corner turned back to show the load. Two metres square and chest high. Dimensions 3.60 × 1.94 × 2.17 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-supply-stack-bb4146c6","cdnUrl":"https://cdn.3dassets.dev/assets/28887/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-supply-stack-bb4146c6","thumbnailUrl":"https://cdn.3dassets.dev/assets/28887/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28887/v1/poster.webp","blurhash":"UCDl$c-;00W9K-o#rVjE00IV%MS5:gacOaNH","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":67084,"triangles":1316,"vertices":3948,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-1.7484999895095825,-0.00008004087951685168,-1.1484617704403544],"max":[1.8485000133514404,1.939972836661245,1.0249992678329658]},"sizeMeters":[3.597,1.94,2.173],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:38.374Z","updatedAt":"2026-09-08T03:57:38.614Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28887/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function LashedSupplyStackMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28887/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28887/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28887/v1/model.glb\" alt=\"Lashed Supply Stack (Medieval Siege and Castle Defence)\" 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/28887/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/28887/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28886","slug":"medieval-siege-and-castle-defence-camp-palisade-straig-b572dae9","title":"Camp Palisade 3 m (Medieval Siege and Castle Defence)","summary":"Three metre run of sharpened stakes driven into an earth bank, with two rear crossrails, on the 3 m camp grid.","description":"The line a besieging camp throws up round itself, which is a different thing from a castle fence: sharpened logs of uneven height driven into a low earth bank, tied with two crossrails on the inside face. West and east ports on the 3 m camp grid. Dimensions 3.22 × 2.76 × 1.30 m (X × Y × Z). Pivot on the grid origin with named connector ports. 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-camp-palisade-straig-b572dae9","cdnUrl":"https://cdn.3dassets.dev/assets/28886/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-camp-palisade-straig-b572dae9","thumbnailUrl":"https://cdn.3dassets.dev/assets/28886/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28886/v1/poster.webp","blurhash":"U5ELpJ~C00D%00=w_25S0OD*+sxt_M?a-o8|","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"slug":"kit","title":"Kit / Set"},{"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":23140,"triangles":432,"vertices":1296,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-1.6100000143051147,0.00004272889349860032,-0.6499069185460982],"max":[1.6100000143051147,2.759923102051792,0.6499069185460982]},"sizeMeters":[3.22,2.76,1.3],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:38.349Z","updatedAt":"2026-09-08T03:57:38.533Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28886/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CampPalisade3MMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28886/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28886/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28886/v1/model.glb\" alt=\"Camp Palisade 3 m (Medieval Siege and Castle Defence)\" 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/28886/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/28886/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28888","slug":"medieval-siege-and-castle-defence-camp-palisade-corner-5243a368","title":"Camp Palisade Corner (Medieval Siege and Castle Defence)","summary":"Right angle corner for the camp palisade, with a taller corner stake, turning the run through ninety degrees.","description":"The corner of the camp line: two half runs meeting at a right angle round one taller corner stake, on the same bank and rails. Ports face east and forward, so the run turns without a gap. Dimensions 2.26 × 3.00 × 2.25 m (X × Y × Z). Pivot on the grid origin with named connector ports. 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-camp-palisade-corner-5243a368","cdnUrl":"https://cdn.3dassets.dev/assets/28888/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-camp-palisade-corner-5243a368","thumbnailUrl":"https://cdn.3dassets.dev/assets/28888/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28888/v1/poster.webp","blurhash":"U5E2g-?t00My00IWyDn$02n$=wRk_LxGawtQ","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"slug":"kit","title":"Kit / Set"},{"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":28492,"triangles":540,"vertices":1620,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.6499999761581421,0.000006108899906986931,-0.6499999761581421],"max":[1.6099696409949873,3,1.5952276100712122]},"sizeMeters":[2.26,3,2.245],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:39.716Z","updatedAt":"2026-09-08T03:57:39.906Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28888/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CampPalisadeCornerMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28888/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28888/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28888/v1/model.glb\" alt=\"Camp Palisade Corner (Medieval Siege and Castle Defence)\" 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/28888/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/28888/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28889","slug":"medieval-siege-and-castle-defence-camp-palisade-gate-d454b50b","title":"Camp Palisade Gate (Medieval Siege and Castle Defence)","summary":"Gate bay in the camp palisade: a two metre clear opening between braced gateposts under a lintel and a banner.","description":"The way in and out of the camp: a 2 m clear opening between two braced gateposts under a heavy lintel with a hanging banner, in the same 3 m bank and rails as the straight run. Dimensions 3.22 × 3.56 × 1.63 m (X × Y × Z). Pivot on the grid origin with named connector ports. 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-camp-palisade-gate-d454b50b","cdnUrl":"https://cdn.3dassets.dev/assets/28889/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-camp-palisade-gate-d454b50b","thumbnailUrl":"https://cdn.3dassets.dev/assets/28889/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28889/v1/poster.webp","blurhash":"U6D+k[~V004U01xG-.E25SV@w{S6?D%e%gD+","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"slug":"kit","title":"Kit / Set"},{"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":14812,"triangles":252,"vertices":756,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-1.6100000143051147,0.00004272889349860032,-0.9782994736321267],"max":[1.6100000143051147,3.559997353474607,0.6499069185460982]},"sizeMeters":[3.22,3.56,1.628],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:39.728Z","updatedAt":"2026-09-08T03:57:39.910Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28889/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CampPalisadeGateMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28889/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28889/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28889/v1/model.glb\" alt=\"Camp Palisade Gate (Medieval Siege and Castle Defence)\" 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/28889/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/28889/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28892","slug":"medieval-siege-and-castle-defence-siege-camp-standard-290b2767","title":"Siege Camp Standard (Medieval Siege and Castle Defence)","summary":"Five metre guyed standard mast over a trophy pile of taken arms, marking the besiegers headquarters.","description":"The mark of the camp: a five metre mast on a stone weighted base, guyed on three ropes, carrying a long field and two pennants, over a trophy pile of taken spears, shields and helms leaned against the foot. Dimensions 3.98 × 5.77 × 3.92 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-siege-camp-standard-290b2767","cdnUrl":"https://cdn.3dassets.dev/assets/28892/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-siege-camp-standard-290b2767","thumbnailUrl":"https://cdn.3dassets.dev/assets/28892/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28892/v1/poster.webp","blurhash":"U69tDYjC00Oc01oz?uV?00WG~ps%xZR%xaxa","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":36936,"triangles":656,"vertices":1968,"meshes":7,"materials":7,"textures":0,"animations":[],"boundingBox":{"min":[-2.241939535191415,0,-2.0438208634515673],"max":[1.7427152140035274,5.767969608306885,1.8784160668512258]},"sizeMeters":[3.985,5.768,3.922],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:39.967Z","updatedAt":"2026-09-08T03:57:40.074Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28892/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function SiegeCampStandardMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28892/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28892/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28892/v1/model.glb\" alt=\"Siege Camp Standard (Medieval Siege and Castle Defence)\" 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/28892/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/28892/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28890","slug":"medieval-siege-and-castle-defence-dressed-shot-stack-7e25fdc1","title":"Dressed Shot Stack (Medieval Siege and Castle Defence)","summary":"Graded pyramid of dressed stone shot in a timber kerb, with a mason roughing out a blank beside it.","description":"The ammunition an engine is laid on. Fourteen dressed limestone shot in three grades, stacked in a pyramid inside a pegged timber kerb, with one part worked blank and a mason chisel and mallet on the ground beside it. Round and graded, which is what makes a machine repeatable. Dimensions 3.57 × 1.72 × 2.52 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-dressed-shot-stack-7e25fdc1","cdnUrl":"https://cdn.3dassets.dev/assets/28890/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-dressed-shot-stack-7e25fdc1","thumbnailUrl":"https://cdn.3dassets.dev/assets/28890/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28890/v1/poster.webp","blurhash":"U9CZFU~V00D%9HogxtIA004:~qx^^%f4R*.7","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":54488,"triangles":1052,"vertices":3156,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-1.2599999904632568,-0.000027967379018667415,-1.2599999904632568],"max":[2.3068723678588867,1.7200279959892482,1.2599999904632568]},"sizeMeters":[3.567,1.72,2.52],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:39.944Z","updatedAt":"2026-09-08T03:57:40.072Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28890/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function DressedShotStackMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28890/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28890/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28890/v1/model.glb\" alt=\"Dressed Shot Stack (Medieval Siege and Castle Defence)\" 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/28890/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/28890/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28891","slug":"medieval-siege-and-castle-defence-fascine-bundle-6f6823b9","title":"Fascine Bundle Stack (Medieval Siege and Castle Defence)","summary":"Six lashed brushwood fascines stacked in a cradle, the ditch filling and revetting a siege runs on.","description":"Brushwood cut, bound and stacked: six fascines two metres long, each lashed in three places, in a low timber cradle with two loose bundles and a coil of withy beside them. What a besieger fills a ditch and revets a battery with. Dimensions 4.44 × 1.01 × 1.78 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. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-fascine-bundle-6f6823b9","cdnUrl":"https://cdn.3dassets.dev/assets/28891/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-fascine-bundle-6f6823b9","thumbnailUrl":"https://cdn.3dassets.dev/assets/28891/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28891/v1/poster.webp","blurhash":"U8C$+J-n01NuNI^*s-D*00E3~Us,w]01Ne?a","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"medieval","title":"Medieval"},{"slug":"low-poly","title":"Low Poly"},{"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":66372,"triangles":1332,"vertices":3996,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-1.7899999618530273,0.000006547550309932149,-0.8925877646147018],"max":[2.6500000953674316,1.009993442912947,0.8841977850538143]},"sizeMeters":[4.44,1.01,1.777],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:39.922Z","updatedAt":"2026-09-08T03:57:40.020Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28891/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function FascineBundleStackMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28891/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28891/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28891/v1/model.glb\" alt=\"Fascine Bundle Stack (Medieval Siege and Castle Defence)\" 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/28891/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/28891/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"28895","slug":"medieval-siege-and-castle-defence-castle-639472aa-starter-scene","title":"Castle Wall Under Assault (Medieval Siege and Castle Defence)","summary":"Forty metres of defended curtain on the 4 m wall grid, with a barred gate, a cracked bay and an open breach in it. Timber hoardings bracket the wall head in two runs, defenders work the merlons over a pitch cauldron, braziers and stocked arrows, and a repair scaffold stands...","description":"Forty metres of defended curtain on the 4 m wall grid, with a barred gate, a cracked bay and an open breach in it. Timber hoardings bracket the wall head in two runs, defenders work the merlons over a pitch cauldron, braziers and stocked arrows, and a repair scaffold stands behind the breach. Below, the ram penthouse is at the gate, the siege tower is closing on the eastern wall and hooked ladders are on the stone with men climbing them. Back in the field the trebuchets, the mangonel and the springald shoot from behind gabions and mantlets with their crews, and the besiegers camp sits inside its own gated palisade at the rear.","status":"published","url":"https://3dassets.dev/assets/medieval-siege-and-castle-defence-castle-639472aa-starter-scene","cdnUrl":"https://cdn.3dassets.dev/assets/28895/v1/model.glb","downloadUrl":"https://3dassets.dev/download/medieval-siege-and-castle-defence-castle-639472aa-starter-scene","thumbnailUrl":"https://cdn.3dassets.dev/assets/28895/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/28895/v1/poster.webp","blurhash":"U8AmbnNG00w]IVRQobtR00xu~VNH-.x]t8Mw","category":{"slug":"environments","title":"Environments & Scenes"},"tags":[{"slug":"medieval","title":"Medieval"},{"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":1313892,"triangles":28904,"vertices":67012,"meshes":281,"materials":8,"textures":0,"animations":[],"boundingBox":{"min":[-22,-0.0003342640775745309,-6.359866537577422],"max":[18.245482490420386,9.12242603302002,34.017259162095236]},"sizeMeters":[40.245,9.123,40.377],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Fable 5.1","downloads":0,"publishedAt":"2026-09-08T03:57:40.779Z","updatedAt":"2026-09-08T03:57:40.984Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/28895/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CastleWallUnderAssaultMedievalSiegeAndCastleDefence(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/28895/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/28895/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/28895/v1/model.glb\" alt=\"Castle Wall Under Assault (Medieval Siege and Castle Defence)\" 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/28895/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/28895/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}}],"demo":null}}