{"data":{"id":257,"slug":"tennis-club-and-courts","title":"Tennis Club and Courts","summary":"A complete tennis club in a kit: court surface tiles in hard court blue and clay, the painted line set, a net that sags on its posts, fencing with a gate and windbreaks, rackets, balls, a ball machine, an umpire chair and a clubhouse of 4 m bays under a pitched roof.","description":"Build a tennis club and the courts it runs. The ground is a 6 m module: blue hard court tiles, a clay version of the same piece and a mown grass surround all carry the same four edge ports, so a court of any size tiles up inside a contrasting frame. Over it goes the full doubles line set, 10.97 by 23.77 m of baselines, tramlines, service lines and centre marks as one piece, a 12.8 m net that sags from 1.07 m at its steel posts to 0.914 m at the centre strap, and a pair of singles sticks. The enclosure is a 3 m fence bay: a plain mesh panel, a screened version carrying a windbreak and a gate whose leaf swings out of the court, all on the same ports, so a run closes round a court and a corner meets exactly. Court side there is an umpire chair with a ladder and a score desk, a scoreboard whose card tips over, a service speed board, a court number sign, slatted benches, players chairs under their own parasols, a litter bin, towels, bottles, sweatbands and a racket holdall. The gear is a racket modelled with a real hoop, throat, grip and woven string bed, a zipped cover version of it, a tennis ball and a coaching orange one, a twelve ball wire hopper, a nine ball basket and a ball machine whose throwing barrel spins. The club is a 4 m bay system: wall, window and entrance bays with a door that swings, gable ends that close a 6 m deep plan, roof slopes and ridge caps, with a terrace of round tables, chairs, parasols and planters, a three row spectator bleacher, an 8 m floodlight mast, a practice wall with targets painted on it, a mini court net, a coaching whiteboard, and the maintenance kit: a court roller and a line marking trolley whose wheels turn, and a net winder whose drum and crank turn together. Rigid node transform clips only, no skinning. The net cords, the tape and the centre strap, the windbreak screen, the racket strings, the parasol canopies and the towels are modelled solid and do not move: a rigid node transform cannot deform a mesh. Original AI assisted CC0 geometry; no club, tour, player or manufacturer marks appear anywhere.","url":"https://3dassets.dev/packs/tennis-club-and-courts","coverUrl":"https://cdn.3dassets.dev/assets/33649/v1/poster.webp","assetCount":46,"aiGenerated":true,"aiGeneratedAssetCount":46,"aiModels":["Claude Opus 5"],"aiModelUnspecifiedCount":0,"featured":true,"licenseLabel":"CC0 1.0 Universal","totalBytes":1759524,"totalTriangles":34308,"starterScene":{"id":"33649","slug":"tennis-club-and-courts-club-courts-and-t-578520e8-starter-scene","title":"Club Courts and Terrace (Tennis Club and Courts)","summary":"A working tennis club built from the kit: a full doubles court of blue surface tiles inside a green surround, with the painted line set over them, the net up between its posts and singles sticks in place. Court fencing rings it, windbreak screens along the back run and a gate...","description":"A working tennis club built from the kit: a full doubles court of blue surface tiles inside a green surround, with the painted line set over them, the net up between its posts and singles sticks in place. Court fencing rings it, windbreak screens along the back run and a gate on the clubhouse side, with the umpire chair, two benches, a pair of players chairs under their parasols, the scoreboard, the speed board and the bags, rackets, towels and bottles of a session down the east tramline. A ball machine feeds the far half beside its hopper and basket, and the roller, the line trolley and the net winder are parked by the gate. West of the court the clubhouse stands assembled from window, door and wall bays between two gable ends under a full pitched roof, with a terrace of tables, parasols, chairs and planters in front of it, and a clay mini court, its net, a coaching whiteboard and the practice wall fill the far corner. Floodlight masts stand at the four corners and bleachers face the court from outside the fence.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-club-courts-and-t-578520e8-starter-scene","cdnUrl":"https://cdn.3dassets.dev/assets/33649/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-club-courts-and-t-578520e8-starter-scene","thumbnailUrl":"https://cdn.3dassets.dev/assets/33649/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33649/v1/poster.webp","blurhash":"U6AU20x[00ERQnaeS~of00RQ_4$eqEbt,:ni","category":{"slug":"environments","title":"Environments & Scenes"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":808644,"triangles":16764,"vertices":38677,"meshes":145,"materials":8,"textures":0,"animations":[],"boundingBox":{"min":[-24,-0.00017242883348132787,-18.90010672593901],"max":[12.700106725939012,8.192842102050781,18]},"sizeMeters":[36.7,8.193,36.9],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:08.152Z","updatedAt":"2026-09-11T03:21:08.282Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33649/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ClubCourtsAndTerraceTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33649/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33649/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33649/v1/model.glb\" alt=\"Club Courts and Terrace (Tennis Club and Courts)\" 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/33649/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/33649/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},"assets":[{"id":"33604","slug":"tennis-club-and-courts-court-surface-tile-e72e9e6a","title":"Court Surface Tile (Tennis Club and Courts)","summary":"A 6 m square of blue acrylic hard court with faint squeegee bands, ported on all four edges so any number of them tile into a full playing surface.","description":"A 6 m square of blue acrylic hard court with faint squeegee bands, ported on all four edges so any number of them tile into a full playing surface. Dimensions 6.00 by 0.11 by 6.00 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Connectors: north (ground) at (0.00, 0.00, -3.00) facing (0, 0, -1); south (ground) at (0.00, 0.00, 3.00) facing (0, 0, 1); east (ground) at (3.00, 0.00, 0.00) facing (1, 0, 0); west (ground) at (-3.00, 0.00, 0.00) facing (-1, 0, 0). Ports sit at ground level on each edge midpoint, so two tiles butt at a shared edge with no gap and a court of any size tiles up. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-court-surface-tile-e72e9e6a","cdnUrl":"https://cdn.3dassets.dev/assets/33604/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-court-surface-tile-e72e9e6a","thumbnailUrl":"https://cdn.3dassets.dev/assets/33604/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33604/v1/poster.webp","blurhash":"U88#$#x]8wWVxva_WBkB00RO*0adIAj^ofWB","category":{"slug":"environments","title":"Environments & Scenes"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"slug":"modular","title":"Modular"},{"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":3968,"triangles":48,"vertices":144,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-3,-0.00017242883348132787,-3],"max":[3,0.10602133255733301,3]},"sizeMeters":[6,0.106,6],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:44.357Z","updatedAt":"2026-09-11T03:20:44.494Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33604/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CourtSurfaceTileTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33604/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33604/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33604/v1/model.glb\" alt=\"Court Surface Tile (Tennis Club and Courts)\" 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/33604/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/33604/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33605","slug":"tennis-club-and-courts-court-surface-tile-clay-c7fcadfc","title":"Court Surface Tile Clay (Tennis Club and Courts)","summary":"The same 6 m court module in crushed terracotta clay with brushed lines across it, for a clay court or a mini court beside a hard one.","description":"The same 6 m court module in crushed terracotta clay with brushed lines across it, for a clay court or a mini court beside a hard one. Dimensions 6.00 by 0.11 by 6.00 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Connectors: north (ground) at (0.00, 0.00, -3.00) facing (0, 0, -1); south (ground) at (0.00, 0.00, 3.00) facing (0, 0, 1); east (ground) at (3.00, 0.00, 0.00) facing (1, 0, 0); west (ground) at (-3.00, 0.00, 0.00) facing (-1, 0, 0). Ports sit at ground level on each edge midpoint, so two tiles butt at a shared edge with no gap and a court of any size tiles up. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data. Colour variant of court-surface-tile.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-court-surface-tile-clay-c7fcadfc","cdnUrl":"https://cdn.3dassets.dev/assets/33605/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-court-surface-tile-clay-c7fcadfc","thumbnailUrl":"https://cdn.3dassets.dev/assets/33605/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33605/v1/poster.webp","blurhash":"U9ELmO%L00e:-VbFR*oM00Io~VS19ajJofS1","category":{"slug":"environments","title":"Environments & Scenes"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"slug":"modular","title":"Modular"},{"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":3992,"triangles":48,"vertices":144,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-3,-0.00017242883348132787,-3],"max":[3,0.10602133255733301,3]},"sizeMeters":[6,0.106,6],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:43.344Z","updatedAt":"2026-09-11T03:20:43.456Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33605/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CourtSurfaceTileClayTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33605/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33605/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33605/v1/model.glb\" alt=\"Court Surface Tile Clay (Tennis Club and Courts)\" 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/33605/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/33605/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33607","slug":"tennis-club-and-courts-court-surround-tile-d75e5790","title":"Court Surround Tile (Tennis Club and Courts)","summary":"A 6 m square of mown grass surround on the same four ports as the court tile, so the playing surface can be framed in a contrasting colour.","description":"A 6 m square of mown grass surround on the same four ports as the court tile, so the playing surface can be framed in a contrasting colour. Dimensions 6.00 by 0.28 by 6.00 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Connectors: north (ground) at (0.00, 0.00, -3.00) facing (0, 0, -1); south (ground) at (0.00, 0.00, 3.00) facing (0, 0, 1); east (ground) at (3.00, 0.00, 0.00) facing (1, 0, 0); west (ground) at (-3.00, 0.00, 0.00) facing (-1, 0, 0). Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-court-surround-tile-d75e5790","cdnUrl":"https://cdn.3dassets.dev/assets/33607/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-court-surround-tile-d75e5790","thumbnailUrl":"https://cdn.3dassets.dev/assets/33607/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33607/v1/poster.webp","blurhash":"U89[G9x[00WCt7a#R%j?00RQ.kaxRPoJt7WC","category":{"slug":"environments","title":"Environments & Scenes"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"slug":"modular","title":"Modular"},{"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":21752,"triangles":432,"vertices":1296,"meshes":1,"materials":1,"textures":0,"animations":[],"boundingBox":{"min":[-3,0.00010315315807532532,-3],"max":[3,0.2798968480340176,3]},"sizeMeters":[6,0.28,6],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:44.399Z","updatedAt":"2026-09-11T03:20:44.506Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33607/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CourtSurroundTileTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33607/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33607/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33607/v1/model.glb\" alt=\"Court Surround Tile (Tennis Club and Courts)\" 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/33607/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/33607/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33606","slug":"tennis-club-and-courts-court-line-markings-d174ea58","title":"Court Line Markings (Tennis Club and Courts)","summary":"The full painted line set for one doubles court, 10.97 by 23.77 m on a 6 mm court blue base pad: baselines, tramlines, singles sidelines, both service lines, the centre service line and the baseline centre marks.","description":"The full painted line set for one doubles court, 10.97 by 23.77 m on a 6 mm court blue base pad: baselines, tramlines, singles sidelines, both service lines, the centre service line and the baseline centre marks. Dimensions 10.97 by 0.02 by 23.77 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. A single 18 mm thick piece laid over the surface tiles, origin at the centre of the court on the net line. The base pad is the court colour so the marked area reads on its own; lines are modelled as raised strips rather than painted into a texture, so the court reads the same in any renderer. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-court-line-markings-d174ea58","cdnUrl":"https://cdn.3dassets.dev/assets/33606/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-court-line-markings-d174ea58","thumbnailUrl":"https://cdn.3dassets.dev/assets/33606/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33606/v1/poster.webp","blurhash":"UA8r8+t8D4oMtRMwV@tl00RPyYbGR5.Ao#Mv","category":{"slug":"environments","title":"Environments & Scenes"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":8692,"triangles":144,"vertices":432,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-5.484575593155377,0.00009830008921815929,-11.885000228881836],"max":[5.484575593155377,0.017803399512364586,11.885000228881836]},"sizeMeters":[10.969,0.018,23.77],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:44.375Z","updatedAt":"2026-09-11T03:20:44.482Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33606/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CourtLineMarkingsTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33606/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33606/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33606/v1/model.glb\" alt=\"Court Line Markings (Tennis Club and Courts)\" 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/33606/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/33606/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33608","slug":"tennis-club-and-courts-tennis-net-and-posts-9d48dd1c","title":"Tennis Net And Posts (Tennis Club and Courts)","summary":"A full 12.8 m tennis net: square steel posts, a corded net sagging from 1.07 m at the posts to 0.914 m in the middle, a white top tape following the sag and a centre strap.","description":"A full 12.8 m tennis net: square steel posts, a corded net sagging from 1.07 m at the posts to 0.914 m in the middle, a white top tape following the sag and a centre strap. Dimensions 13.10 by 1.18 by 0.30 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. The cords, the tape and the centre strap are one solid lattice and never move: a rigid node transform cannot make a mesh hang or billow. Origin on the centre of the net line at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-tennis-net-and-posts-9d48dd1c","cdnUrl":"https://cdn.3dassets.dev/assets/33608/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-tennis-net-and-posts-9d48dd1c","thumbnailUrl":"https://cdn.3dassets.dev/assets/33608/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33608/v1/poster.webp","blurhash":"U47w?2%3IVt8_3~qofRk00-;_3Ri0000-:-;","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":136132,"triangles":2784,"vertices":8352,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-6.550000190734863,-0.00009373523356093205,-0.15032197465232144],"max":[6.550000190734863,1.1800936827814734,0.15032197465232144]},"sizeMeters":[13.1,1.18,0.301],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:46.246Z","updatedAt":"2026-09-11T03:20:46.450Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33608/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function TennisNetAndPostsTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33608/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33608/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33608/v1/model.glb\" alt=\"Tennis Net And Posts (Tennis Club and Courts)\" 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/33608/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/33608/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33609","slug":"tennis-club-and-courts-mini-court-net-6d9d5d5c","title":"Mini Court Net (Tennis Club and Courts)","summary":"A 6.1 m mini tennis net on lighter posts for a short court or a junior coaching grid, netted and taped the same way as the full net.","description":"A 6.1 m mini tennis net on lighter posts for a short court or a junior coaching grid, netted and taped the same way as the full net. Dimensions 6.40 by 0.96 by 0.30 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. The cords, the tape and the centre strap are one solid lattice and never move: a rigid node transform cannot make a mesh hang or billow. Origin on the centre of the net line at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data. Functional variant of tennis-net-and-posts, with its difference modelled rather than animated.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-mini-court-net-6d9d5d5c","cdnUrl":"https://cdn.3dassets.dev/assets/33609/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-mini-court-net-6d9d5d5c","thumbnailUrl":"https://cdn.3dassets.dev/assets/33609/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33609/v1/poster.webp","blurhash":"U58z.Jt8D$t7_3_NWCRj00?a_4IV0000-;%M","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":67540,"triangles":1356,"vertices":4068,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-3.200000047683716,-0.00009279415158297555,-0.15000458001166378],"max":[3.200000047683716,0.9600927726939108,0.15000458001166378]},"sizeMeters":[6.4,0.96,0.3],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:47.115Z","updatedAt":"2026-09-11T03:20:47.230Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33609/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function MiniCourtNetTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33609/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33609/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33609/v1/model.glb\" alt=\"Mini Court Net (Tennis Club and Courts)\" 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/33609/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/33609/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33610","slug":"tennis-club-and-courts-singles-stick-bc462e03","title":"Singles Stick (Tennis Club and Courts)","summary":"One 1.07 m singles stick on a flat foot, with the small white pad that props the net cord. Stand a pair 0.914 m outside each singles sideline.","description":"One 1.07 m singles stick on a flat foot, with the small white pad that props the net cord. Stand a pair 0.914 m outside each singles sideline. Dimensions 0.20 by 1.14 by 0.20 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-singles-stick-bc462e03","cdnUrl":"https://cdn.3dassets.dev/assets/33610/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-singles-stick-bc462e03","thumbnailUrl":"https://cdn.3dassets.dev/assets/33610/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33610/v1/poster.webp","blurhash":"U15}s:_30000t7s:RjM{R;k9xpjdM{WAxutS","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":4384,"triangles":48,"vertices":144,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.09998962245207374,0,-0.09998962245207374],"max":[0.09998962245207374,1.1399999856948853,0.09998962245207374]},"sizeMeters":[0.2,1.14,0.2],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:47.113Z","updatedAt":"2026-09-11T03:20:47.227Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33610/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function SinglesStickTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33610/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33610/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33610/v1/model.glb\" alt=\"Singles Stick (Tennis Club and Courts)\" 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/33610/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/33610/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33611","slug":"tennis-club-and-courts-court-fence-panel-1f1853af","title":"Court Fence Panel (Tennis Club and Courts)","summary":"A 3 m bay of 3 m high court fencing: charcoal end posts, three rails and a steel wire mesh, ported on both ends so bays run into a full enclosure.","description":"A 3 m bay of 3 m high court fencing: charcoal end posts, three rails and a steel wire mesh, ported on both ends so bays run into a full enclosure. Dimensions 3.08 by 3.00 by 0.08 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Connectors: left (fence) at (-1.50, 0.00, 0.00) facing (-1, 0, 0); right (fence) at (1.50, 0.00, 0.00) facing (1, 0, 0). Ports sit on the end posts at ground level, so bays butt into a continuous run round a court. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-court-fence-panel-1f1853af","cdnUrl":"https://cdn.3dassets.dev/assets/33611/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-court-fence-panel-1f1853af","thumbnailUrl":"https://cdn.3dassets.dev/assets/33611/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33611/v1/poster.webp","blurhash":"U5AdDytS00RP.8.8My8_00of~qRjIBs;xbRi","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"slug":"modular","title":"Modular"},{"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":16744,"triangles":312,"vertices":936,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-1.5399999618530273,0.00004276306835038213,-0.04004272492137759],"max":[1.5399999618530273,2.9999572369316496,0.04004272492137759]},"sizeMeters":[3.08,3,0.08],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:47.134Z","updatedAt":"2026-09-11T03:20:47.246Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33611/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CourtFencePanelTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33611/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33611/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33611/v1/model.glb\" alt=\"Court Fence Panel (Tennis Club and Courts)\" 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/33611/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/33611/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33612","slug":"tennis-club-and-courts-court-windbreak-panel-0dae07f5","title":"Court Windbreak Panel (Tennis Club and Courts)","summary":"The same 3 m fence bay with a blue windbreak screen tied over its lower 1.85 m, the band of club colour that backs a court and keeps the wind off it.","description":"The same 3 m fence bay with a blue windbreak screen tied over its lower 1.85 m, the band of club colour that backs a court and keeps the wind off it. Dimensions 3.08 by 3.00 by 0.11 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Connectors: left (fence) at (-1.50, 0.00, 0.00) facing (-1, 0, 0); right (fence) at (1.50, 0.00, 0.00) facing (1, 0, 0). The windbreak is a solid sheet tied to the wires and does not billow: a rigid node transform cannot deform a mesh. Ports match the plain panel, so screened and open bays mix in one run. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data. Functional variant of court-fence-panel, with its difference modelled rather than animated.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-court-windbreak-panel-0dae07f5","cdnUrl":"https://cdn.3dassets.dev/assets/33612/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-court-windbreak-panel-0dae07f5","thumbnailUrl":"https://cdn.3dassets.dev/assets/33612/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33612/v1/poster.webp","blurhash":"UAAnJ?Sj00V@m*-=OGDi4TaI.TXnX:V@wGX9","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"slug":"modular","title":"Modular"},{"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":19240,"triangles":348,"vertices":1044,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-1.5399999618530273,0.00004276306835038213,-0.04002221718987147],"max":[1.5399999618530273,2.9999572369316496,0.07202221498449962]},"sizeMeters":[3.08,3,0.112],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:49.074Z","updatedAt":"2026-09-11T03:20:49.212Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33612/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CourtWindbreakPanelTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33612/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33612/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33612/v1/model.glb\" alt=\"Court Windbreak Panel (Tennis Club and Courts)\" 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/33612/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/33612/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33613","slug":"tennis-club-and-courts-court-fence-gate-075b8591","title":"Court Fence Gate (Tennis Club and Courts)","summary":"A 3 m fence bay with a 2.1 m mesh gate in it: the same posts and rails as the plain panel, a mesh light over the head and a single leaf that swings out of the court.","description":"A 3 m fence bay with a 2.1 m mesh gate in it: the same posts and rails as the plain panel, a mesh light over the head and a single leaf that swings out of the court. Dimensions 3.08 by 3.00 by 0.17 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Animated pivot nodes: gate at (-1.46, 0.02, 0.05) m. Connectors: left (fence) at (-1.50, 0.00, 0.00) facing (-1, 0, 0); right (fence) at (1.50, 0.00, 0.00) facing (1, 0, 0). The leaf is hinged on the left jamb and swings outwards. Ports match the plain fence panel, so the gate drops into any run. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-court-fence-gate-075b8591","cdnUrl":"https://cdn.3dassets.dev/assets/33613/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-court-fence-gate-075b8591","thumbnailUrl":"https://cdn.3dassets.dev/assets/33613/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33613/v1/poster.webp","blurhash":"U48Nz*D%00xv_4WVD%i_4-oz-pt6D$%go#9E","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"slug":"modular","title":"Modular"},{"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":27328,"triangles":516,"vertices":1548,"meshes":4,"materials":2,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.5399999618530273,0.00004276306835038213,-0.04004272492137759],"max":[1.5399999618530273,2.9999572369316496,0.1350395108224962]},"sizeMeters":[3.08,3,0.175],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:49.897Z","updatedAt":"2026-09-11T03:20:50.112Z","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/33613/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 CourtFenceGateTennisClubAndCourts(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/33613/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/33613/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33613/v1/model.glb\" alt=\"Court Fence Gate (Tennis Club and Courts)\" 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/33613/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/33613/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"33615","slug":"tennis-club-and-courts-court-number-sign-de764f75","title":"Court Number Sign (Tennis Club and Courts)","summary":"A 1.55 m twin post court number sign: a blue board with a white face, a blank square for the number and a bar below it for the court name or a booking rule.","description":"A 1.55 m twin post court number sign: a blue board with a white face, a blank square for the number and a bar below it for the court name or a booking rule. Dimensions 0.86 by 1.55 by 0.10 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. The number square and the bar are blank blocks, so any court number can be written on them without re-rendering the model. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-court-number-sign-de764f75","cdnUrl":"https://cdn.3dassets.dev/assets/33615/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-court-number-sign-de764f75","thumbnailUrl":"https://cdn.3dassets.dev/assets/33615/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33615/v1/poster.webp","blurhash":"UF9*4Cxt00Mz?wt7DhM{NGt8s.M_M_ohxvRO","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":7408,"triangles":96,"vertices":288,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.4300000071525574,0,-0.03460798974578082],"max":[0.4300000071525574,1.5499905241528207,0.07000511260327744]},"sizeMeters":[0.86,1.55,0.105],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:49.083Z","updatedAt":"2026-09-11T03:20:49.214Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33615/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CourtNumberSignTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33615/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33615/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33615/v1/model.glb\" alt=\"Court Number Sign (Tennis Club and Courts)\" 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/33615/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/33615/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33614","slug":"tennis-club-and-courts-tennis-racket-ba639ca5","title":"Tennis Racket (Tennis Club and Courts)","summary":"A 0.69 m tennis racket lying face up: a moulded butt cap and wrapped grip, a shaft that forks through the throat into an elliptical hoop, and a woven string bed of mains over crosses.","description":"A 0.69 m tennis racket lying face up: a moulded butt cap and wrapped grip, a shaft that forks through the throat into an elliptical hoop, and a woven string bed of mains over crosses. Dimensions 0.31 by 0.04 by 0.67 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. The strings are modelled as two layers of thin solids 3 mm apart rather than as a texture, so the weave reads close up. They are rigid geometry and never flex. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-tennis-racket-ba639ca5","cdnUrl":"https://cdn.3dassets.dev/assets/33614/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-tennis-racket-ba639ca5","thumbnailUrl":"https://cdn.3dassets.dev/assets/33614/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33614/v1/poster.webp","blurhash":"U77Bo^?w4T9FVtMxjYx]00DO?w-=x].8bJD$","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":27480,"triangles":520,"vertices":1560,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.1538464813746011,0.000004395979662695504,-0.3529999852180481],"max":[0.1538464813746011,0.03599560247061654,0.3188973367214203]},"sizeMeters":[0.308,0.036,0.672],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:49.885Z","updatedAt":"2026-09-11T03:20:50.093Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33614/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function TennisRacketTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33614/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33614/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33614/v1/model.glb\" alt=\"Tennis Racket (Tennis Club and Courts)\" 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/33614/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/33614/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33617","slug":"tennis-club-and-courts-tennis-racket-in-cover-1cc8a05c","title":"Tennis Racket In Cover (Tennis Club and Courts)","summary":"The same racket zipped into a padded head cover with a carry strap, for a bag left by the bench or a spare on the bleacher.","description":"The same racket zipped into a padded head cover with a carry strap, for a bag left by the bench or a spare on the bleacher. Dimensions 0.36 by 0.09 by 0.70 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. The cover is modelled closed over the hoop and throat; the grip stays exposed. Nothing unzips, because that is cloth and not a rigid node. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data. Functional variant of tennis-racket, with its difference modelled rather than animated.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-tennis-racket-in-cover-1cc8a05c","cdnUrl":"https://cdn.3dassets.dev/assets/33617/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-tennis-racket-in-cover-1cc8a05c","thumbnailUrl":"https://cdn.3dassets.dev/assets/33617/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33617/v1/poster.webp","blurhash":"U35=Lk_N008_Z~MxW?tm004n_N?HcG%$skH=","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":34236,"triangles":644,"vertices":1932,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.1807021477551908,0.000002720270824409232,-0.3529999852180481],"max":[0.1807021477551908,0.08536101796798709,0.3476351201534271]},"sizeMeters":[0.361,0.085,0.701],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:50.839Z","updatedAt":"2026-09-11T03:20:50.948Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33617/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function TennisRacketInCoverTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33617/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33617/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33617/v1/model.glb\" alt=\"Tennis Racket In Cover (Tennis Club and Courts)\" 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/33617/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/33617/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33616","slug":"tennis-club-and-courts-tennis-ball-0f02a733","title":"Tennis Ball (Tennis Club and Courts)","summary":"A single tennis ball at real scale, 67 mm across, in the usual fluorescent yellow with a white seam band round it.","description":"A single tennis ball at real scale, 67 mm across, in the usual fluorescent yellow with a white seam band round it. Dimensions 0.07 by 0.07 by 0.07 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-tennis-ball-0f02a733","cdnUrl":"https://cdn.3dassets.dev/assets/33616/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-tennis-ball-0f02a733","thumbnailUrl":"https://cdn.3dassets.dev/assets/33616/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33616/v1/poster.webp","blurhash":"UFE3Fg-.00IU?aoeD*ax00IV~oxu9HWC%La#","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":7128,"triangles":112,"vertices":336,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-0.033763401210308075,0,-0.033763401210308075],"max":[0.033763401210308075,0.06700000166893005,0.033763401210308075]},"sizeMeters":[0.068,0.067,0.068],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:51.842Z","updatedAt":"2026-09-11T03:20:51.984Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33616/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function TennisBallTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33616/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33616/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33616/v1/model.glb\" alt=\"Tennis Ball (Tennis Club and Courts)\" 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/33616/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/33616/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33619","slug":"tennis-club-and-courts-tennis-ball-practice-9f7b8863","title":"Tennis Ball Practice (Tennis Club and Courts)","summary":"The same ball in coaching orange: the low compression ball used on a mini court, so a practice grid reads apart from match play.","description":"The same ball in coaching orange: the low compression ball used on a mini court, so a practice grid reads apart from match play. Dimensions 0.07 by 0.07 by 0.07 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data. Colour variant of tennis-ball.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-tennis-ball-practice-9f7b8863","cdnUrl":"https://cdn.3dassets.dev/assets/33619/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-tennis-ball-practice-9f7b8863","thumbnailUrl":"https://cdn.3dassets.dev/assets/33619/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33619/v1/poster.webp","blurhash":"UFD+SZ%L00IV?GoeE2af00M|~Bxt9aWC%1bH","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":7160,"triangles":112,"vertices":336,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-0.033763401210308075,0,-0.033763401210308075],"max":[0.033763401210308075,0.06700000166893005,0.033763401210308075]},"sizeMeters":[0.068,0.067,0.068],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:52.754Z","updatedAt":"2026-09-11T03:20:52.902Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33619/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function TennisBallPracticeTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33619/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33619/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33619/v1/model.glb\" alt=\"Tennis Ball Practice (Tennis Club and Courts)\" 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/33619/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/33619/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33618","slug":"tennis-club-and-courts-ball-hopper-3c8f620f","title":"Ball Hopper (Tennis Club and Courts)","summary":"A 0.78 m wire ball hopper holding twelve balls, on a square frame with a carry handle over the top: the tube a coach picks a court up with.","description":"A 0.78 m wire ball hopper holding twelve balls, on a square frame with a carry handle over the top: the tube a coach picks a court up with. Dimensions 0.26 by 0.79 by 0.25 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. The balls are modelled into the hopper as one solid piece and do not fall out or roll. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-ball-hopper-3c8f620f","cdnUrl":"https://cdn.3dassets.dev/assets/33618/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-ball-hopper-3c8f620f","thumbnailUrl":"https://cdn.3dassets.dev/assets/33618/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33618/v1/poster.webp","blurhash":"U49aKltQ00IBxcaeR$oz01f+~ojFRPoJozWY","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":79268,"triangles":1584,"vertices":4752,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.13000189144315874,0,-0.12499527459789699],"max":[0.13000189144315874,0.7919999957084656,0.12499527459789699]},"sizeMeters":[0.26,0.792,0.25],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:51.725Z","updatedAt":"2026-09-11T03:20:51.846Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33618/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function BallHopperTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33618/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33618/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33618/v1/model.glb\" alt=\"Ball Hopper (Tennis Club and Courts)\" 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/33618/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/33618/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33620","slug":"tennis-club-and-courts-ball-basket-44558d1f","title":"Ball Basket (Tennis Club and Courts)","summary":"A 0.5 m wire ball basket on splayed legs with nine balls in it, the open tray a coach feeds a drill from and leaves at the service line.","description":"A 0.5 m wire ball basket on splayed legs with nine balls in it, the open tray a coach feeds a drill from and leaves at the service line. Dimensions 0.55 by 0.53 by 0.43 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-ball-basket-44558d1f","cdnUrl":"https://cdn.3dassets.dev/assets/33620/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-ball-basket-44558d1f","thumbnailUrl":"https://cdn.3dassets.dev/assets/33620/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33620/v1/poster.webp","blurhash":"UFCGZ0xu4Us;~qxvDiM{D*ofM{RPIUof%LWB","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":79008,"triangles":1580,"vertices":4740,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.2713262438774109,0.000010584898673393628,-0.21271667366378252],"max":[0.27399998903274536,0.5299591073315513,0.21271667366378252]},"sizeMeters":[0.545,0.53,0.425],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:53.553Z","updatedAt":"2026-09-11T03:20:53.778Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33620/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function BallBasketTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33620/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33620/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33620/v1/model.glb\" alt=\"Ball Basket (Tennis Club and Courts)\" 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/33620/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/33620/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33621","slug":"tennis-club-and-courts-ball-machine-a177b690","title":"Ball Machine (Tennis Club and Courts)","summary":"A 0.86 m court side ball machine: a charcoal body on fixed castors, a mesh hopper of balls on top, a control panel at the back and a throwing barrel that spins.","description":"A 0.86 m court side ball machine: a charcoal body on fixed castors, a mesh hopper of balls on top, a control panel at the back and a throwing barrel that spins. Dimensions 0.52 by 0.88 by 0.85 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Animated pivot nodes: barrel at (0.00, 0.52, 0.38) m. The barrel is the drum, its side plates and the two feed paddles on one node, pivoted on the axle 0.52 m up at the front. The castors are modelled solid and do not turn; the balls in the hopper are one piece with it. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Rigid node-transform clips: spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-ball-machine-a177b690","cdnUrl":"https://cdn.3dassets.dev/assets/33621/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-ball-machine-a177b690","thumbnailUrl":"https://cdn.3dassets.dev/assets/33621/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33621/v1/poster.webp","blurhash":"UFA,^7ay00Rj_NRjD%t7IAM{bcxuIAa|ozof","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":106672,"triangles":2096,"vertices":6288,"meshes":8,"materials":5,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.2600085555144646,-0.000008565051207776175,-0.36500000953674316],"max":[0.2600085555144646,0.8769999742507935,0.49000397922797745]},"sizeMeters":[0.52,0.877,0.855],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:53.437Z","updatedAt":"2026-09-11T03:20:53.558Z","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/33621/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 BallMachineTennisClubAndCourts(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/33621/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/33621/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33621/v1/model.glb\" alt=\"Ball Machine (Tennis Club and Courts)\" 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/33621/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/33621/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"33622","slug":"tennis-club-and-courts-umpire-chair-0422214d","title":"Umpire Chair (Tennis Club and Courts)","summary":"A 2.5 m umpire chair: a splayed steel frame with a ladder up the front, a timber seat and back 1.95 m up, armrests and a small score desk across the lap.","description":"A 2.5 m umpire chair: a splayed steel frame with a ladder up the front, a timber seat and back 1.95 m up, armrests and a small score desk across the lap. Dimensions 0.74 by 2.54 by 0.77 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Origin on the footprint centre at ground level. The chair does not fold or adjust; the seat, desk and ladder are one static piece. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-umpire-chair-0422214d","cdnUrl":"https://cdn.3dassets.dev/assets/33622/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-umpire-chair-0422214d","thumbnailUrl":"https://cdn.3dassets.dev/assets/33622/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33622/v1/poster.webp","blurhash":"U5ATZc-;004n~8ai0ht1McR-krxUxZNGNH%L","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":15740,"triangles":276,"vertices":828,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.37201183800236454,0,-0.3676498891993169],"max":[0.37201183800236454,2.5416998863220215,0.40002558252054493]},"sizeMeters":[0.744,2.542,0.768],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:53.857Z","updatedAt":"2026-09-11T03:20:53.986Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33622/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function UmpireChairTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33622/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33622/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33622/v1/model.glb\" alt=\"Umpire Chair (Tennis Club and Courts)\" 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/33622/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/33622/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33623","slug":"tennis-club-and-courts-service-speed-board-4e7f0cd9","title":"Service Speed Board (Tennis Club and Courts)","summary":"A 2.2 m service speed board on a steel post: a charcoal case with a blue face, two blank white digit panels and a yellow label bar under them.","description":"A 2.2 m service speed board on a steel post: a charcoal case with a blue face, two blank white digit panels and a yellow label bar under them. Dimensions 0.70 by 2.10 by 0.50 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. The digit panels are blank blocks, so any number can be drawn on them in a material or a texture without changing the mesh. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-service-speed-board-4e7f0cd9","cdnUrl":"https://cdn.3dassets.dev/assets/33623/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-service-speed-board-4e7f0cd9","thumbnailUrl":"https://cdn.3dassets.dev/assets/33623/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33623/v1/poster.webp","blurhash":"U46*m--:004U_Nxu8_9G.9t8I9MxE2a~-oj;","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":7856,"triangles":104,"vertices":312,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-0.349957258194102,0,-0.24994658125757674],"max":[0.349957258194102,2.0999999046325684,0.24994658125757674]},"sizeMeters":[0.7,2.1,0.5],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:54.576Z","updatedAt":"2026-09-11T03:20:54.702Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33623/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ServiceSpeedBoardTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33623/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33623/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33623/v1/model.glb\" alt=\"Service Speed Board (Tennis Club and Courts)\" 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/33623/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/33623/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33624","slug":"tennis-club-and-courts-court-scoreboard-b636b534","title":"Court Scoreboard (Tennis Club and Courts)","summary":"A 1.95 m court scoreboard on two posts: a charcoal case with a name strip, four blue set panels, a yellow rule and one white score card that tips forward on its top hinge.","description":"A 1.95 m court scoreboard on two posts: a charcoal case with a name strip, four blue set panels, a yellow rule and one white score card that tips forward on its top hinge. Dimensions 1.30 by 1.94 by 0.24 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Animated pivot nodes: flap at (0.45, 1.55, 0.06) m. Only the right hand card is hinged; the rest of the numbers are flat panels meant to be re-materialled. Nothing about the board reads a real score. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Rigid node-transform clips: tilt. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-court-scoreboard-b636b534","cdnUrl":"https://cdn.3dassets.dev/assets/33624/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-court-scoreboard-b636b534","thumbnailUrl":"https://cdn.3dassets.dev/assets/33624/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33624/v1/poster.webp","blurhash":"U897nm%M00IU_N%M9ED%V@oebbRQIAt6%gM{","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":12016,"triangles":156,"vertices":468,"meshes":7,"materials":5,"textures":0,"animations":["tilt"],"boundingBox":{"min":[-0.6500216873141704,0,-0.119951173922808],"max":[0.6500216873141704,1.940000057220459,0.119951173922808]},"sizeMeters":[1.3,1.94,0.24],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:55.214Z","updatedAt":"2026-09-11T03:20:55.396Z","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/33624/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 CourtScoreboardTennisClubAndCourts(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/33624/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/33624/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33624/v1/model.glb\" alt=\"Court Scoreboard (Tennis Club and Courts)\" 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/33624/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/33624/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"33625","slug":"tennis-club-and-courts-court-towel-e7534f8c","title":"Court Towel (Tennis Club and Courts)","summary":"A folded court towel 0.42 m across, three layers of terry in club blue and white, for a chair back or the bench at a changeover.","description":"A folded court towel 0.42 m across, three layers of terry in club blue and white, for a chair back or the bench at a changeover. Dimensions 0.42 by 0.16 by 0.30 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Folded geometry: the towel cannot be unfolded, draped or animated, because a rigid node transform cannot deform a mesh. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-court-towel-e7534f8c","cdnUrl":"https://cdn.3dassets.dev/assets/33625/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-court-towel-e7534f8c","thumbnailUrl":"https://cdn.3dassets.dev/assets/33625/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33625/v1/poster.webp","blurhash":"U7G+gu~q00M{^+?bIpIU00D%-;M{01IA-nIU","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":3476,"triangles":36,"vertices":108,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-0.20999999344348907,0.00001068218756221373,-0.15000640420356778],"max":[0.20999999344348907,0.15998931423615909,0.15000640420356778]},"sizeMeters":[0.42,0.16,0.3],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:55.371Z","updatedAt":"2026-09-11T03:20:55.516Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33625/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CourtTowelTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33625/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33625/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33625/v1/model.glb\" alt=\"Court Towel (Tennis Club and Courts)\" 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/33625/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/33625/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33626","slug":"tennis-club-and-courts-sports-bag-73697f1c","title":"Sports Bag (Tennis Club and Courts)","summary":"A 0.94 m racket holdall: a charcoal duffel with a rounded top and blue end caps, a front pocket with a yellow zip and twin grab handles, for a bench end or a chair side.","description":"A 0.94 m racket holdall: a charcoal duffel with a rounded top and blue end caps, a front pocket with a yellow zip and twin grab handles, for a bench end or a chair side. Dimensions 0.94 by 0.43 by 0.36 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-sports-bag-73697f1c","cdnUrl":"https://cdn.3dassets.dev/assets/33626/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-sports-bag-73697f1c","thumbnailUrl":"https://cdn.3dassets.dev/assets/33626/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33626/v1/poster.webp","blurhash":"U797|p%f4nR5aJ.TtRM{00M{-;x^XnDNMxi_","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":13612,"triangles":232,"vertices":696,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.4699999988079071,-0.0000025832497881073113,-0.14998299204999777],"max":[0.4699999988079071,0.433002581580858,0.21499679913265637]},"sizeMeters":[0.94,0.433,0.365],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:55.543Z","updatedAt":"2026-09-11T03:20:55.645Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33626/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function SportsBagTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33626/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33626/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33626/v1/model.glb\" alt=\"Sports Bag (Tennis Club and Courts)\" 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/33626/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/33626/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33627","slug":"tennis-club-and-courts-water-bottle-abd2477f","title":"Water Bottle (Tennis Club and Courts)","summary":"A 0.3 m sports water bottle in club blue with a charcoal push pull cap and a blank white label panel, for a bench, a bag or a chair side.","description":"A 0.3 m sports water bottle in club blue with a charcoal push pull cap and a blank white label panel, for a bench, a bag or a chair side. Dimensions 0.08 by 0.29 by 0.08 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-water-bottle-abd2477f","cdnUrl":"https://cdn.3dassets.dev/assets/33627/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-water-bottle-abd2477f","thumbnailUrl":"https://cdn.3dassets.dev/assets/33627/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33627/v1/poster.webp","blurhash":"U785D:?b0000L}Rju5x[00E1?w^+={%2E%E2","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":9964,"triangles":156,"vertices":468,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.03999999910593033,0,-0.036135364757128204],"max":[0.03999999910593033,0.29499998688697815,0.040500076881142565]},"sizeMeters":[0.08,0.295,0.077],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:56.436Z","updatedAt":"2026-09-11T03:20:56.551Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33627/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function WaterBottleTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33627/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33627/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33627/v1/model.glb\" alt=\"Water Bottle (Tennis Club and Courts)\" 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/33627/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/33627/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33629","slug":"tennis-club-and-courts-sweatband-set-9948ba03","title":"Sweatband Set (Tennis Club and Courts)","summary":"A headband and two wristbands in white towelling with a blue tab on each, laid out together for a bag, a bench or a locker shelf.","description":"A headband and two wristbands in white towelling with a blue tab on each, laid out together for a bag, a bench or a locker shelf. Dimensions 0.39 by 0.04 by 0.26 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-sweatband-set-9948ba03","cdnUrl":"https://cdn.3dassets.dev/assets/33629/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-sweatband-set-9948ba03","thumbnailUrl":"https://cdn.3dassets.dev/assets/33629/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33629/v1/poster.webp","blurhash":"UBCGV@Rj00M{%M%MayD%00xu~qj[9FD%j@?c","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":468,"vertices":1404,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-0.2370000034570694,0.000006016537219228485,-0.11999997100587473],"max":[0.15000000596046448,0.04131922553695501,0.1399999742841302]},"sizeMeters":[0.387,0.041,0.26],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:57.118Z","updatedAt":"2026-09-11T03:20:57.235Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33629/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function SweatbandSetTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33629/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33629/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33629/v1/model.glb\" alt=\"Sweatband Set (Tennis Club and Courts)\" 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/33629/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/33629/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33628","slug":"tennis-club-and-courts-courtside-bench-a9260a2e","title":"Courtside Bench (Tennis Club and Courts)","summary":"A 1.8 m slatted timber bench on a charcoal steel frame, the seat that stands at the net post end of a court.","description":"A 1.8 m slatted timber bench on a charcoal steel frame, the seat that stands at the net post end of a court. Dimensions 1.80 by 1.00 by 0.50 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-courtside-bench-a9260a2e","cdnUrl":"https://cdn.3dassets.dev/assets/33628/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-courtside-bench-a9260a2e","thumbnailUrl":"https://cdn.3dassets.dev/assets/33628/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33628/v1/poster.webp","blurhash":"UDC?7J-oD+%2~U^*ayRj01%K?GNG0f57-oxt","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":6896,"triangles":144,"vertices":432,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-0.8999999761581421,9.868318662231701e-9,-0.22997695366830473],"max":[0.8999999761581421,1.0050505687322266,0.26997696022481565]},"sizeMeters":[1.8,1.005,0.5],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:58.127Z","updatedAt":"2026-09-11T03:20:58.246Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33628/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CourtsideBenchTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33628/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33628/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33628/v1/model.glb\" alt=\"Courtside Bench (Tennis Club and Courts)\" 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/33628/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/33628/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33630","slug":"tennis-club-and-courts-players-chair-and-parasol-839ac365","title":"Players Chair And Parasol (Tennis Club and Courts)","summary":"A players chair under its own parasol: a blue seat and high back on a steel frame, armrests, a towel on the seat and a 1.9 m blue and white canopy on a post behind the shoulder.","description":"A players chair under its own parasol: a blue seat and high back on a steel frame, armrests, a towel on the seat and a 1.9 m blue and white canopy on a post behind the shoulder. Dimensions 1.90 by 2.42 by 1.90 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. The canopy is a solid segmented shade and does not open, close or tilt. Origin on the footprint centre at ground level, with the parasol post at the back right corner. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-players-chair-and-parasol-839ac365","cdnUrl":"https://cdn.3dassets.dev/assets/33630/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-players-chair-and-parasol-839ac365","thumbnailUrl":"https://cdn.3dassets.dev/assets/33630/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33630/v1/poster.webp","blurhash":"UE9til%g00I9?wWBDit7I9RPtStS9Fog%gRP","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":13732,"triangles":216,"vertices":648,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.5299968857088623,0,-1.2899968761721192],"max":[1.3699969190874635,2.4200000762939453,0.6099969286242065]},"sizeMeters":[1.9,2.42,1.9],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:57.305Z","updatedAt":"2026-09-11T03:20:57.500Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33630/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function PlayersChairAndParasolTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33630/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33630/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33630/v1/model.glb\" alt=\"Players Chair And Parasol (Tennis Club and Courts)\" 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/33630/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/33630/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33631","slug":"tennis-club-and-courts-practice-wall-69afc154","title":"Practice Wall (Tennis Club and Courts)","summary":"A 6.4 m practice wall 3.16 m high: a blue hitting face on a charcoal plinth, a painted net line, a height line and three yellow target squares, buttressed at both ends.","description":"A 6.4 m practice wall 3.16 m high: a blue hitting face on a charcoal plinth, a painted net line, a height line and three yellow target squares, buttressed at both ends. Dimensions 6.56 by 3.16 by 1.20 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Solid single sided wall meant to be hit towards from positive Z. No collision data is included; the back face is plain. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-practice-wall-69afc154","cdnUrl":"https://cdn.3dassets.dev/assets/33631/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-practice-wall-69afc154","thumbnailUrl":"https://cdn.3dassets.dev/assets/33631/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33631/v1/poster.webp","blurhash":"ULD^Q5tS,-xuyD_4t7sk00xugOe-i^D%j]NG","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":9624,"triangles":144,"vertices":432,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-3.2799999713897705,-0.00008966771997576117,-0.6000183200466551],"max":[3.2799999713897705,3.160228929948275,0.6000183200466551]},"sizeMeters":[6.56,3.16,1.2],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:58.141Z","updatedAt":"2026-09-11T03:20:58.261Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33631/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function PracticeWallTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33631/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33631/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33631/v1/model.glb\" alt=\"Practice Wall (Tennis Club and Courts)\" 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/33631/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/33631/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33632","slug":"tennis-club-and-courts-floodlight-mast-a6940231","title":"Floodlight Mast (Tennis Club and Courts)","summary":"An 8.1 m court floodlight mast: a tapered steel column on a concrete base with a cross head carrying four angled lamps, the light a club plays under after work.","description":"An 8.1 m court floodlight mast: a tapered steel column on a concrete base with a cross head carrying four angled lamps, the light a club plays under after work. Dimensions 1.66 by 8.09 by 0.97 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. The lamp faces are flat white panels; the model carries no light source, so add a real light in the engine at the head. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-floodlight-mast-a6940231","cdnUrl":"https://cdn.3dassets.dev/assets/33632/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-floodlight-mast-a6940231","thumbnailUrl":"https://cdn.3dassets.dev/assets/33632/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33632/v1/poster.webp","blurhash":"U05hc8?a0000-?W9ISxxtAawavoitTt6RhM|","category":{"slug":"roads-infrastructure","title":"Roads & Infrastructure"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":11480,"triangles":188,"vertices":564,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.8298577673540642,0,-0.48457766057996254],"max":[0.8298577673540642,8.092842102050781,0.48457766057996254]},"sizeMeters":[1.66,8.093,0.969],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:58.852Z","updatedAt":"2026-09-11T03:20:59.045Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33632/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function FloodlightMastTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33632/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33632/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33632/v1/model.glb\" alt=\"Floodlight Mast (Tennis Club and Courts)\" 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/33632/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/33632/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33633","slug":"tennis-club-and-courts-spectator-bleacher-42aff381","title":"Spectator Bleacher (Tennis Club and Courts)","summary":"A 4.2 m three row spectator bleacher: timber benches and backs on a raked steel frame with side rails, for the surround beside a show court.","description":"A 4.2 m three row spectator bleacher: timber benches and backs on a raked steel frame with side rails, for the surround beside a show court. Dimensions 4.20 by 2.27 by 2.60 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Open at the front, which faces positive Z. Origin on the footprint centre at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-spectator-bleacher-42aff381","cdnUrl":"https://cdn.3dassets.dev/assets/33633/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-spectator-bleacher-42aff381","thumbnailUrl":"https://cdn.3dassets.dev/assets/33633/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33633/v1/poster.webp","blurhash":"U7ECRU%M00Rj?F?aWa9a00xu~9M_9bRot1s8","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":16312,"triangles":288,"vertices":864,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-2.0999999046325684,0.0000106844935427175,-1.800106725939011],"max":[2.0999999046325684,2.275000642055801,0.8001067855436559]},"sizeMeters":[4.2,2.275,2.6],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:00.114Z","updatedAt":"2026-09-11T03:21:00.252Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33633/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function SpectatorBleacherTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33633/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33633/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33633/v1/model.glb\" alt=\"Spectator Bleacher (Tennis Club and Courts)\" 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/33633/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/33633/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33635","slug":"tennis-club-and-courts-clubhouse-wall-bay-a221d7e8","title":"Clubhouse Wall Bay (Tennis Club and Courts)","summary":"A 4 m clubhouse facade bay: a rendered wall 3 m to the head, a timber plinth and head band and a green sign panel, ported on both ends.","description":"A 4 m clubhouse facade bay: a rendered wall 3 m to the head, a timber plinth and head band and a green sign panel, ported on both ends. Dimensions 4.02 by 3.00 by 0.34 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Connectors: left (bay) at (-2.00, 0.00, 0.00) facing (-1, 0, 0); right (bay) at (2.00, 0.00, 0.00) facing (1, 0, 0). Exterior model. Ports sit on the end faces at ground level, so bays butt into a continuous run and a gable end closes it. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-clubhouse-wall-bay-a221d7e8","cdnUrl":"https://cdn.3dassets.dev/assets/33635/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-clubhouse-wall-bay-a221d7e8","thumbnailUrl":"https://cdn.3dassets.dev/assets/33635/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33635/v1/poster.webp","blurhash":"UDHetO?a00%3?w~qaJ9F00j^%zMxV?wbjZ9u","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"slug":"modular","title":"Modular"},{"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":4576,"triangles":60,"vertices":180,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-2.009999990463257,0.00007629627368999081,-0.1599804673948843],"max":[2.009999990463257,2.99992370372631,0.175082475079766]},"sizeMeters":[4.02,3,0.335],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:59.892Z","updatedAt":"2026-09-11T03:21:00.114Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33635/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ClubhouseWallBayTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33635/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33635/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33635/v1/model.glb\" alt=\"Clubhouse Wall Bay (Tennis Club and Courts)\" 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/33635/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/33635/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33634","slug":"tennis-club-and-courts-clubhouse-window-bay-37fa72ed","title":"Clubhouse Window Bay (Tennis Club and Courts)","summary":"The 4 m clubhouse bay with a wide glazed window in a timber frame, for the lounge side that looks out over the courts.","description":"The 4 m clubhouse bay with a wide glazed window in a timber frame, for the lounge side that looks out over the courts. Dimensions 4.02 by 3.00 by 0.39 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Connectors: left (bay) at (-2.00, 0.00, 0.00) facing (-1, 0, 0); right (bay) at (2.00, 0.00, 0.00) facing (1, 0, 0). Exterior model. Ports sit on the end faces at ground level, so bays butt into a continuous run and a gable end closes it. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-clubhouse-window-bay-37fa72ed","cdnUrl":"https://cdn.3dassets.dev/assets/33634/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-clubhouse-window-bay-37fa72ed","thumbnailUrl":"https://cdn.3dassets.dev/assets/33634/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33634/v1/poster.webp","blurhash":"UCH2WX-;00-:.T~qsk9F00f,giIU$y$dIo9b","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"slug":"modular","title":"Modular"},{"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":7264,"triangles":108,"vertices":324,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-2.009999990463257,0.00007629627368999081,-0.1598691521699906],"max":[2.009999990463257,2.99992370372631,0.2248691497858048]},"sizeMeters":[4.02,3,0.385],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:20:59.895Z","updatedAt":"2026-09-11T03:21:00.188Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33634/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ClubhouseWindowBayTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33634/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33634/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33634/v1/model.glb\" alt=\"Clubhouse Window Bay (Tennis Club and Courts)\" 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/33634/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/33634/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33636","slug":"tennis-club-and-courts-clubhouse-door-bay-d8889571","title":"Clubhouse Door Bay (Tennis Club and Courts)","summary":"A 4 m clubhouse entrance bay on the same module as the wall bay: piers and a lintel round a 1.8 m opening, a timber threshold and a glazed door that swings open.","description":"A 4 m clubhouse entrance bay on the same module as the wall bay: piers and a lintel round a 1.8 m opening, a timber threshold and a glazed door that swings open. Dimensions 4.02 by 3.00 by 0.50 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Animated pivot nodes: door at (-0.85, 0.04, 0.07) m. Connectors: left (bay) at (-2.00, 0.00, 0.00) facing (-1, 0, 0); right (bay) at (2.00, 0.00, 0.00) facing (1, 0, 0). Exterior model. The door is a single leaf hinged on the left jamb and swings outwards. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-clubhouse-door-bay-d8889571","cdnUrl":"https://cdn.3dassets.dev/assets/33636/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-clubhouse-door-bay-d8889571","thumbnailUrl":"https://cdn.3dassets.dev/assets/33636/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33636/v1/poster.webp","blurhash":"UDGum]D%00RP?w^+Di4o00%gxuV?V?w[tRNL","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"slug":"modular","title":"Modular"},{"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":9612,"triangles":120,"vertices":360,"meshes":5,"materials":4,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-2.009999990463257,0.00007629627368999081,-0.19003082012407663],"max":[2.009999990463257,2.99992370372631,0.3100308248924482]},"sizeMeters":[4.02,3,0.5],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:00.640Z","updatedAt":"2026-09-11T03:21:00.738Z","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/33636/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 ClubhouseDoorBayTennisClubAndCourts(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/33636/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/33636/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33636/v1/model.glb\" alt=\"Clubhouse Door Bay (Tennis Club and Courts)\" 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/33636/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/33636/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"33637","slug":"tennis-club-and-courts-clubhouse-gable-end-1026bfb5","title":"Clubhouse Gable End (Tennis Club and Courts)","summary":"The 6 m gable end that closes a clubhouse run: a rendered wall to the head, the gable above it cut to the roof pitch and a square window under the apex.","description":"The 6 m gable end that closes a clubhouse run: a rendered wall to the head, the gable above it cut to the roof pitch and a square window under the apex. Dimensions 6.02 by 4.80 by 0.40 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Connectors: left (bay) at (-3.00, 0.00, 0.00) facing (0, 0, 1); right (bay) at (3.00, 0.00, 0.00) facing (0, 0, 1). Exterior model. Turn it a quarter so its ports land on the ends of both long runs of bays. Both ports face the same way, out of the gable along the building, because a gable end caps a run rather than continuing it. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-clubhouse-gable-end-1026bfb5","cdnUrl":"https://cdn.3dassets.dev/assets/33637/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-clubhouse-gable-end-1026bfb5","thumbnailUrl":"https://cdn.3dassets.dev/assets/33637/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33637/v1/poster.webp","blurhash":"UEGlCkV@00WB9b?baJ9F00Ip_Nxt-oIAkDxv","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"slug":"modular","title":"Modular"},{"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":5732,"triangles":68,"vertices":204,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-3.009999990463257,-0.00012808237236772158,-0.15981681053158484],"max":[3.009999990463257,4.800128273107231,0.23481681351181707]},"sizeMeters":[6.02,4.8,0.395],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:01.725Z","updatedAt":"2026-09-11T03:21:01.847Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33637/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ClubhouseGableEndTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33637/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33637/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33637/v1/model.glb\" alt=\"Clubhouse Gable End (Tennis Club and Courts)\" 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/33637/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/33637/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33639","slug":"tennis-club-and-courts-clubhouse-roof-slope-7cfe25da","title":"Clubhouse Roof Slope (Tennis Club and Courts)","summary":"One 4 m bay of clubhouse roof: a charcoal slab that seats on the wall head at its eave edge and climbs 1.8 m over a 3 m run to the ridge, with standing seams picked out along it.","description":"One 4 m bay of clubhouse roof: a charcoal slab that seats on the wall head at its eave edge and climbs 1.8 m over a 3 m run to the ridge, with standing seams picked out along it. Dimensions 4.00 by 2.00 by 3.00 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. The origin is the eave edge on the wall centreline, not the footprint centre: place it at the wall head and it runs back to the ridge. Turn it half round for the opposite slope. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-clubhouse-roof-slope-7cfe25da","cdnUrl":"https://cdn.3dassets.dev/assets/33639/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-clubhouse-roof-slope-7cfe25da","thumbnailUrl":"https://cdn.3dassets.dev/assets/33639/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33639/v1/poster.webp","blurhash":"U39%;q?b00M__4D$ITRj00D%-=IUD*~qRjWA","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"slug":"modular","title":"Modular"},{"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":5212,"triangles":72,"vertices":216,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-2,-0.00015259254737998162,-2.99992370372631],"max":[2,2.00015259254738,-0.00007629627368999081]},"sizeMeters":[4,2,3],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:01.865Z","updatedAt":"2026-09-11T03:21:01.996Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33639/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ClubhouseRoofSlopeTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33639/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33639/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33639/v1/model.glb\" alt=\"Clubhouse Roof Slope (Tennis Club and Courts)\" 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/33639/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/33639/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33638","slug":"tennis-club-and-courts-clubhouse-ridge-cap-5fad54ff","title":"Clubhouse Ridge Cap (Tennis Club and Courts)","summary":"A 4 m ridge cap in clay red, 0.6 m across and cut to the roof pitch, so it closes the joint where two slopes meet without reading as a slope of its own.","description":"A 4 m ridge cap in clay red, 0.6 m across and cut to the roof pitch, so it closes the joint where two slopes meet without reading as a slope of its own. Dimensions 4.00 by 0.28 by 0.60 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. The origin is on the ridge line, 0.18 m below the underside of the apex, so it lands flush on both slabs. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-clubhouse-ridge-cap-5fad54ff","cdnUrl":"https://cdn.3dassets.dev/assets/33638/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-clubhouse-ridge-cap-5fad54ff","thumbnailUrl":"https://cdn.3dassets.dev/assets/33638/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33638/v1/poster.webp","blurhash":"U8C6Jh-p4.%2sp~VxtIV00Io~VR%R%00E2^k","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"slug":"modular","title":"Modular"},{"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":2156,"triangles":24,"vertices":72,"meshes":1,"materials":1,"textures":0,"animations":[],"boundingBox":{"min":[-2,0.00010315315807532532,-0.3000579851680044],"max":[2,0.2798968480340176,0.3000579851680044]},"sizeMeters":[4,0.28,0.6],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:01.847Z","updatedAt":"2026-09-11T03:21:01.970Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33638/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ClubhouseRidgeCapTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33638/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33638/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33638/v1/model.glb\" alt=\"Clubhouse Ridge Cap (Tennis Club and Courts)\" 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/33638/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/33638/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33640","slug":"tennis-club-and-courts-terrace-table-6f2b66f9","title":"Terrace Table (Tennis Club and Courts)","summary":"A 0.92 m round terrace table 0.79 m high: a timber top on a charcoal pedestal and a weighted foot, for the deck outside a clubhouse.","description":"A 0.92 m round terrace table 0.79 m high: a timber top on a charcoal pedestal and a weighted foot, for the deck outside a clubhouse. Dimensions 0.92 by 0.79 by 0.92 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-terrace-table-6f2b66f9","cdnUrl":"https://cdn.3dassets.dev/assets/33640/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-terrace-table-6f2b66f9","thumbnailUrl":"https://cdn.3dassets.dev/assets/33640/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33640/v1/poster.webp","blurhash":"UNCigbt70LWB~AoLEOj[xaa{R*j[E3WVs,ay","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":9828,"triangles":168,"vertices":504,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-0.46000000834465027,-0.000015103197055554851,-0.46000000834465027],"max":[0.46000000834465027,0.7899862874802822,0.46000000834465027]},"sizeMeters":[0.92,0.79,0.92],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:02.259Z","updatedAt":"2026-09-11T03:21:02.394Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33640/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function TerraceTableTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33640/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33640/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33640/v1/model.glb\" alt=\"Terrace Table (Tennis Club and Courts)\" 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/33640/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/33640/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33641","slug":"tennis-club-and-courts-terrace-chair-db8478f6","title":"Terrace Chair (Tennis Club and Courts)","summary":"A 1.1 m terrace chair: a timber seat and a slatted, slightly raked back on a charcoal steel frame, to stand round the terrace table.","description":"A 1.1 m terrace chair: a timber seat and a slatted, slightly raked back on a charcoal steel frame, to stand round the terrace table. Dimensions 0.46 by 1.10 by 0.47 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-terrace-chair-db8478f6","cdnUrl":"https://cdn.3dassets.dev/assets/33641/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-terrace-chair-db8478f6","thumbnailUrl":"https://cdn.3dassets.dev/assets/33641/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33641/v1/poster.webp","blurhash":"U7AJsAt600s.^%M|4;-o02Ip~U%KNKxt%1E2","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":8120,"triangles":132,"vertices":396,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-0.2300090710584611,0,-0.24933789782520543],"max":[0.2300090710584611,1.100805401802063,0.22000523076126702]},"sizeMeters":[0.46,1.101,0.469],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:04.430Z","updatedAt":"2026-09-11T03:21:04.544Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33641/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function TerraceChairTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33641/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33641/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33641/v1/model.glb\" alt=\"Terrace Chair (Tennis Club and Courts)\" 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/33641/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/33641/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33643","slug":"tennis-club-and-courts-terrace-parasol-7f958837","title":"Terrace Parasol (Tennis Club and Courts)","summary":"A 2.7 m terrace parasol: a 2.6 m blue and white segmented canopy on a steel pole in a weighted base, for a table on the clubhouse terrace.","description":"A 2.7 m terrace parasol: a 2.6 m blue and white segmented canopy on a steel pole in a weighted base, for a table on the clubhouse terrace. Dimensions 2.60 by 2.64 by 2.60 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. The canopy is a solid shade and cannot be furled: a rigid node transform cannot fold a linkage or deform a mesh. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-terrace-parasol-7f958837","cdnUrl":"https://cdn.3dassets.dev/assets/33643/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-terrace-parasol-7f958837","thumbnailUrl":"https://cdn.3dassets.dev/assets/33643/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33643/v1/poster.webp","blurhash":"UJ9aaDt74TRj?wofIAWBITafxuWV4TWB%gbH","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":10260,"triangles":148,"vertices":444,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-1.2999999523162842,0,-1.2999999523162842],"max":[1.2999999523162842,2.6400313542804317,1.2999999523162842]},"sizeMeters":[2.6,2.64,2.6],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:03.595Z","updatedAt":"2026-09-11T03:21:03.826Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33643/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function TerraceParasolTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33643/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33643/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33643/v1/model.glb\" alt=\"Terrace Parasol (Tennis Club and Courts)\" 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/33643/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/33643/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33642","slug":"tennis-club-and-courts-terrace-planter-993ea42a","title":"Terrace Planter (Tennis Club and Courts)","summary":"A 0.94 m square timber planter with a clipped green shrub in it, for a terrace edge, a gate side or the front of a clubhouse.","description":"A 0.94 m square timber planter with a clipped green shrub in it, for a terrace edge, a gate side or the front of a clubhouse. Dimensions 0.94 by 1.01 by 0.94 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-terrace-planter-993ea42a","cdnUrl":"https://cdn.3dassets.dev/assets/33642/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-terrace-planter-993ea42a","thumbnailUrl":"https://cdn.3dassets.dev/assets/33642/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33642/v1/poster.webp","blurhash":"U7E.%x~p00DP0iEL+axY00IVP9S${0$*yrS~","category":{"slug":"nature","title":"Nature & Landscape"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":16488,"triangles":292,"vertices":876,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.4699999988079071,0.00002427014112144077,-0.4699999988079071],"max":[0.4699999988079071,1.0090261898255202,0.4699999988079071]},"sizeMeters":[0.94,1.009,0.94],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:03.598Z","updatedAt":"2026-09-11T03:21:03.829Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33642/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function TerracePlanterTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33642/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33642/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33642/v1/model.glb\" alt=\"Terrace Planter (Tennis Club and Courts)\" 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/33642/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/33642/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33644","slug":"tennis-club-and-courts-court-litter-bin-d3afaee8","title":"Court Litter Bin (Tennis Club and Courts)","summary":"A 1.04 m court side litter bin: a charcoal drum with two steel bands, a hooded top and a yellow label panel, for a gate side or a terrace corner.","description":"A 1.04 m court side litter bin: a charcoal drum with two steel bands, a hooded top and a yellow label panel, for a gate side or a terrace corner. Dimensions 0.57 by 1.04 by 0.54 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-court-litter-bin-d3afaee8","cdnUrl":"https://cdn.3dassets.dev/assets/33644/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-court-litter-bin-d3afaee8","thumbnailUrl":"https://cdn.3dassets.dev/assets/33644/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33644/v1/poster.webp","blurhash":"U38g$]~p0000_1xsD*IX00D%.7?b8~IV--_0","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":16524,"triangles":292,"vertices":876,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.2847193877265313,0,-0.270788298255675],"max":[0.2847193877265313,1.0399999618530273,0.270788298255675]},"sizeMeters":[0.569,1.04,0.542],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:04.033Z","updatedAt":"2026-09-11T03:21:04.134Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33644/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CourtLitterBinTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33644/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33644/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33644/v1/model.glb\" alt=\"Court Litter Bin (Tennis Club and Courts)\" 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/33644/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/33644/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33645","slug":"tennis-club-and-courts-court-roller-a12afd94","title":"Court Roller (Tennis Club and Courts)","summary":"A 0.94 m hand court roller: a heavy steel drum in a charcoal yoke with a scraper bar over it and a raked handle, for dressing a clay court after play.","description":"A 0.94 m hand court roller: a heavy steel drum in a charcoal yoke with a scraper bar over it and a raked handle, for dressing a clay court after play. Dimensions 1.05 by 1.07 by 1.02 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Animated pivot nodes: roller-drum at (0.00, 0.28, 0.00) m. The drum turns about its own axle; the yoke, the scraper and the handle are static. Origin on the footprint centre at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Rigid node-transform clips: roll. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-court-roller-a12afd94","cdnUrl":"https://cdn.3dassets.dev/assets/33645/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-court-roller-a12afd94","thumbnailUrl":"https://cdn.3dassets.dev/assets/33645/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33645/v1/poster.webp","blurhash":"U6A0{]xw00oY~o9GD*_14T01t9~p~qxv9FRi","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":16372,"triangles":268,"vertices":804,"meshes":4,"materials":3,"textures":0,"animations":["roll"],"boundingBox":{"min":[-0.5249999761581421,-0.00002991358943604805,-0.7499996936228124],"max":[0.5253808498382568,1.0699997162725774,0.2729715925804532]},"sizeMeters":[1.05,1.07,1.023],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:06.394Z","updatedAt":"2026-09-11T03:21:06.505Z","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/33645/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 CourtRollerTennisClubAndCourts(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/33645/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/33645/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33645/v1/model.glb\" alt=\"Court Roller (Tennis Club and Courts)\" 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/33645/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/33645/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"33646","slug":"tennis-club-and-courts-net-winder-4b8e80d0","title":"Net Winder (Tennis Club and Courts)","summary":"A 0.75 m net winder: a steel cord drum with a crank between two charcoal cheeks on a foot plate, the reel a net cord is tensioned from at the post.","description":"A 0.75 m net winder: a steel cord drum with a crank between two charcoal cheeks on a foot plate, the reel a net cord is tensioned from at the post. Dimensions 0.59 by 0.82 by 0.44 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Animated pivot nodes: winder at (0.00, 0.60, 0.00) m. The drum and its crank turn together on one node. The cord itself is not modelled, because a rigid node transform cannot wind a line onto a spool. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Rigid node-transform clips: spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-net-winder-4b8e80d0","cdnUrl":"https://cdn.3dassets.dev/assets/33646/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-net-winder-4b8e80d0","thumbnailUrl":"https://cdn.3dassets.dev/assets/33646/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33646/v1/poster.webp","blurhash":"U59H9A~q0000-=t7D%IU01My?a-:D$Rixwoi","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":9684,"triangles":132,"vertices":396,"meshes":5,"materials":3,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.22502029717567001,0,-0.21999817120347487],"max":[0.3700000047683716,0.8250001416650352,0.21999817120347487]},"sizeMeters":[0.595,0.825,0.44],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:05.376Z","updatedAt":"2026-09-11T03:21:05.490Z","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/33646/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 NetWinderTennisClubAndCourts(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/33646/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/33646/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33646/v1/model.glb\" alt=\"Net Winder (Tennis Club and Courts)\" 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/33646/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/33646/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"33647","slug":"tennis-club-and-courts-line-marking-trolley-40ec084a","title":"Line Marking Trolley (Tennis Club and Courts)","summary":"A 0.72 m line marking trolley: a paint tank on two wheels with a blue lid, a marking shoe under the nose and a raked push handle, for repainting a court line.","description":"A 0.72 m line marking trolley: a paint tank on two wheels with a blue lid, a marking shoe under the nose and a raked push handle, for repainting a court line. Dimensions 0.67 by 1.01 by 1.21 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. Animated pivot nodes: wheel-left at (-0.30, 0.17, -0.10) m; wheel-right at (0.30, 0.17, -0.10) m. Both wheels turn on their own axle. The marking shoe and the tank are static and no paint is emitted. Origin on the footprint centre at ground level. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Rigid node-transform clips: roll. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-line-marking-trolley-40ec084a","cdnUrl":"https://cdn.3dassets.dev/assets/33647/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-line-marking-trolley-40ec084a","thumbnailUrl":"https://cdn.3dassets.dev/assets/33647/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33647/v1/poster.webp","blurhash":"UAAAm.x^00I9t59GoM?a009F?w_N^*t7E1R*","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":13996,"triangles":284,"vertices":852,"meshes":8,"materials":5,"textures":0,"animations":["roll"],"boundingBox":{"min":[-0.3370016650785872,-1.7881393310492655e-9,-0.7499935911127553],"max":[0.3370016650785872,1.0099935815760122,0.46000000834465027]},"sizeMeters":[0.674,1.01,1.21],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:05.652Z","updatedAt":"2026-09-11T03:21:05.855Z","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/33647/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 LineMarkingTrolleyTennisClubAndCourts(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/33647/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/33647/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33647/v1/model.glb\" alt=\"Line Marking Trolley (Tennis Club and Courts)\" 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/33647/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/33647/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"33648","slug":"tennis-club-and-courts-coach-whiteboard-6470413d","title":"Coach Whiteboard (Tennis Club and Courts)","summary":"A 1.45 m coaching whiteboard on an A frame: a white board with a blue court diagram, the lines of a full court drawn on it and a pen tray under the face.","description":"A 1.45 m coaching whiteboard on an A frame: a white board with a blue court diagram, the lines of a full court drawn on it and a pen tray under the face. Dimensions 1.16 by 1.46 by 0.66 m (X by Y by Z). Metre units, +Y up, +Z front, origin on the footprint at ground level. The board is one static piece and cannot be written on or folded; the diagram is modelled geometry rather than a texture. Baseline low-poly palette: court blue, surround green, clay terracotta, white, charcoal, steel, timber and ball yellow. Static geometry; no rig, animation, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-coach-whiteboard-6470413d","cdnUrl":"https://cdn.3dassets.dev/assets/33648/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-coach-whiteboard-6470413d","thumbnailUrl":"https://cdn.3dassets.dev/assets/33648/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33648/v1/poster.webp","blurhash":"UEAm@^oz00nh_NtR9EITDht7yEIUH=xayENH","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":11908,"triangles":188,"vertices":564,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.5799999833106995,0,-0.32960024617300165],"max":[0.5819983665465901,1.4569613756833923,0.32960024617300165]},"sizeMeters":[1.162,1.457,0.659],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:07.190Z","updatedAt":"2026-09-11T03:21:07.295Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33648/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CoachWhiteboardTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33648/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33648/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33648/v1/model.glb\" alt=\"Coach Whiteboard (Tennis Club and Courts)\" 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/33648/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/33648/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"33649","slug":"tennis-club-and-courts-club-courts-and-t-578520e8-starter-scene","title":"Club Courts and Terrace (Tennis Club and Courts)","summary":"A working tennis club built from the kit: a full doubles court of blue surface tiles inside a green surround, with the painted line set over them, the net up between its posts and singles sticks in place. Court fencing rings it, windbreak screens along the back run and a gate...","description":"A working tennis club built from the kit: a full doubles court of blue surface tiles inside a green surround, with the painted line set over them, the net up between its posts and singles sticks in place. Court fencing rings it, windbreak screens along the back run and a gate on the clubhouse side, with the umpire chair, two benches, a pair of players chairs under their parasols, the scoreboard, the speed board and the bags, rackets, towels and bottles of a session down the east tramline. A ball machine feeds the far half beside its hopper and basket, and the roller, the line trolley and the net winder are parked by the gate. West of the court the clubhouse stands assembled from window, door and wall bays between two gable ends under a full pitched roof, with a terrace of tables, parasols, chairs and planters in front of it, and a clay mini court, its net, a coaching whiteboard and the practice wall fill the far corner. Floodlight masts stand at the four corners and bleachers face the court from outside the fence.","status":"published","url":"https://3dassets.dev/assets/tennis-club-and-courts-club-courts-and-t-578520e8-starter-scene","cdnUrl":"https://cdn.3dassets.dev/assets/33649/v1/model.glb","downloadUrl":"https://3dassets.dev/download/tennis-club-and-courts-club-courts-and-t-578520e8-starter-scene","thumbnailUrl":"https://cdn.3dassets.dev/assets/33649/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/33649/v1/poster.webp","blurhash":"U6AU20x[00ERQnaeS~of00RQ_4$eqEbt,:ni","category":{"slug":"environments","title":"Environments & Scenes"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"stylized","title":"Stylized"},{"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":808644,"triangles":16764,"vertices":38677,"meshes":145,"materials":8,"textures":0,"animations":[],"boundingBox":{"min":[-24,-0.00017242883348132787,-18.90010672593901],"max":[12.700106725939012,8.192842102050781,18]},"sizeMeters":[36.7,8.193,36.9],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T03:21:08.152Z","updatedAt":"2026-09-11T03:21:08.282Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/33649/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ClubCourtsAndTerraceTennisClubAndCourts(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/33649/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/33649/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/33649/v1/model.glb\" alt=\"Club Courts and Terrace (Tennis Club and Courts)\" 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/33649/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/33649/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}}],"demo":{"slug":"tennis-club-and-courts","title":"Tennis Club and Courts","url":"https://3dassets.dev/demos/tennis-club-and-courts"}}}