{"data":{"id":"75","slug":"tennis-club-and-courts","title":"Tennis Club and Courts","summary":"Walk a tennis club: a marked hard court behind its fence and windbreaks, a clay court and practice wall beside it, and a clubhouse with a terrace looking over both.","url":"https://3dassets.dev/demos/tennis-club-and-courts","coverUrl":"https://cdn.3dassets.dev/media/tennis-club-and-courts-demo.png","featured":true,"pack":{"slug":"tennis-club-and-courts","title":"Tennis Club and Courts","url":"https://3dassets.dev/packs/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.","assetCount":46,"totalBytes":1759524,"starterScene":{"slug":"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","fileSize":808644}},"placementCount":166,"assetCount":45,"spawn":{"position":[-6,0.28,12],"yaw":180},"publishedAt":"2026-09-11T03:22:40.288Z","updatedAt":"2026-09-11T03:22:40.289Z","description":"A tennis club built from the pack's own ground tiles, fencing and modular clubhouse bays.\n\n**What is placed.** A full hard court of surface tiles with the line set laid over them, the net up on its posts and singles sticks beside it, enclosed by fence panels, windbreaks and a gate. A clay court and a practice wall sit behind, with a mini court net for coaching. The umpire chair, scoreboard and service speed board stand at the net line; ball hoppers, baskets, a ball machine, rackets, towels, bottles, sweatbands and a sports bag are left courtside. A clubhouse of wall, window, door and gable bays under a pitched roof looks over a terrace of tables, chairs, parasols and planters, with floodlight masts, benches, a bleacher and the court roller, line trolley and net winder round the grounds.\n\n**What moves.** The clubhouse door and the fence gate open and close, the ball machine barrel and the net winder spin, the court roller and the line marking trolley roll their wheels, and the scoreboard flap tilts.\n\n**What does not move, and why.** The net cords, the windbreak fabric, the racket strings, the parasol canopies and the towels are static geometry. Each is cloth or cord, and none is reachable with the rigid node transforms this library uses. There are no players, because nothing here is skinned.","scene":{"version":1,"spawn":{"position":[-6,0.28,12],"yaw":180},"ground":{"style":"none"},"environment":{"preset":"outdoor","shadows":true},"placements":[{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-9,0,-15],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-9,0,-9],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-9,0,-3],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-9,0,3],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-9,0,9],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-9,0,15],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-3,0,-15],"rotation":0},{"asset":"tennis-club-and-courts-court-surface-tile-e72e9e6a","position":[-3,0,-9],"rotation":0},{"asset":"tennis-club-and-courts-court-surface-tile-e72e9e6a","position":[-3,0,-3],"rotation":0},{"asset":"tennis-club-and-courts-court-surface-tile-e72e9e6a","position":[-3,0,3],"rotation":0},{"asset":"tennis-club-and-courts-court-surface-tile-e72e9e6a","position":[-3,0,9],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-3,0,15],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[3,0,-15],"rotation":0},{"asset":"tennis-club-and-courts-court-surface-tile-e72e9e6a","position":[3,0,-9],"rotation":0},{"asset":"tennis-club-and-courts-court-surface-tile-e72e9e6a","position":[3,0,-3],"rotation":0},{"asset":"tennis-club-and-courts-court-surface-tile-e72e9e6a","position":[3,0,3],"rotation":0},{"asset":"tennis-club-and-courts-court-surface-tile-e72e9e6a","position":[3,0,9],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[3,0,15],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[9,0,-15],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[9,0,-9],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[9,0,-3],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[9,0,3],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[9,0,9],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[9,0,15],"rotation":0},{"asset":"tennis-club-and-courts-court-surface-tile-clay-c7fcadfc","position":[-21,0,-15],"rotation":0},{"asset":"tennis-club-and-courts-court-surface-tile-clay-c7fcadfc","position":[-21,0,-9],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-21,0,-3],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-21,0,3],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-21,0,9],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-21,0,15],"rotation":0},{"asset":"tennis-club-and-courts-court-surface-tile-clay-c7fcadfc","position":[-15,0,-15],"rotation":0},{"asset":"tennis-club-and-courts-court-surface-tile-clay-c7fcadfc","position":[-15,0,-9],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-15,0,-3],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-15,0,3],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-15,0,9],"rotation":0},{"asset":"tennis-club-and-courts-court-surround-tile-d75e5790","position":[-15,0,15],"rotation":0},{"asset":"tennis-club-and-courts-court-line-markings-d174ea58","position":[0,0.10700000000000001,0],"rotation":0},{"asset":"tennis-club-and-courts-tennis-net-and-posts-9d48dd1c","position":[0,0.1,0],"rotation":0},{"asset":"tennis-club-and-courts-singles-stick-bc462e03","position":[-5.03,0.1,0],"rotation":0},{"asset":"tennis-club-and-courts-singles-stick-bc462e03","position":[5.03,0.1,0],"rotation":0},{"asset":"tennis-club-and-courts-court-windbreak-panel-0dae07f5","position":[-7.5,0.1,-15],"rotation":0},{"asset":"tennis-club-and-courts-court-windbreak-panel-0dae07f5","position":[-4.5,0.1,-15],"rotation":0},{"asset":"tennis-club-and-courts-court-windbreak-panel-0dae07f5","position":[-1.5,0.1,-15],"rotation":0},{"asset":"tennis-club-and-courts-court-windbreak-panel-0dae07f5","position":[1.5,0.1,-15],"rotation":0},{"asset":"tennis-club-and-courts-court-windbreak-panel-0dae07f5","position":[4.5,0.1,-15],"rotation":0},{"asset":"tennis-club-and-courts-court-windbreak-panel-0dae07f5","position":[7.5,0.1,-15],"rotation":0},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[9,0.1,-13.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[9,0.1,-10.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[9,0.1,-7.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[9,0.1,-4.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[9,0.1,-1.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[9,0.1,1.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[9,0.1,4.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[9,0.1,7.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[9,0.1,10.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[9,0.1,13.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[-9,0.1,-13.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[-9,0.1,-10.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[-9,0.1,-7.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[-9,0.1,-4.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[-9,0.1,-1.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-gate-075b8591","position":[-9,0.1,1.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[-9,0.1,4.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[-9,0.1,7.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[-9,0.1,10.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[-9,0.1,13.5],"rotation":90},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[-7.5,0.1,15],"rotation":0},{"asset":"tennis-club-and-courts-court-fence-panel-1f1853af","position":[7.5,0.1,15],"rotation":0},{"asset":"tennis-club-and-courts-umpire-chair-0422214d","position":[7.5,0.1,0],"rotation":-90},{"asset":"tennis-club-and-courts-courtside-bench-a9260a2e","position":[7.6,0.1,4.4],"rotation":-90},{"asset":"tennis-club-and-courts-courtside-bench-a9260a2e","position":[7.6,0.1,-4.4],"rotation":-90},{"asset":"tennis-club-and-courts-players-chair-and-parasol-839ac365","position":[7.7,0.1,1.8],"rotation":-90},{"asset":"tennis-club-and-courts-players-chair-and-parasol-839ac365","position":[7.7,0.1,-1.8],"rotation":-90},{"asset":"tennis-club-and-courts-court-towel-e7534f8c","position":[7.6,0.6,4.8],"rotation":-60},{"asset":"tennis-club-and-courts-court-towel-e7534f8c","position":[7.7,0.6,-4.1],"rotation":20},{"asset":"tennis-club-and-courts-water-bottle-abd2477f","position":[7.9,0.1,3.9],"rotation":0},{"asset":"tennis-club-and-courts-water-bottle-abd2477f","position":[8.1,0.1,-4.9],"rotation":0},{"asset":"tennis-club-and-courts-tennis-racket-ba639ca5","position":[7.5,0.6,4.1],"rotation":-80},{"asset":"tennis-club-and-courts-tennis-racket-in-cover-1cc8a05c","position":[7.6,0.6,-4.7],"rotation":100},{"asset":"tennis-club-and-courts-sports-bag-73697f1c","position":[8.2,0.1,5.6],"rotation":-70},{"asset":"tennis-club-and-courts-sports-bag-73697f1c","position":[8.2,0.1,-6.1],"rotation":-110},{"asset":"tennis-club-and-courts-sweatband-set-9948ba03","position":[7.4,0.6,5.1],"rotation":30},{"asset":"tennis-club-and-courts-court-scoreboard-b636b534","position":[-7.7,0.1,-7.6],"rotation":90},{"asset":"tennis-club-and-courts-service-speed-board-4e7f0cd9","position":[-7.8,0.1,7.6],"rotation":90},{"asset":"tennis-club-and-courts-court-number-sign-de764f75","position":[-8.2,0.1,4.6],"rotation":90},{"asset":"tennis-club-and-courts-court-litter-bin-d3afaee8","position":[-8.2,0.1,-0.6],"rotation":0},{"asset":"tennis-club-and-courts-ball-machine-a177b690","position":[0.6,0.1,-9.2],"rotation":0},{"asset":"tennis-club-and-courts-ball-hopper-3c8f620f","position":[2.4,0.1,-8.8],"rotation":0},{"asset":"tennis-club-and-courts-ball-basket-44558d1f","position":[-1.9,0.1,-8.4],"rotation":15},{"asset":"tennis-club-and-courts-tennis-racket-ba639ca5","position":[-2.8,0.1,-7.4],"rotation":30},{"asset":"tennis-club-and-courts-coach-whiteboard-6470413d","position":[-6.4,0.1,-11],"rotation":70},{"asset":"tennis-club-and-courts-tennis-ball-0f02a733","position":[1.6,0.1,-4.2],"rotation":0},{"asset":"tennis-club-and-courts-tennis-ball-0f02a733","position":[-3.4,0.1,-2.6],"rotation":0},{"asset":"tennis-club-and-courts-tennis-ball-0f02a733","position":[4.2,0.1,3.8],"rotation":0},{"asset":"tennis-club-and-courts-tennis-ball-0f02a733","position":[-1.2,0.1,6.4],"rotation":0},{"asset":"tennis-club-and-courts-tennis-ball-0f02a733","position":[5.4,0.1,-6.2],"rotation":0},{"asset":"tennis-club-and-courts-tennis-ball-0f02a733","position":[-4.8,0.1,9.4],"rotation":0},{"asset":"tennis-club-and-courts-court-roller-a12afd94","position":[-7.8,0.1,-3.4],"rotation":70},{"asset":"tennis-club-and-courts-line-marking-trolley-40ec084a","position":[-7.6,0.1,2.8],"rotation":110},{"asset":"tennis-club-and-courts-net-winder-4b8e80d0","position":[-6.6,0.1,0.4],"rotation":-60},{"asset":"tennis-club-and-courts-clubhouse-window-bay-37fa72ed","position":[-20,0.1,9],"rotation":0},{"asset":"tennis-club-and-courts-clubhouse-door-bay-d8889571","position":[-16,0.1,9],"rotation":0},{"asset":"tennis-club-and-courts-clubhouse-wall-bay-a221d7e8","position":[-20,0.1,3],"rotation":180},{"asset":"tennis-club-and-courts-clubhouse-wall-bay-a221d7e8","position":[-16,0.1,3],"rotation":180},{"asset":"tennis-club-and-courts-clubhouse-gable-end-1026bfb5","position":[-22,0.1,6],"rotation":90},{"asset":"tennis-club-and-courts-clubhouse-gable-end-1026bfb5","position":[-14,0.1,6],"rotation":-90},{"asset":"tennis-club-and-courts-clubhouse-roof-slope-7cfe25da","position":[-20,3.1,9],"rotation":0},{"asset":"tennis-club-and-courts-clubhouse-roof-slope-7cfe25da","position":[-20,3.1,3],"rotation":180},{"asset":"tennis-club-and-courts-clubhouse-ridge-cap-5fad54ff","position":[-20,4.92,6],"rotation":0},{"asset":"tennis-club-and-courts-clubhouse-roof-slope-7cfe25da","position":[-16,3.1,9],"rotation":0},{"asset":"tennis-club-and-courts-clubhouse-roof-slope-7cfe25da","position":[-16,3.1,3],"rotation":180},{"asset":"tennis-club-and-courts-clubhouse-ridge-cap-5fad54ff","position":[-16,4.92,6],"rotation":0},{"asset":"tennis-club-and-courts-terrace-table-6f2b66f9","position":[-20.4,0.1,11.6],"rotation":0},{"asset":"tennis-club-and-courts-terrace-parasol-7f958837","position":[-20.4,0.1,11.6],"rotation":0},{"asset":"tennis-club-and-courts-terrace-chair-db8478f6","position":[-21.3,0.1,11.4],"rotation":80},{"asset":"tennis-club-and-courts-terrace-chair-db8478f6","position":[-19.5,0.1,11.8],"rotation":-100},{"asset":"tennis-club-and-courts-terrace-chair-db8478f6","position":[-20.6,0.1,12.5],"rotation":170},{"asset":"tennis-club-and-courts-terrace-table-6f2b66f9","position":[-15.8,0.1,12.4],"rotation":0},{"asset":"tennis-club-and-courts-terrace-parasol-7f958837","position":[-15.8,0.1,12.4],"rotation":0},{"asset":"tennis-club-and-courts-terrace-chair-db8478f6","position":[-16.7,0.1,12.2],"rotation":80},{"asset":"tennis-club-and-courts-terrace-chair-db8478f6","position":[-14.9,0.1,12.6],"rotation":-100},{"asset":"tennis-club-and-courts-terrace-chair-db8478f6","position":[-15.9,0.1,11.5],"rotation":6},{"asset":"tennis-club-and-courts-terrace-planter-993ea42a","position":[-22.4,0.1,10.4],"rotation":0},{"asset":"tennis-club-and-courts-terrace-planter-993ea42a","position":[-13.6,0.1,10.8],"rotation":0},{"asset":"tennis-club-and-courts-terrace-planter-993ea42a","position":[-18,0.1,13.8],"rotation":0},{"asset":"tennis-club-and-courts-court-litter-bin-d3afaee8","position":[-13.4,0.1,13.2],"rotation":0},{"asset":"tennis-club-and-courts-courtside-bench-a9260a2e","position":[-18.2,0.1,14.6],"rotation":180},{"asset":"tennis-club-and-courts-sports-bag-73697f1c","position":[-17.2,0.1,10.6],"rotation":30},{"asset":"tennis-club-and-courts-tennis-racket-ba639ca5","position":[-16.6,0.1,11.1],"rotation":-40},{"asset":"tennis-club-and-courts-water-bottle-abd2477f","position":[-15.6,0.89,11.8],"rotation":0},{"asset":"tennis-club-and-courts-court-towel-e7534f8c","position":[-20.9,0.89,11.5],"rotation":20},{"asset":"tennis-club-and-courts-practice-wall-69afc154","position":[-18,0.1,-17.4],"rotation":0},{"asset":"tennis-club-and-courts-mini-court-net-6d9d5d5c","position":[-18,0.1,-12],"rotation":0},{"asset":"tennis-club-and-courts-singles-stick-bc462e03","position":[-20.5,0.1,-12],"rotation":0},{"asset":"tennis-club-and-courts-singles-stick-bc462e03","position":[-15.5,0.1,-12],"rotation":0},{"asset":"tennis-club-and-courts-ball-hopper-3c8f620f","position":[-21.4,0.1,-16.8],"rotation":0},{"asset":"tennis-club-and-courts-ball-basket-44558d1f","position":[-15.4,0.1,-16.6],"rotation":-20},{"asset":"tennis-club-and-courts-tennis-racket-ba639ca5","position":[-16.4,0.1,-16.9],"rotation":60},{"asset":"tennis-club-and-courts-sweatband-set-9948ba03","position":[-20.7,0.1,-16.3],"rotation":-20},{"asset":"tennis-club-and-courts-coach-whiteboard-6470413d","position":[-22.4,0.1,-4.6],"rotation":30},{"asset":"tennis-club-and-courts-tennis-ball-practice-9f7b8863","position":[-19.4,0.1,-15.6],"rotation":0},{"asset":"tennis-club-and-courts-tennis-ball-practice-9f7b8863","position":[-17.2,0.1,-14.8],"rotation":0},{"asset":"tennis-club-and-courts-tennis-ball-practice-9f7b8863","position":[-16.2,0.1,-16.4],"rotation":0},{"asset":"tennis-club-and-courts-tennis-ball-practice-9f7b8863","position":[-20.8,0.1,-16.8],"rotation":0},{"asset":"tennis-club-and-courts-tennis-ball-practice-9f7b8863","position":[-18.4,0.1,-10.8],"rotation":0},{"asset":"tennis-club-and-courts-tennis-ball-practice-9f7b8863","position":[-21.4,0.1,-12.6],"rotation":0},{"asset":"tennis-club-and-courts-spectator-bleacher-42aff381","position":[-11,0.1,-1.6],"rotation":90},{"asset":"tennis-club-and-courts-floodlight-mast-a6940231","position":[-10.5,0.1,-16.5],"rotation":0},{"asset":"tennis-club-and-courts-floodlight-mast-a6940231","position":[10.5,0.1,-16.5],"rotation":0},{"asset":"tennis-club-and-courts-floodlight-mast-a6940231","position":[-10.5,0.1,16.5],"rotation":0},{"asset":"tennis-club-and-courts-floodlight-mast-a6940231","position":[10.5,0.1,16.5],"rotation":0},{"asset":"tennis-club-and-courts-courtside-bench-a9260a2e","position":[0,0.1,16.9],"rotation":180},{"asset":"tennis-club-and-courts-sports-bag-73697f1c","position":[1.4,0.1,16.4],"rotation":160},{"asset":"tennis-club-and-courts-tennis-racket-ba639ca5","position":[-1.5,0.1,16.3],"rotation":50},{"asset":"tennis-club-and-courts-court-litter-bin-d3afaee8","position":[-7.6,0.1,16.6],"rotation":0},{"asset":"tennis-club-and-courts-spectator-bleacher-42aff381","position":[2.4,0.1,-17.1],"rotation":0},{"asset":"tennis-club-and-courts-terrace-planter-993ea42a","position":[-4.6,0.1,16.8],"rotation":0},{"asset":"tennis-club-and-courts-terrace-planter-993ea42a","position":[4.6,0.1,16.6],"rotation":0},{"asset":"tennis-club-and-courts-terrace-planter-993ea42a","position":[-14.6,0.1,16.4],"rotation":0},{"asset":"tennis-club-and-courts-terrace-planter-993ea42a","position":[-22.2,0.1,15.6],"rotation":0},{"asset":"tennis-club-and-courts-terrace-planter-993ea42a","position":[-22.4,0.1,2.6],"rotation":0},{"asset":"tennis-club-and-courts-spectator-bleacher-42aff381","position":[10.9,0.1,4.6],"rotation":-90},{"asset":"tennis-club-and-courts-spectator-bleacher-42aff381","position":[10.9,0.1,-4.6],"rotation":-90},{"asset":"tennis-club-and-courts-terrace-planter-993ea42a","position":[10.6,0.1,12.4],"rotation":0},{"asset":"tennis-club-and-courts-terrace-planter-993ea42a","position":[-10.6,0.1,12.8],"rotation":0},{"asset":"tennis-club-and-courts-court-litter-bin-d3afaee8","position":[10.4,0.1,9.2],"rotation":0}],"points":[{"position":[-8.6,0.28,1.5],"title":"Court gate","text":"Fence panels and a windbreak run round the court and the gate swings open. Every panel meets the next on its ports, so a court is enclosed by repeating them.","asset":"tennis-club-and-courts-court-fence-gate-075b8591"},{"position":[0,0.28,2.6],"title":"The court","text":"Surface tiles lay the playing area and the full line set is a separate piece over them, so a court can be marked for singles or doubles without new tiles. The net sags between its posts.","asset":"tennis-club-and-courts-tennis-net-and-posts-9d48dd1c"},{"position":[6.4,0.28,0],"title":"Umpire chair","text":"The chair, the scoreboard and the service speed board stand at the net line, with towels, bottles and a sports bag left at the baseline.","asset":"tennis-club-and-courts-umpire-chair-0422214d"},{"position":[1.4,0.28,-8.2],"title":"Ball machine","text":"A ball machine with a spinning barrel, a hopper and a basket of balls. The strings on the rackets beside it are static geometry: a rigid node transform cannot make a string bed behave.","asset":"tennis-club-and-courts-ball-machine-a177b690"},{"position":[-16.6,0.28,7.8],"title":"Clubhouse","text":"Wall, window, door and gable bays on a four metre grid under roof slopes and a ridge cap. The door opens. Terrace tables, chairs, parasols and planters sit outside it.","asset":"tennis-club-and-courts-clubhouse-door-bay-d8889571"},{"position":[-16.6,0.28,-15.6],"title":"Practice wall","text":"A practice wall and a mini court net for coaching, with the court roller, the line marking trolley and the net winder parked on the surround nearby.","asset":"tennis-club-and-courts-practice-wall-69afc154"}],"poster":{"position":[2.3,3.7,15.8],"lookAt":[0,0.6,0]}},"bounds":{"min":[-26,-0.00017242883348132787,-20.90010672593901],"max":[14.700106725939012,10.192842102050781,20]},"assets":[{"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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);"}}]}}