{"data":{"id":"128","slug":"submarine-interior-and-control-room","title":"Submarine interior and control room","summary":"Walk the staging round a sectioned submarine in a fitting out hall: 50 metres of pressure hull with the shell cut away above the centre line, so the torpedo room, the bunks, the galley, the control room and the machinery are all open to look down into.","url":"https://3dassets.dev/demos/submarine-interior-and-control-room","coverUrl":"https://cdn.3dassets.dev/media/submarine-interior-and-control-room-demo-1.png","featured":true,"pack":{"slug":"submarine-interior-and-control-room","title":"Submarine Interior and Control Room","url":"https://3dassets.dev/packs/submarine-interior-and-control-room","summary":"Modular submarine interior: pressure hull rings and deck plates, a dogged watertight door, periscopes, a helm with two yokes, ballast, sonar and fire control consoles, torpedo tubes and a weapon on its cradle, bunks, a galley, a diesel and the machinery aft.","assetCount":58,"totalBytes":12881568,"starterScene":{"slug":"submarine-interior-and-control-room-cuta-12ad93fc-starter-scene","cdnUrl":"https://cdn.3dassets.dev/assets/36520/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-cuta-12ad93fc-starter-scene","fileSize":6256124}},"placementCount":329,"assetCount":57,"spawn":{"position":[-3.5,2.244,3],"yaw":170},"publishedAt":"2026-09-11T21:15:43.663Z","updatedAt":"2026-09-11T21:15:43.663Z","description":"A 50 metre submarine sitting in a covered fitting out hall, built from 57 of the pack's 58 models as 25 pressure hull ring sections on the 3.8 m diameter. Every ring but three is the cutaway variant, shell gone above the centre line and the frames carrying on over the top as an open cage, so the whole boat is looked down into from outside. The three closed rings are the two end caps at the bow and stern and the one amidships that carries the fin base. A boat is a sealed tube and a walk has no stairs, so this is the only honest way to show an interior pack: it is presented as a sectioned hull on the slip, which is why you can see inside it.\n\nYou walk a staging gantry laid from the pack's own grating deck plates, two metres wide, down both sides of the boat and across both ends, so the loop is about 115 metres. It stands just above the line the shell is cut on, which is what lets you look over the edge into the compartments rather than at the side of a tube. There is no floor under you between the gantries either, so you can walk straight out over the open hull and look down into any compartment from two and a half metres above its deck.\n\nYou start on the starboard staging beside the control room. The search periscope and the attack scope stand up out of the hull in front of you, with the helm and its two yokes and the planesman's seat on the port side, the ballast board beyond them, then sonar and fire control, and the chart table, radar repeater and engine order telegraph opposite. Forward through a dogged bulkhead are the wardroom table and benches and the galley range, sink and urn; then the bunk stacks, the heads cubicle and the stores lockers; then the forward torpedo room with two tube breeches in the bow, a weapon on its loading cradle, a second in the stowage rack, air bottle racks and the crates. Aft of the control room are the two diesels, the battery bank, the switchboard and the fresh water tank, and aft of them again the main motor and its coupling on the shaft line with the tool locker beside it.\n\nPipe runs with valve wheels at their junctions run both bilges the full 50 metres, cable trays are clipped to the frames overhead, and deckhead lamps hang down the length with the ones over the control room rigged for red, so the fit out reads as one continuous installation rather than five separate rooms. The hall floor around the boat carries what has not been fitted yet: a spare ring section and a cutaway ring stood on end, a spare bulkhead, consoles, a periscope, a tube breech, lockers, crates, stacked deck plating, a diesel block, a motor, bunks, the galley and the wardroom furniture.\n\nWhat moves as you come near it: the dogged watertight doors swing, the deck hatches and the escape trunk lid lift, the periscope head trains and its grips fold, the attack scope turns, the helm yokes and the valve wheels and handwheels spin, the ballast levers and the switchboard breakers and the telegraph handle rock, the torpedo tube breech doors swing, the tail shaft turns, and the locker doors, cupboard doors, bench lids and tool drawers open and close.\n\nWhat does not move, and why: cabling, flexible hose, the bunk curtains and the chain lashings are static, because a flexible run needs a joint per element and one rigid node transform cannot give it that. The sonar waterfall is painted rather than running, because a scrolling trace is a shader and not geometry. There is no water and there are no people: the pack has no skinned meshes, so a crew would have to be rigid blocks.\n\nNothing here is a real boat. Every dial face, plate and locker label in the pack is abstract, so no navy, class, name, pennant number, crest or maker is shown anywhere. The download is the whole 58 model pack; the demo itself is 347 placements of 57 of them and fetches each file once.","scene":{"version":1,"spawn":{"position":[-3.5,2.244,3],"yaw":170},"bounds":{"min":[-29,0,-9],"max":[29,9,9]},"ground":{"size":68,"style":"plain"},"environment":{"preset":"hall","wallHeight":9,"wall":"#a9b0b8","floor":"#8f959c","light":"cool","lampHeight":7.5,"shadows":true},"placements":[{"asset":"submarine-interior-and-control-room-hull-ring-section-3af3b61a","position":[-24,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[-22,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[-20,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[-18,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[-16,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[-14,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[-12,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[-10,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[-8,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[-6,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[-4,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[-2,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section-3af3b61a","position":[0,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[2,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[4,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[6,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[8,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[10,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[12,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[14,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[16,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[18,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[20,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[22,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-hull-ring-section-3af3b61a","position":[24,0,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-24,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-22,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-20,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-with-ha-f39b0953","position":[-18,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-16,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-14,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-12,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-10,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-8,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-6,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-4,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-with-ha-f39b0953","position":[-2,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[0,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[2,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[4,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[6,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[8,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-with-ha-f39b0953","position":[10,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[12,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[14,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[16,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[18,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-with-ha-f39b0953","position":[20,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[22,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[24,1.21,0],"rotation":0},{"asset":"submarine-interior-and-control-room-watertight-bulkhea-edeb80fe","position":[13,0.15,0],"rotation":0},{"asset":"submarine-interior-and-control-room-watertight-bulkhea-4578a417","position":[7,0.15,0],"rotation":0},{"asset":"submarine-interior-and-control-room-watertight-bulkhea-edeb80fe","position":[1,0.15,0],"rotation":0},{"asset":"submarine-interior-and-control-room-watertight-bulkhea-4578a417","position":[-9,0.15,0],"rotation":0},{"asset":"submarine-interior-and-control-room-watertight-bulkhea-edeb80fe","position":[-19,0.15,0],"rotation":0},{"asset":"submarine-interior-and-control-room-conning-tower-base-12bcf536","position":[0,3.58,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-24,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-24,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-21,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-21,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-18,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-18,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-15,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-15,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-12,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-12,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-9,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-9,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-6,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-6,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-3,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-3,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[0,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[0,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[3,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[3,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[6,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[6,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[9,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[9,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[12,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[12,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[15,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[15,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[18,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[18,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[21,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[21,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[24,2.1,3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[24,2.1,-3],"rotation":90},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-26.5,2.1,-3],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-26.5,2.1,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-26.5,2.1,3],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[26.5,2.1,-3],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[26.5,2.1,0],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[26.5,2.1,3],"rotation":0},{"asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","position":[-24,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-22,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-20,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-18,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","position":[-16,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-14,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-12,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-10,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","position":[-8,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-6,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-4,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-2,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","position":[0,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[2,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[4,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[6,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","position":[8,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[10,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[12,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[14,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","position":[16,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[18,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[20,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[22,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","position":[24,1.35,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-24,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-22,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","position":[-20,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-18,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-16,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-14,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","position":[-12,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-10,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-8,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-6,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","position":[-4,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[-2,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[0,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[2,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","position":[4,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[6,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[8,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[10,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","position":[12,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[14,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[16,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[18,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","position":[20,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[22,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-service-pipe-run-a0d79913","position":[24,1.35,-1.5],"rotation":0},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-24,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-22,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-20,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-18,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-16,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-14,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-12,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-10,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-8,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-6,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-4,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-2,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[0,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[2,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[4,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[6,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[8,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[10,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[12,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[14,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[16,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[18,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[20,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[22,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[24,1.55,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-22,1.55,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-18,1.55,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-14,1.55,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-10,1.55,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-6,1.55,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[-2,1.55,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[2,1.55,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[6,1.55,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[10,1.55,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[14,1.55,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[18,1.55,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","position":[22,1.55,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-deckhead-light-fit-13f2ad9b","position":[-24,2.7,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-deckhead-light-fit-13f2ad9b","position":[-20,2.7,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-deckhead-light-fit-13f2ad9b","position":[-16,2.7,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-deckhead-light-fit-13f2ad9b","position":[-12,2.7,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-deckhead-light-rig-914d32a5","position":[-8,2.7,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-deckhead-light-rig-914d32a5","position":[-4,2.7,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-deckhead-light-rig-914d32a5","position":[0,2.7,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-deckhead-light-fit-13f2ad9b","position":[4,2.7,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-deckhead-light-fit-13f2ad9b","position":[8,2.7,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-deckhead-light-fit-13f2ad9b","position":[12,2.7,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-deckhead-light-fit-13f2ad9b","position":[16,2.7,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-deckhead-light-fit-13f2ad9b","position":[20,2.7,1.45],"rotation":180},{"asset":"submarine-interior-and-control-room-deckhead-light-fit-13f2ad9b","position":[24,2.7,-1.45],"rotation":0},{"asset":"submarine-interior-and-control-room-torpedo-tube-breec-779114c7","position":[22.6,1.35,-0.62],"rotation":180},{"asset":"submarine-interior-and-control-room-torpedo-tube-breec-779114c7","position":[22.6,1.35,0.62],"rotation":180},{"asset":"submarine-interior-and-control-room-torpedo-on-loading-f40aecaa","position":[18.8,1.35,-0.85],"rotation":0},{"asset":"submarine-interior-and-control-room-torpedo-stowage-ra-b6027bd6","position":[18.8,1.35,0.73],"rotation":0},{"asset":"submarine-interior-and-control-room-compressed-air-bot-d4176bc8","position":[14.4,1.35,-0.75],"rotation":0},{"asset":"submarine-interior-and-control-room-compressed-air-bot-d4176bc8","position":[14.4,1.35,0.75],"rotation":180},{"asset":"submarine-interior-and-control-room-stores-crate-929e4a94","position":[22.4,1.35,-1.35],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-small-d73481d3","position":[22.4,1.89,-1.35],"rotation":0},{"asset":"submarine-interior-and-control-room-first-aid-locker-61151ce3","position":[12.82,2.2,0.95],"rotation":270},{"asset":"submarine-interior-and-control-room-life-ring-on-brack-449f02bf","position":[12.82,1.7,-0.85],"rotation":270},{"asset":"submarine-interior-and-control-room-fire-extinguisher--606568ed","position":[12.82,1.55,1.35],"rotation":270},{"asset":"submarine-interior-and-control-room-bunk-stack-with-cu-374a4fc5","position":[11.4,1.35,-0.94],"rotation":0},{"asset":"submarine-interior-and-control-room-bunk-stack-with-cu-374a4fc5","position":[9.3,1.35,-0.94],"rotation":0},{"asset":"submarine-interior-and-control-room-bunk-stack-with-cu-374a4fc5","position":[11.4,1.35,0.94],"rotation":180},{"asset":"submarine-interior-and-control-room-heads-cubicle-60cab9e9","position":[8.8,1.35,0.765],"rotation":180},{"asset":"submarine-interior-and-control-room-stores-locker-d0b59ff9","position":[7.5,1.35,1.048],"rotation":180},{"asset":"submarine-interior-and-control-room-stores-locker-d0b59ff9","position":[7.8,1.35,-1.048],"rotation":0},{"asset":"submarine-interior-and-control-room-overhead-hatch-and-77c0778f","position":[10.3,1.35,0],"rotation":0},{"asset":"submarine-interior-and-control-room-folding-step-440b1a07","position":[12.7,1.45,-0.2],"rotation":0},{"asset":"submarine-interior-and-control-room-klaxon-with-alarm--d18a50a8","position":[7.18,3.05,0],"rotation":90},{"asset":"submarine-interior-and-control-room-sound-powered-tele-e5964b0e","position":[7.18,2.55,1.35],"rotation":90},{"asset":"submarine-interior-and-control-room-wardroom-table-cc218de3","position":[5.3,1.35,0],"rotation":0},{"asset":"submarine-interior-and-control-room-wardroom-bench-6fcfb55d","position":[5.3,1.35,-0.78],"rotation":0},{"asset":"submarine-interior-and-control-room-wardroom-bench-6fcfb55d","position":[5.3,1.35,0.78],"rotation":180},{"asset":"submarine-interior-and-control-room-coffee-urn-91c723cc","position":[5.95,2.15,0],"rotation":0},{"asset":"submarine-interior-and-control-room-galley-range-4cfe0632","position":[2.6,1.35,0.911],"rotation":180},{"asset":"submarine-interior-and-control-room-galley-sink-unit-78e28cd3","position":[3.8,1.35,0.956],"rotation":180},{"asset":"submarine-interior-and-control-room-stores-locker-low-aacc5953","position":[2.8,1.35,-1.048],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-locker-low-aacc5953","position":[1.7,1.35,-1.048],"rotation":0},{"asset":"submarine-interior-and-control-room-fire-hose-reel-fcc4d893","position":[6.3,1.95,1.5],"rotation":180},{"asset":"submarine-interior-and-control-room-stores-crate-929e4a94","position":[3.7,1.35,-1],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-small-d73481d3","position":[3.7,1.89,-1],"rotation":0},{"asset":"submarine-interior-and-control-room-search-periscope-8477413d","position":[-2.6,1.35,0],"rotation":0},{"asset":"submarine-interior-and-control-room-attack-periscope-s-028b30fe","position":[-4.3,1.35,0],"rotation":0},{"asset":"submarine-interior-and-control-room-helm-station-with--5041df91","position":[-1.9,1.35,-0.904],"rotation":0},{"asset":"submarine-interior-and-control-room-planesman-seat-e3198e71","position":[-1.9,1.35,-0.18],"rotation":180},{"asset":"submarine-interior-and-control-room-ballast-control-pa-d8bbeb9a","position":[-3.9,1.35,-1.129],"rotation":0},{"asset":"submarine-interior-and-control-room-sonar-console-2081dec9","position":[-5.8,1.35,-0.95],"rotation":0},{"asset":"submarine-interior-and-control-room-watchkeepers-stool-f192642d","position":[-5.8,1.35,-0.2],"rotation":180},{"asset":"submarine-interior-and-control-room-fire-control-conso-6871bd79","position":[-7.5,1.35,-0.92],"rotation":0},{"asset":"submarine-interior-and-control-room-watchkeepers-stool-f192642d","position":[-7.5,1.35,-0.15],"rotation":180},{"asset":"submarine-interior-and-control-room-navigation-chart-t-a43495dc","position":[-6.4,1.35,0.81],"rotation":180},{"asset":"submarine-interior-and-control-room-radar-repeater-c6557859","position":[-4.6,1.35,0.974],"rotation":180},{"asset":"submarine-interior-and-control-room-engine-order-teleg-d3c8700a","position":[-3.4,1.35,0.939],"rotation":180},{"asset":"submarine-interior-and-control-room-overhead-hatch-and-77c0778f","position":[-1.6,1.35,1],"rotation":0},{"asset":"submarine-interior-and-control-room-fire-extinguisher--606568ed","position":[0.82,1.55,-1.35],"rotation":270},{"asset":"submarine-interior-and-control-room-depth-gauge-cluste-700280a8","position":[0.82,2.4,-0.7],"rotation":270},{"asset":"submarine-interior-and-control-room-chronometer-and-ba-7bffbdcd","position":[0.82,2.4,0.55],"rotation":270},{"asset":"submarine-interior-and-control-room-sound-powered-tele-e5964b0e","position":[0.82,2.4,1.25],"rotation":270},{"asset":"submarine-interior-and-control-room-high-pressure-air--003272f9","position":[-8.8,1.35,-0.9],"rotation":90},{"asset":"submarine-interior-and-control-room-emergency-breathin-108f5339","position":[-8.8,1.55,0.65],"rotation":90},{"asset":"submarine-interior-and-control-room-sound-powered-tele-e5964b0e","position":[-8.8,3.15,0],"rotation":90},{"asset":"submarine-interior-and-control-room-diesel-engine-bloc-267773e3","position":[-10.9,1.35,-0.551],"rotation":0},{"asset":"submarine-interior-and-control-room-diesel-engine-bloc-267773e3","position":[-14.4,1.35,-0.551],"rotation":0},{"asset":"submarine-interior-and-control-room-battery-bank-175d6eb4","position":[-10.5,1.35,0.777],"rotation":180},{"asset":"submarine-interior-and-control-room-battery-bank-175d6eb4","position":[-13.4,1.35,0.777],"rotation":180},{"asset":"submarine-interior-and-control-room-electrical-switchb-fcb4a81c","position":[-16,1.35,1.023],"rotation":180},{"asset":"submarine-interior-and-control-room-stores-locker-d0b59ff9","position":[-17.8,1.35,1.048],"rotation":180},{"asset":"submarine-interior-and-control-room-fresh-water-tank-fbe184d2","position":[-17.4,1.35,-0.83],"rotation":0},{"asset":"submarine-interior-and-control-room-fire-hose-reel-fcc4d893","position":[-11.3,1.95,1.55],"rotation":180},{"asset":"submarine-interior-and-control-room-klaxon-with-alarm--d18a50a8","position":[-18.82,3.05,0],"rotation":90},{"asset":"submarine-interior-and-control-room-electric-motor-and-14b44502","position":[-21.8,1.35,0],"rotation":0},{"asset":"submarine-interior-and-control-room-tool-locker-76779266","position":[-19.8,1.35,1.034],"rotation":180},{"asset":"submarine-interior-and-control-room-stores-locker-low-aacc5953","position":[-19.8,1.35,-1.048],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-929e4a94","position":[-22.6,1.35,-1.1],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-small-d73481d3","position":[-22.6,1.89,-1.1],"rotation":0},{"asset":"submarine-interior-and-control-room-folding-step-440b1a07","position":[-22.6,1.45,1.15],"rotation":180},{"asset":"submarine-interior-and-control-room-hull-ring-section-3af3b61a","position":[23,0,6],"rotation":90},{"asset":"submarine-interior-and-control-room-hull-ring-section--6121be4b","position":[18.6,0,6],"rotation":90},{"asset":"submarine-interior-and-control-room-torpedo-on-loading-f40aecaa","position":[12,0,5.8],"rotation":0},{"asset":"submarine-interior-and-control-room-torpedo-stowage-ra-b6027bd6","position":[4,0,6],"rotation":0},{"asset":"submarine-interior-and-control-room-watertight-bulkhea-4578a417","position":[-22,0,6.2],"rotation":90},{"asset":"submarine-interior-and-control-room-compressed-air-bot-d4176bc8","position":[-6.5,0,5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-tool-locker-76779266","position":[-9,0,6],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-locker-d0b59ff9","position":[-10.4,0,6],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-locker-d0b59ff9","position":[-11.5,0,6],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-locker-low-aacc5953","position":[-12.8,0,6],"rotation":0},{"asset":"submarine-interior-and-control-room-electrical-switchb-fcb4a81c","position":[-15,0,6.1],"rotation":0},{"asset":"submarine-interior-and-control-room-battery-bank-175d6eb4","position":[-17.4,0,5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-fresh-water-tank-fbe184d2","position":[-20.2,0,5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-diesel-engine-bloc-267773e3","position":[-23.4,0,5.8],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-929e4a94","position":[-4.6,0,5.8],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-small-d73481d3","position":[-4.6,0.54,5.8],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-929e4a94","position":[-3.5,0,6],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-small-d73481d3","position":[-3.5,0.54,6],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-929e4a94","position":[-0.6,0,5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-small-d73481d3","position":[-0.6,0.54,5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-929e4a94","position":[8.6,0,5.8],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-small-d73481d3","position":[8.6,0.54,5.8],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-929e4a94","position":[15.8,0,5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-small-d73481d3","position":[15.8,0.54,5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-929e4a94","position":[21,0,5.8],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-crate-small-d73481d3","position":[21,0.54,5.8],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-16.5,0,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-16.5,0.16,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-16.5,0.32,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-14.2,0,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[-14.2,0.16,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[-14.2,0.32,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[6.5,0,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[6.5,0.16,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[6.5,0.32,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[8.8,0,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","position":[8.8,0.16,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","position":[8.8,0.32,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-electric-motor-and-14b44502","position":[-21,0,-5.8],"rotation":0},{"asset":"submarine-interior-and-control-room-galley-range-4cfe0632","position":[-10.5,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-galley-sink-unit-78e28cd3","position":[-9.2,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-heads-cubicle-60cab9e9","position":[-6.6,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-bunk-stack-with-cu-374a4fc5","position":[-4,0,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-bunk-stack-with-cu-374a4fc5","position":[-2,0,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-wardroom-table-cc218de3","position":[1.2,0,-5.8],"rotation":0},{"asset":"submarine-interior-and-control-room-wardroom-bench-6fcfb55d","position":[1.2,0,-6.6],"rotation":0},{"asset":"submarine-interior-and-control-room-navigation-chart-t-a43495dc","position":[3.6,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-sonar-console-2081dec9","position":[5.2,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-fire-control-conso-6871bd79","position":[11.2,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-radar-repeater-c6557859","position":[12.6,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-ballast-control-pa-d8bbeb9a","position":[13.8,0,-6.1],"rotation":0},{"asset":"submarine-interior-and-control-room-helm-station-with--5041df91","position":[15.4,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-attack-periscope-s-028b30fe","position":[17,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-search-periscope-8477413d","position":[18.3,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-torpedo-tube-breec-779114c7","position":[21,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-compressed-air-bot-d4176bc8","position":[23,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-folding-step-440b1a07","position":[-12,0,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-watchkeepers-stool-f192642d","position":[-5.4,0,-5.8],"rotation":0},{"asset":"submarine-interior-and-control-room-planesman-seat-e3198e71","position":[8,0,-5.8],"rotation":0},{"asset":"submarine-interior-and-control-room-coffee-urn-91c723cc","position":[1.2,0.8,-5.8],"rotation":0},{"asset":"submarine-interior-and-control-room-stores-locker-low-aacc5953","position":[9.6,0,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-tool-locker-76779266","position":[19.6,0,-6],"rotation":0},{"asset":"submarine-interior-and-control-room-engine-order-teleg-d3c8700a","position":[6.6,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-overhead-hatch-and-77c0778f","position":[-17.4,0,-5.9],"rotation":0},{"asset":"submarine-interior-and-control-room-conning-tower-base-12bcf536","position":[-24,0,-6],"rotation":90},{"asset":"submarine-interior-and-control-room-watertight-bulkhea-edeb80fe","position":[-18.5,0,-6.2],"rotation":90}],"points":[{"position":[-4.5,2.244,3],"title":"The control room","text":"The centre of the boat, looked straight down into: the search periscope trains its head and folds its grips, the attack scope turns in its well, and the helm, ballast board, chart table, sonar and fire control stand round them.","asset":"submarine-interior-and-control-room-search-periscope-8477413d"},{"position":[-1.8,2.244,3],"title":"Helm and planes","text":"Two control yokes on the helm station turn as you come alongside, with the planesman's seat behind them and the ballast board and its blowing levers on the port side.","asset":"submarine-interior-and-control-room-helm-station-with--5041df91"},{"position":[-6.8,2.244,3],"title":"Sonar, fire control and the chart","text":"The sonar waterfall and the fire control console down the port side, the chart table with its lit tracing top opposite. The trace on the sonar face is painted, not running: a scrolling display is a shader, not geometry.","asset":"submarine-interior-and-control-room-sonar-console-2081dec9"},{"position":[4.4,2.244,3],"title":"Wardroom and galley","text":"The wardroom table and its two benches on one side, the galley range and sink opposite, with the urn on the table. Bench lids, range door and sink cupboard all open as you pass.","asset":"submarine-interior-and-control-room-wardroom-table-cc218de3"},{"position":[10.4,2.244,3],"title":"Bunks and the heads","text":"Three tier bunk stacks port and starboard with the heads cubicle and the stores lockers between them. The bunk curtains are static: a hanging cloth needs a joint per fold, which one rigid node cannot give.","asset":"submarine-interior-and-control-room-bunk-stack-with-cu-374a4fc5"},{"position":[18.4,2.244,3],"title":"The torpedo room","text":"A weapon on its loading cradle, a second lashed in the stowage rack, air bottle racks against the frames and the escape trunk ladder on the centre line.","asset":"submarine-interior-and-control-room-torpedo-on-loading-f40aecaa"},{"position":[22.4,2.244,3],"title":"The tube breeches","text":"Two tube breech doors in the bow, inside the one closed ring section that caps the boat. Each door swings on its own hinge and the interlock wheel spins.","asset":"submarine-interior-and-control-room-torpedo-tube-breec-779114c7"},{"position":[0.5,2.244,-3],"title":"The fin and the hull rings","text":"The fin base stands on the single closed ring amidships. Every other ring is the cutaway variant, shell gone above the centre line, which is why the whole boat can be looked into from the staging.","asset":"submarine-interior-and-control-room-conning-tower-base-12bcf536"},{"position":[-9.5,2.244,-3],"title":"Services the length of the boat","text":"Pipe runs down both bilges with valve wheels that spin at the junctions, cable trays on the frames overhead, and deckhead lamps rigged for red over the control room.","asset":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2"},{"position":[-13.4,2.244,-3],"title":"The diesels and the battery","text":"Two six cylinder diesels down the port side, the battery bank and the switchboard opposite, the fresh water tank aft. The switchboard breakers rock and the tank valve turns.","asset":"submarine-interior-and-control-room-diesel-engine-bloc-267773e3"},{"position":[-21.4,2.244,-3],"title":"The main motor","text":"The main motor and its coupling on the centre line, tail shaft turning aft into the closed stern section, with the tool locker and an air bottle rack beside it.","asset":"submarine-interior-and-control-room-electric-motor-and-14b44502"},{"position":[13.2,2.244,-3],"title":"The watertight bulkheads","text":"Five bulkheads stand on the ring joints. Two carry a dogged oval door that swings open as you come near it; the others are the open doorway variant, so a compartment stays walkable.","asset":"submarine-interior-and-control-room-watertight-bulkhea-edeb80fe"}],"poster":{"position":[-3,5.8,3.4],"lookAt":[-5,1.8,-0.3]}},"bounds":{"min":[-29,0,-9],"max":[29,9,9]},"assets":[{"id":"36465","slug":"submarine-interior-and-control-room-hull-ring-section-3af3b61a","title":"Pressure Hull Ring Section (Submarine Interior and Control Room)","summary":"A 2 m length of pressure hull on a 3.8 m outer diameter: a 150 mm shell, three internal ring frames with an inner face bar, twelve longitudinal stringers, two clipped cable runs and a lagged service pipe down each bilge.","description":"A 2 m length of pressure hull on a 3.8 m outer diameter: a 150 mm shell, three internal ring frames with an inner face bar, twelve longitudinal stringers, two clipped cable runs and a lagged service pipe down each bilge. Butt it end to end on its hull-aft and hull-fore ports to build a boat of any length. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-hull-ring-section-3af3b61a","cdnUrl":"https://cdn.3dassets.dev/assets/36465/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-hull-ring-section-3af3b61a","thumbnailUrl":"https://cdn.3dassets.dev/assets/36465/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36465/v1/poster.webp","blurhash":"U7Bpz*_3009F_N%MITD%00D$ofxuDiM{s:%M","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"modular","title":"Modular"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":179416,"triangles":4488,"vertices":9302,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-1.000012194855291,0,-1.899999976158142],"max":[1.000012194855291,3.799999952316284,1.899999976158142]},"sizeMeters":[2,3.8,3.8],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:08.844Z","updatedAt":"2026-09-11T21:13:08.981Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36465/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function PressureHullRingSectionSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36465/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36465/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36465/v1/model.glb\" alt=\"Pressure Hull Ring Section (Submarine Interior and Control Room)\" 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/36465/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/36465/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36463","slug":"submarine-interior-and-control-room-hull-ring-section--6121be4b","title":"Pressure Hull Ring Section, Cutaway (Submarine Interior and Control Room)","summary":"The same 2 m hull ring with the shell above the centre line removed and a rolled edge rail down each cut, so the frames, stringers, cable runs and bilge pipework stand as an open cage over a visible compartment.","description":"The same 2 m hull ring with the shell above the centre line removed and a rolled edge rail down each cut, so the frames, stringers, cable runs and bilge pipework stand as an open cage over a visible compartment. This is the section a cutaway set is built from; it shares the hull-aft and hull-fore ports. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-hull-ring-section--6121be4b","cdnUrl":"https://cdn.3dassets.dev/assets/36463/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-hull-ring-section--6121be4b","thumbnailUrl":"https://cdn.3dassets.dev/assets/36463/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36463/v1/poster.webp","blurhash":"U2AKBi-;00RP_3%gMx8_00IUtSMxj]f+IAaK","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"modular","title":"Modular"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":172932,"triangles":4324,"vertices":8954,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-1.000098426090182,0.00010147681768746253,-1.9138882160186768],"max":[1.000098426090182,3.649898618549744,1.9138882160186768]},"sizeMeters":[2,3.65,3.828],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:08.699Z","updatedAt":"2026-09-11T21:13:08.943Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36463/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function PressureHullRingSectionCutawaySubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36463/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36463/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36463/v1/model.glb\" alt=\"Pressure Hull Ring Section, Cutaway (Submarine Interior and Control Room)\" 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/36463/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/36463/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36466","slug":"submarine-interior-and-control-room-deck-plate-section-37d6e9e0","title":"Deck Plate Section (Submarine Interior and Control Room)","summary":"A 2 by 3 m deck plate section 140 mm deep: three transverse bearers and two edge coamings carrying a chequered steel plate. It lays the walking flat inside a hull ring section 550 mm below the centre line, and its deck-aft and deck-fore ports run the flat the length of the boat.","description":"A 2 by 3 m deck plate section 140 mm deep: three transverse bearers and two edge coamings carrying a chequered steel plate. It lays the walking flat inside a hull ring section 550 mm below the centre line, and its deck-aft and deck-fore ports run the flat the length of the boat. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-deck-plate-section-37d6e9e0","cdnUrl":"https://cdn.3dassets.dev/assets/36466/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-deck-plate-section-37d6e9e0","thumbnailUrl":"https://cdn.3dassets.dev/assets/36466/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36466/v1/poster.webp","blurhash":"U8BWoR%M00Rj-;IUM{%M00IU_4t78_.8xuD%","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"modular","title":"Modular"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":156476,"triangles":3840,"vertices":8216,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-1.000061037018952,-0.000060427989866981835,-1.5],"max":[1.000061037018952,0.14400088190204743,1.5]},"sizeMeters":[2,0.144,3],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:08.927Z","updatedAt":"2026-09-11T21:13:09.048Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36466/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function DeckPlateSectionSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36466/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36466/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36466/v1/model.glb\" alt=\"Deck Plate Section (Submarine Interior and Control Room)\" 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/36466/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/36466/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36467","slug":"submarine-interior-and-control-room-deck-plate-grating-96dffde3","title":"Deck Plate Section, Open Grating (Submarine Interior and Control Room)","summary":"The same deck plate section decked in open steel grating instead of plate: twenty two bearer bars on seven cross bars, which is what a machinery space or a bilge access run is floored with. Shares the deck-aft and deck-fore ports.","description":"The same deck plate section decked in open steel grating instead of plate: twenty two bearer bars on seven cross bars, which is what a machinery space or a bilge access run is floored with. Shares the deck-aft and deck-fore ports. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-deck-plate-grating-96dffde3","cdnUrl":"https://cdn.3dassets.dev/assets/36467/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-deck-plate-grating-96dffde3","thumbnailUrl":"https://cdn.3dassets.dev/assets/36467/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36467/v1/poster.webp","blurhash":"U48g,3%g4nR+%MD%M{%M00IT%Ms-D%~qtQD%","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"modular","title":"Modular"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":93132,"triangles":2176,"vertices":4878,"meshes":2,"materials":2,"textures":0,"animations":[],"boundingBox":{"min":[-1.000061037018952,-0.000060427989866981835,-1.5],"max":[1.000061037018952,0.1379748215473613,1.5]},"sizeMeters":[2,0.138,3],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:11.558Z","updatedAt":"2026-09-11T21:13:11.653Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36467/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function DeckPlateSectionOpenGratingSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36467/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36467/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36467/v1/model.glb\" alt=\"Deck Plate Section, Open Grating (Submarine Interior and Control Room)\" 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/36467/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/36467/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36464","slug":"submarine-interior-and-control-room-deck-plate-with-ha-f39b0953","title":"Deck Plate Section with Hatch (Submarine Interior and Control Room)","summary":"The same deck plate section built as four rails round a 780 mm opening, with a raised coaming and a dished lid hinged on its after edge.","description":"The same deck plate section built as four rails round a 780 mm opening, with a raised coaming and a dished lid hinged on its after edge. The lid carries its clamping handwheel and two drop bolts and swings on the hatch node; the wheel is part of the leaf, because a node transform here does not nest inside another one. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: hatch. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-deck-plate-with-ha-f39b0953","cdnUrl":"https://cdn.3dassets.dev/assets/36464/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-deck-plate-with-ha-f39b0953","thumbnailUrl":"https://cdn.3dassets.dev/assets/36464/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36464/v1/poster.webp","blurhash":"U5B3{N-=00RPIU9FbG-;00Mx_3R*%M~qxaD$","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"modular","title":"Modular"},{"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":66024,"triangles":1512,"vertices":3290,"meshes":4,"materials":3,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.000061037018952,0.00007736114326620247,-1.5],"max":[1.000061037018952,0.32199613058856413,1.5]},"sizeMeters":[2,0.322,3],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:08.780Z","updatedAt":"2026-09-11T21:13:08.962Z","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/36464/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 DeckPlateSectionWithHatchSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36464/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/36464/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36464/v1/model.glb\" alt=\"Deck Plate Section with Hatch (Submarine Interior and Control Room)\" 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/36464/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/36464/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36469","slug":"submarine-interior-and-control-room-watertight-bulkhea-edeb80fe","title":"Watertight Bulkhead with Dogged Door (Submarine Interior and Control Room)","summary":"A watertight bulkhead filling a 3.5 m internal hull: stiffened plating, a bolted blank inspection plate and a 720 by 1520 mm oval doorway with a 200 mm sill, closed by a dogged door. The leaf carries six dogs and its dogging wheel and swings on the door node.","description":"A watertight bulkhead filling a 3.5 m internal hull: stiffened plating, a bolted blank inspection plate and a 720 by 1520 mm oval doorway with a 200 mm sill, closed by a dogged door. The leaf carries six dogs and its dogging wheel and swings on the door node. Set it on the joint between two hull ring sections, standing on the deck flat, unrotated: the plating already fills the hull's YZ plane with the door leaf and its dogging wheel toward +X, so turning it 90 degrees lays it fore and aft down the boat instead of across it. Metre units, +Y up, the operator side toward +X, resting on y=0. Named pivoted nodes: door. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-watertight-bulkhea-edeb80fe","cdnUrl":"https://cdn.3dassets.dev/assets/36469/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-watertight-bulkhea-edeb80fe","thumbnailUrl":"https://cdn.3dassets.dev/assets/36469/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36469/v1/poster.webp","blurhash":"U39tW7_3009F~qIU4n%M00Di~q%M9G%N-oe.","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"modular","title":"Modular"},{"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":93720,"triangles":2152,"vertices":4650,"meshes":7,"materials":5,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.11998087178256223,0,-1.75],"max":[0.2247021580775348,3.5,1.75]},"sizeMeters":[0.345,3.5,3.5],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:11.702Z","updatedAt":"2026-09-11T21:13:11.824Z","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/36469/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 WatertightBulkheadWithDoggedDoorSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36469/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/36469/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36469/v1/model.glb\" alt=\"Watertight Bulkhead with Dogged Door (Submarine Interior and Control Room)\" 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/36469/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/36469/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36468","slug":"submarine-interior-and-control-room-watertight-bulkhea-4578a417","title":"Watertight Bulkhead, Open Doorway (Submarine Interior and Control Room)","summary":"The same watertight bulkhead with the door leaf removed, leaving the coamed doorway open. Use it where a compartment has to stay walkable, or as the after face of a bulkhead whose door is modelled on the far side.","description":"The same watertight bulkhead with the door leaf removed, leaving the coamed doorway open. Use it where a compartment has to stay walkable, or as the after face of a bulkhead whose door is modelled on the far side. It stands across the hull unrotated, like the leafed variant. Metre units, +Y up, the operator side toward +X, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-watertight-bulkhea-4578a417","cdnUrl":"https://cdn.3dassets.dev/assets/36468/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-watertight-bulkhea-4578a417","thumbnailUrl":"https://cdn.3dassets.dev/assets/36468/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36468/v1/poster.webp","blurhash":"U28}3@~q004T?wIUIS-=009F?ux]D*t8V=az","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"modular","title":"Modular"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":44776,"triangles":1040,"vertices":2227,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.11998087178256223,0,-1.75],"max":[0.18400000035762787,3.5,1.75]},"sizeMeters":[0.304,3.5,3.5],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:11.611Z","updatedAt":"2026-09-11T21:13:11.723Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36468/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function WatertightBulkheadOpenDoorwaySubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36468/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36468/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36468/v1/model.glb\" alt=\"Watertight Bulkhead, Open Doorway (Submarine Interior and Control Room)\" 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/36468/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/36468/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36471","slug":"submarine-interior-and-control-room-conning-tower-base-12bcf536","title":"Conning Tower Base (Submarine Interior and Control Room)","summary":"The bottom 2.4 m of a fin: a faired tower 2.7 m long and 1.5 m across with free flood slots down each flank, step irons up the after side, a bridge coaming, two masthead fairings and an access trunk with a hinged lid on the hatch node.","description":"The bottom 2.4 m of a fin: a faired tower 2.7 m long and 1.5 m across with free flood slots down each flank, step irons up the after side, a bridge coaming, two masthead fairings and an access trunk with a hinged lid on the hatch node. The underside is flat and seats on the crown of a hull ring section with roughly 220 mm of saddle overlap. It carries no pennant number, crest or marking of any kind. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: hatch. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-conning-tower-base-12bcf536","cdnUrl":"https://cdn.3dassets.dev/assets/36471/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-conning-tower-base-12bcf536","thumbnailUrl":"https://cdn.3dassets.dev/assets/36471/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36471/v1/poster.webp","blurhash":"U6A,:@_300D%aK%MtRM{00IU_Nt6RjRkRjM{","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"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":108132,"triangles":2548,"vertices":5475,"meshes":5,"materials":4,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.350000023841858,-0.00006415509841461997,-0.8500109324486694],"max":[1.350000023841858,3,0.8500109324486694]},"sizeMeters":[2.7,3,1.7],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:14.278Z","updatedAt":"2026-09-11T21:13:14.383Z","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/36471/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 ConningTowerBaseSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36471/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/36471/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36471/v1/model.glb\" alt=\"Conning Tower Base (Submarine Interior and Control Room)\" 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/36471/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/36471/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36474","slug":"submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","title":"Pipe Junction with Valve Wheels (Submarine Interior and Control Room)","summary":"A junction in a 120 mm sea water main: a globe valve with a 340 mm handwheel on the main, a branch tee dropping to the bilge with its own 240 mm wheel, a pressure dial on a standpipe and two hull brackets. Both wheels turn about Z on the wheel-stop and wheel-branch nodes.","description":"A junction in a 120 mm sea water main: a globe valve with a 340 mm handwheel on the main, a branch tee dropping to the bilge with its own 240 mm wheel, a pressure dial on a standpipe and two hull brackets. Both wheels turn about Z on the wheel-stop and wheel-branch nodes. Shares the pipe-aft and pipe-fore ports with the plain run. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: wheel-stop, wheel-branch. Rigid node-transform clips: spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","cdnUrl":"https://cdn.3dassets.dev/assets/36474/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-pipe-junction-with-bd0eacb2","thumbnailUrl":"https://cdn.3dassets.dev/assets/36474/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36474/v1/poster.webp","blurhash":"U57xO1r]4Vt+w0?]NG8{00NF.7WBE24T-p_2","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"modular","title":"Modular"},{"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":130988,"triangles":3156,"vertices":6602,"meshes":9,"materials":7,"textures":0,"animations":["spin"],"boundingBox":{"min":[-1,-0.000015582287100912584,-0.17000000178813934],"max":[1,0.7820026851538026,0.17000000178813934]},"sizeMeters":[2,0.782,0.34],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:14.856Z","updatedAt":"2026-09-11T21:13:14.971Z","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/36474/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 PipeJunctionWithValveWheelsSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36474/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/36474/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36474/v1/model.glb\" alt=\"Pipe Junction with Valve Wheels (Submarine Interior and Control Room)\" 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/36474/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/36474/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36473","slug":"submarine-interior-and-control-room-service-pipe-run-a0d79913","title":"Service Pipe Run (Submarine Interior and Control Room)","summary":"A 2 m run of three service pipes on two hull brackets, flanged at both ends and banded for identification: a 120 mm sea water main, an 88 mm air line and a 72 mm hydraulic line. Its pipe-aft and pipe-fore ports carry the run the length of a compartment.","description":"A 2 m run of three service pipes on two hull brackets, flanged at both ends and banded for identification: a 120 mm sea water main, an 88 mm air line and a 72 mm hydraulic line. Its pipe-aft and pipe-fore ports carry the run the length of a compartment. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-service-pipe-run-a0d79913","cdnUrl":"https://cdn.3dassets.dev/assets/36473/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-service-pipe-run-a0d79913","thumbnailUrl":"https://cdn.3dassets.dev/assets/36473/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36473/v1/poster.webp","blurhash":"U69%|*xv9I?G~p~qWGV?00?G_LIq028w?Zxv","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"modular","title":"Modular"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":106952,"triangles":2600,"vertices":5526,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-1,0.000020286608292341413,-0.08777123325296793],"max":[1,0.7093886819423367,0.08777123325296793]},"sizeMeters":[2,0.709,0.176],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:14.552Z","updatedAt":"2026-09-11T21:13:14.739Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36473/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ServicePipeRunSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36473/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36473/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36473/v1/model.glb\" alt=\"Service Pipe Run (Submarine Interior and Control Room)\" 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/36473/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/36473/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36472","slug":"submarine-interior-and-control-room-cable-run-and-junc-107628bc","title":"Cable Run and Junction Box (Submarine Interior and Control Room)","summary":"A 2 m hung cable tray carrying four bundles, with two hull hangers and a junction box on the outboard face with a bolted blank cover and four glands. The cable is static: a flexible run is not reachable with one rigid node transform, so it is modelled in the position it hangs in.","description":"A 2 m hung cable tray carrying four bundles, with two hull hangers and a junction box on the outboard face with a bolted blank cover and four glands. The cable is static: a flexible run is not reachable with one rigid node transform, so it is modelled in the position it hangs in. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-cable-run-and-junc-107628bc","cdnUrl":"https://cdn.3dassets.dev/assets/36472/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-cable-run-and-junc-107628bc","thumbnailUrl":"https://cdn.3dassets.dev/assets/36472/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36472/v1/poster.webp","blurhash":"U37nXjE100Rjof?bWUIU00-p~qW.NF00sp-;","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":47124,"triangles":1104,"vertices":2299,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-1,-0.00003580393366123258,-0.2400233198963323],"max":[1,0.3620357924895694,0.3779991434278638]},"sizeMeters":[2,0.362,0.618],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:14.343Z","updatedAt":"2026-09-11T21:13:14.437Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36472/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CableRunAndJunctionBoxSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36472/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36472/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36472/v1/model.glb\" alt=\"Cable Run and Junction Box (Submarine Interior and Control Room)\" 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/36472/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/36472/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36491","slug":"submarine-interior-and-control-room-deckhead-light-fit-13f2ad9b","title":"Deckhead Light Fitting (Submarine Interior and Control Room)","summary":"A caged bulkhead lamp on a swan neck bracket, 300 mm deep: a spun reflector, a clear lens and a six bar guard over it. Static geometry; the light itself is the scene's, not the model's.","description":"A caged bulkhead lamp on a swan neck bracket, 300 mm deep: a spun reflector, a clear lens and a six bar guard over it. Static geometry; the light itself is the scene's, not the model's. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-deckhead-light-fit-13f2ad9b","cdnUrl":"https://cdn.3dassets.dev/assets/36491/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-deckhead-light-fit-13f2ad9b","thumbnailUrl":"https://cdn.3dassets.dev/assets/36491/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36491/v1/poster.webp","blurhash":"U5A0{{IU00R*~qtR9FWB00of%M%M4TIU%MWV","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":25328,"triangles":568,"vertices":1187,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.11500133214872629,0,-0.029996643410942454],"max":[0.11500133214872629,0.2950013244001225,0.2921067476272583]},"sizeMeters":[0.23,0.295,0.322],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:29.387Z","updatedAt":"2026-09-11T21:13:29.481Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36491/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function DeckheadLightFittingSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36491/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36491/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36491/v1/model.glb\" alt=\"Deckhead Light Fitting (Submarine Interior and Control Room)\" 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/36491/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/36491/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36493","slug":"submarine-interior-and-control-room-deckhead-light-rig-914d32a5","title":"Deckhead Light, Rigged for Red (Submarine Interior and Control Room)","summary":"The same caged bulkhead lamp with a red lens in it, which is what a control room is lit by when the watch has to keep its night vision. Use it to light a compartment red without changing the fitting.","description":"The same caged bulkhead lamp with a red lens in it, which is what a control room is lit by when the watch has to keep its night vision. Use it to light a compartment red without changing the fitting. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-deckhead-light-rig-914d32a5","cdnUrl":"https://cdn.3dassets.dev/assets/36493/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-deckhead-light-rig-914d32a5","thumbnailUrl":"https://cdn.3dassets.dev/assets/36493/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36493/v1/poster.webp","blurhash":"UAC5@+*y0K3C?Hs:ITWq00GZ=e{|9tNaxuni","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":25392,"triangles":568,"vertices":1187,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.11500133214872629,0,-0.029996643410942454],"max":[0.11500133214872629,0.2950013244001225,0.2921067476272583]},"sizeMeters":[0.23,0.295,0.322],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:29.429Z","updatedAt":"2026-09-11T21:13:29.550Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36493/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function DeckheadLightRiggedForRedSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36493/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36493/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36493/v1/model.glb\" alt=\"Deckhead Light, Rigged for Red (Submarine Interior and Control Room)\" 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/36493/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/36493/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36494","slug":"submarine-interior-and-control-room-torpedo-tube-breec-779114c7","title":"Torpedo Tube Breech (Submarine Interior and Control Room)","summary":"The inboard end of a 540 mm torpedo tube: a saddled tube barrel, a breech ring and a dished breech door with its locking ring, handwheel and interlock handle, all carried on the breech node so the door swings as one piece.","description":"The inboard end of a 540 mm torpedo tube: a saddled tube barrel, a breech ring and a dished breech door with its locking ring, handwheel and interlock handle, all carried on the breech node so the door swings as one piece. A vent handwheel on the wheel-vent node and a small gauge panel sit on the saddle. No marking, service or maker anywhere. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: breech, wheel-vent. Rigid node-transform clips: open, close and spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-torpedo-tube-breec-779114c7","cdnUrl":"https://cdn.3dassets.dev/assets/36494/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-torpedo-tube-breec-779114c7","thumbnailUrl":"https://cdn.3dassets.dev/assets/36494/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36494/v1/poster.webp","blurhash":"U69%^%~q0000~qs:D%M{9FM{xtj]t8%fjXD%","category":{"slug":"weapons-tools","title":"Weapons & Tools"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":206472,"triangles":5088,"vertices":10470,"meshes":11,"materials":7,"textures":0,"animations":["open","close","spin"],"boundingBox":{"min":[-0.9000149531295109,0,-0.42998462150148337],"max":[0.4312513670264773,1.9299999475479126,0.44600000977516174]},"sizeMeters":[1.331,1.93,0.876],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:29.533Z","updatedAt":"2026-09-11T21:13:29.651Z","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/36494/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 TorpedoTubeBreechSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36494/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/36494/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36494/v1/model.glb\" alt=\"Torpedo Tube Breech (Submarine Interior and Control Room)\" 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/36494/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/36494/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36497","slug":"submarine-interior-and-control-room-torpedo-on-loading-f40aecaa","title":"Torpedo on Loading Cradle (Submarine Interior and Control Room)","summary":"A 5.8 m weapon on its loading cradle: a plain finned body 500 mm across with four tail fins, a five bladed propeller and three identification bands, sitting in two timber bolsters with webbing straps over them on a four wheeled frame with tow handles at both ends.","description":"A 5.8 m weapon on its loading cradle: a plain finned body 500 mm across with four tail fins, a five bladed propeller and three identification bands, sitting in two timber bolsters with webbing straps over them on a four wheeled frame with tow handles at both ends. Static geometry, and the body carries no marking, warhead detail, service or maker. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-torpedo-on-loading-f40aecaa","cdnUrl":"https://cdn.3dassets.dev/assets/36497/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-torpedo-on-loading-f40aecaa","thumbnailUrl":"https://cdn.3dassets.dev/assets/36497/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36497/v1/poster.webp","blurhash":"U59H65.800V@?b_3tRIT00xu~qbt9Z00oe?b","category":{"slug":"weapons-tools","title":"Weapons & Tools"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":123944,"triangles":2992,"vertices":6236,"meshes":7,"materials":7,"textures":0,"animations":[],"boundingBox":{"min":[-2.9390720436649937,-0.00001922725701633543,-0.4500704924027855],"max":[2.9000000953674316,1.213419672405744,0.4500704924027855]},"sizeMeters":[5.839,1.213,0.9],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:32.526Z","updatedAt":"2026-09-11T21:13:32.660Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36497/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function TorpedoOnLoadingCradleSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36497/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36497/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36497/v1/model.glb\" alt=\"Torpedo on Loading Cradle (Submarine Interior and Control Room)\" 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/36497/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/36497/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36495","slug":"submarine-interior-and-control-room-torpedo-stowage-ra-b6027bd6","title":"Torpedo Stowage Rack (Submarine Interior and Control Room)","summary":"A two tier stowage rack 4.9 m long: six uprights with grab bars, longitudinal beams, roller saddles on both tiers and lifting eyes on the upright heads, with one plain finned weapon lashed on the lower tier.","description":"A two tier stowage rack 4.9 m long: six uprights with grab bars, longitudinal beams, roller saddles on both tiers and lifting eyes on the upright heads, with one plain finned weapon lashed on the lower tier. Static geometry; chain lashings are modelled where they lie, because a chain is not reachable with one rigid node transform. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-torpedo-stowage-ra-b6027bd6","cdnUrl":"https://cdn.3dassets.dev/assets/36495/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-torpedo-stowage-ra-b6027bd6","thumbnailUrl":"https://cdn.3dassets.dev/assets/36495/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36495/v1/poster.webp","blurhash":"U39j+P-p00%g%M~qj[9F00Rj~qIA9E00og-;","category":{"slug":"weapons-tools","title":"Weapons & Tools"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":187244,"triangles":4648,"vertices":9678,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-2.939072053415984,0.0000456267580193348,-0.5698721264120781],"max":[2.9000000953674316,2.045150907711843,0.5698721264120781]},"sizeMeters":[5.839,2.045,1.14],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:32.524Z","updatedAt":"2026-09-11T21:13:32.658Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36495/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function TorpedoStowageRackSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36495/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36495/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36495/v1/model.glb\" alt=\"Torpedo Stowage Rack (Submarine Interior and Control Room)\" 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/36495/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/36495/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36496","slug":"submarine-interior-and-control-room-compressed-air-bot-d4176bc8","title":"Compressed Air Bottle Rack (Submarine Interior and Control Room)","summary":"A framed rack of six compressed air bottles lying in two rows of three, 1.9 m long and 1.3 m tall: end plates, four rails, bottle valves with 140 mm handwheels on the wheel-bottle-1 to wheel-bottle-6 nodes, a riser and cross pipe manifold, and webbing straps over the top row.","description":"A framed rack of six compressed air bottles lying in two rows of three, 1.9 m long and 1.3 m tall: end plates, four rails, bottle valves with 140 mm handwheels on the wheel-bottle-1 to wheel-bottle-6 nodes, a riser and cross pipe manifold, and webbing straps over the top row. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: wheel-bottle-1, wheel-bottle-2, wheel-bottle-3, wheel-bottle-4, wheel-bottle-5, wheel-bottle-6. Rigid node-transform clips: spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-compressed-air-bot-d4176bc8","cdnUrl":"https://cdn.3dassets.dev/assets/36496/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-compressed-air-bot-d4176bc8","thumbnailUrl":"https://cdn.3dassets.dev/assets/36496/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36496/v1/poster.webp","blurhash":"UAB;8,-;4Tt8?^?bVsDj00WAx]RjL~jFpbR*","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":132948,"triangles":5632,"vertices":11663,"meshes":11,"materials":5,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.9700000286102295,0.000054919800097752436,-0.5499636991949475],"max":[1.0449999570846558,1.2399450897366453,0.5499636991949475]},"sizeMeters":[2.015,1.24,1.1],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:32.529Z","updatedAt":"2026-09-11T21:13:32.672Z","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/36496/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 CompressedAirBottleRackSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36496/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/36496/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36496/v1/model.glb\" alt=\"Compressed Air Bottle Rack (Submarine Interior and Control Room)\" 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/36496/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/36496/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36511","slug":"submarine-interior-and-control-room-stores-crate-929e4a94","title":"Stores Crate (Submarine Interior and Control Room)","summary":"A 0.8 by 0.56 m timber stores crate 540 mm tall with corner irons, top and bottom cleats, two lashing eyes and a plain coloured label strip. Static geometry, and nothing on it is lettered.","description":"A 0.8 by 0.56 m timber stores crate 540 mm tall with corner irons, top and bottom cleats, two lashing eyes and a plain coloured label strip. Static geometry, and nothing on it is lettered. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-stores-crate-929e4a94","cdnUrl":"https://cdn.3dassets.dev/assets/36511/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-stores-crate-929e4a94","thumbnailUrl":"https://cdn.3dassets.dev/assets/36511/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36511/v1/poster.webp","blurhash":"UDF5gI?G02Ip~VxuM{oJ03NHjEobM{t6RjIV","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":31180,"triangles":712,"vertices":1536,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.41260844469070435,-0.0000033503305698623365,-0.28501173550002756],"max":[0.41260844469070435,0.5412018304945009,0.29400238318564736]},"sizeMeters":[0.825,0.541,0.579],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:42.855Z","updatedAt":"2026-09-11T21:13:43.045Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36511/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function StoresCrateSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36511/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36511/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36511/v1/model.glb\" alt=\"Stores Crate (Submarine Interior and Control Room)\" 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/36511/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/36511/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36512","slug":"submarine-interior-and-control-room-stores-crate-small-d73481d3","title":"Stores Crate, Small (Submarine Interior and Control Room)","summary":"The same ironbound timber crate at 0.52 by 0.38 m, for stacking on the larger one or stowing under a bench.","description":"The same ironbound timber crate at 0.52 by 0.38 m, for stacking on the larger one or stowing under a bench. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-stores-crate-small-d73481d3","cdnUrl":"https://cdn.3dassets.dev/assets/36512/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-stores-crate-small-d73481d3","thumbnailUrl":"https://cdn.3dassets.dev/assets/36512/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36512/v1/poster.webp","blurhash":"UDEL$$-:02M|~VxaIpax01RjjEbFE1t7nhM{","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":32096,"triangles":712,"vertices":1561,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.2726084589958191,-0.000011283824389751729,-0.19499487478084682],"max":[0.2726084589958191,0.34120278192029585,0.20400726225699045]},"sizeMeters":[0.545,0.341,0.399],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:43.007Z","updatedAt":"2026-09-11T21:13:43.106Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36512/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function StoresCrateSmallSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36512/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36512/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36512/v1/model.glb\" alt=\"Stores Crate, Small (Submarine Interior and Control Room)\" 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/36512/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/36512/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36505","slug":"submarine-interior-and-control-room-first-aid-locker-61151ce3","title":"First Aid Locker (Submarine Interior and Control Room)","summary":"A 560 mm bulkhead first aid locker with a single door on the door node, marked with a plain raised red cross. No wording, service or maker appears on it.","description":"A 560 mm bulkhead first aid locker with a single door on the door node, marked with a plain raised red cross. No wording, service or maker appears on it. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: door. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-first-aid-locker-61151ce3","cdnUrl":"https://cdn.3dassets.dev/assets/36505/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-first-aid-locker-61151ce3","thumbnailUrl":"https://cdn.3dassets.dev/assets/36505/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36505/v1/poster.webp","blurhash":"UDHLbxD%00kq~qxu9ZE100tR-VnOx[ofMxRj","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":19696,"triangles":352,"vertices":799,"meshes":5,"materials":4,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.280017101492186,0,-0.11998535588324101],"max":[0.280017101492186,0.7200000286102295,0.17899456638668193]},"sizeMeters":[0.56,0.72,0.299],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:38.304Z","updatedAt":"2026-09-11T21:13:38.409Z","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/36505/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 FirstAidLockerSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36505/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/36505/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36505/v1/model.glb\" alt=\"First Aid Locker (Submarine Interior and Control Room)\" 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/36505/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/36505/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36514","slug":"submarine-interior-and-control-room-life-ring-on-brack-449f02bf","title":"Life Ring on Bracket (Submarine Interior and Control Room)","summary":"A 780 mm life ring on a two arm bulkhead bracket, banded in four sectors with a grab line looped round it. Static geometry, and it carries no boat name, port or marking.","description":"A 780 mm life ring on a two arm bulkhead bracket, banded in four sectors with a grab line looped round it. Static geometry, and it carries no boat name, port or marking. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-life-ring-on-brack-449f02bf","cdnUrl":"https://cdn.3dassets.dev/assets/36514/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-life-ring-on-brack-449f02bf","thumbnailUrl":"https://cdn.3dassets.dev/assets/36514/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36514/v1/poster.webp","blurhash":"UEDkcD%10KIo,@s9I:OX00Rj}tozF_OXxGv~","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":101784,"triangles":2544,"vertices":5120,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-0.4189999997615814,0,-0.20427417010068893],"max":[0.4189999997615814,0.8379999995231628,0.4042741730809212]},"sizeMeters":[0.838,0.838,0.609],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:44.389Z","updatedAt":"2026-09-11T21:13:44.603Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36514/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function LifeRingOnBracketSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36514/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36514/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36514/v1/model.glb\" alt=\"Life Ring on Bracket (Submarine Interior and Control Room)\" 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/36514/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/36514/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36507","slug":"submarine-interior-and-control-room-fire-extinguisher--606568ed","title":"Fire Extinguisher on Bracket (Submarine Interior and Control Room)","summary":"A 550 mm extinguisher in two bracket bands on a bulkhead plate, with a squeeze handle, a pressure dial and its horn hose hanging where it hangs. No wording or maker appears on the body.","description":"A 550 mm extinguisher in two bracket bands on a bulkhead plate, with a squeeze handle, a pressure dial and its horn hose hanging where it hangs. No wording or maker appears on the body. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-fire-extinguisher--606568ed","cdnUrl":"https://cdn.3dassets.dev/assets/36507/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-fire-extinguisher--606568ed","thumbnailUrl":"https://cdn.3dassets.dev/assets/36507/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36507/v1/poster.webp","blurhash":"UBDar,#m0071CQX8+HwJ0|S~}Yv~V@WBofoz","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":76836,"triangles":1852,"vertices":3830,"meshes":7,"materials":7,"textures":0,"animations":[],"boundingBox":{"min":[-0.13898001738935395,0,-0.059993589772048786],"max":[0.1104290761696424,0.6539999954402447,0.22599999606609344]},"sizeMeters":[0.249,0.654,0.286],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:40.058Z","updatedAt":"2026-09-11T21:13:40.163Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36507/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function FireExtinguisherOnBracketSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36507/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36507/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36507/v1/model.glb\" alt=\"Fire Extinguisher on Bracket (Submarine Interior and Control Room)\" 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/36507/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/36507/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36498","slug":"submarine-interior-and-control-room-bunk-stack-with-cu-374a4fc5","title":"Bunk Stack with Curtains (Submarine Interior and Control Room)","summary":"A three tier bunk stack 1.96 m long and 2.2 m tall: corner posts, steel pans with crowned mattresses, pillows, fiddle rails, stowage nets under each pan, reading lamps at the heads, and curtain rails with the curtains gathered back at both ends of every berth.","description":"A three tier bunk stack 1.96 m long and 2.2 m tall: corner posts, steel pans with crowned mattresses, pillows, fiddle rails, stowage nets under each pan, reading lamps at the heads, and curtain rails with the curtains gathered back at both ends of every berth. The curtains are static, because hanging cloth is not reachable with one rigid node transform. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-bunk-stack-with-cu-374a4fc5","cdnUrl":"https://cdn.3dassets.dev/assets/36498/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-bunk-stack-with-cu-374a4fc5","thumbnailUrl":"https://cdn.3dassets.dev/assets/36498/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36498/v1/poster.webp","blurhash":"UAAdG.j^00obxvx]RjIT00of~qR*RPj[ofjs","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":353112,"triangles":9168,"vertices":18345,"meshes":5,"materials":5,"textures":0,"animations":[],"boundingBox":{"min":[-0.980067255382961,0,-0.3599623916939842],"max":[0.980067255382961,2.4703922271728516,0.3599623916939842]},"sizeMeters":[1.96,2.47,0.72],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:32.640Z","updatedAt":"2026-09-11T21:13:32.772Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36498/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function BunkStackWithCurtainsSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36498/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36498/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36498/v1/model.glb\" alt=\"Bunk Stack with Curtains (Submarine Interior and Control Room)\" 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/36498/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/36498/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36504","slug":"submarine-interior-and-control-room-heads-cubicle-60cab9e9","title":"Heads Cubicle (Submarine Interior and Control Room)","summary":"A 0.96 by 1.04 m heads cubicle 2.1 m tall: three panelled sides and a deckhead frame, a pan on its pedestal, a small basin, a flushing valve on the wheel-flush node and a louvred door on the door node.","description":"A 0.96 by 1.04 m heads cubicle 2.1 m tall: three panelled sides and a deckhead frame, a pan on its pedestal, a small basin, a flushing valve on the wheel-flush node and a louvred door on the door node. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: wheel-flush, door. Rigid node-transform clips: open, close and spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-heads-cubicle-60cab9e9","cdnUrl":"https://cdn.3dassets.dev/assets/36504/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-heads-cubicle-60cab9e9","thumbnailUrl":"https://cdn.3dassets.dev/assets/36504/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36504/v1/poster.webp","blurhash":"U6FY+A0K00xa?wbHITRk00%M?aoz%NWBMxt7","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":98364,"triangles":2292,"vertices":4796,"meshes":8,"materials":5,"textures":0,"animations":["open","close","spin"],"boundingBox":{"min":[-0.49496487910562637,0,-0.5350501763466662],"max":[0.49496487910562637,2.109999895095825,0.5350501763466662]},"sizeMeters":[0.99,2.11,1.07],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:38.287Z","updatedAt":"2026-09-11T21:13:38.400Z","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/36504/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 HeadsCubicleSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36504/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/36504/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36504/v1/model.glb\" alt=\"Heads Cubicle (Submarine Interior and Control Room)\" 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/36504/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/36504/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36510","slug":"submarine-interior-and-control-room-stores-locker-d0b59ff9","title":"Stores Locker (Submarine Interior and Control Room)","summary":"A 920 mm two door stores locker 1.94 m tall with a plinth, a capping rail, drop handles and a plain coloured label strip on each door. Both doors swing on the door-1 and door-2 nodes. The labels are colour only, so nothing is named.","description":"A 920 mm two door stores locker 1.94 m tall with a plinth, a capping rail, drop handles and a plain coloured label strip on each door. Both doors swing on the door-1 and door-2 nodes. The labels are colour only, so nothing is named. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: door-1, door-2. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-stores-locker-d0b59ff9","cdnUrl":"https://cdn.3dassets.dev/assets/36510/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-stores-locker-d0b59ff9","thumbnailUrl":"https://cdn.3dassets.dev/assets/36510/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36510/v1/poster.webp","blurhash":"UAEo_PIU00ju-;j[IUWB00%M~pM{%Mj[Mxa{","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":24620,"triangles":640,"vertices":1466,"meshes":9,"materials":6,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.4699999988079071,0.000010683784115193828,-0.22997253275817667],"max":[0.4699999988079071,1.9600154141680228,0.2739961515266676]},"sizeMeters":[0.94,1.96,0.504],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:41.450Z","updatedAt":"2026-09-11T21:13:41.550Z","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/36510/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 StoresLockerSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36510/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/36510/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36510/v1/model.glb\" alt=\"Stores Locker (Submarine Interior and Control Room)\" 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/36510/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/36510/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36470","slug":"submarine-interior-and-control-room-overhead-hatch-and-77c0778f","title":"Overhead Hatch and Ladder (Submarine Interior and Control Room)","summary":"The climb out of a compartment: a 2.3 m ladder of two stiles and eight rungs from the deck flat to a 1 m trunk coaming at the hull crown, with a grab rail round it and a dished lid hinged on its after edge.","description":"The climb out of a compartment: a 2.3 m ladder of two stiles and eight rungs from the deck flat to a 1 m trunk coaming at the hull crown, with a grab rail round it and a dished lid hinged on its after edge. The lid takes its clamping wheel and blank plate with it on the hatch node. Stands on the deck, under the crown of a hull ring section. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: hatch. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-overhead-hatch-and-77c0778f","cdnUrl":"https://cdn.3dassets.dev/assets/36470/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-overhead-hatch-and-77c0778f","thumbnailUrl":"https://cdn.3dassets.dev/assets/36470/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36470/v1/poster.webp","blurhash":"U56RM*tR00IU~qt74oM{V?j?o#j]8_WA-=t8","category":{"slug":"buildings","title":"Buildings & Architecture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":74528,"triangles":1752,"vertices":3684,"meshes":5,"materials":3,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.5479583003557564,0,-0.5479583003557564],"max":[0.5479583003557564,2.501993199827109,0.5479583003557564]},"sizeMeters":[1.096,2.502,1.096],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:11.750Z","updatedAt":"2026-09-11T21:13:11.874Z","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/36470/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 OverheadHatchAndLadderSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36470/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/36470/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36470/v1/model.glb\" alt=\"Overhead Hatch and Ladder (Submarine Interior and Control Room)\" 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/36470/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/36470/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36513","slug":"submarine-interior-and-control-room-folding-step-440b1a07","title":"Folding Step (Submarine Interior and Control Room)","summary":"A bulkhead folding step 600 mm wide: a gripped tread on two stays, modelled down and folding flat against its plate on the step node, with a grab rail over it.","description":"A bulkhead folding step 600 mm wide: a gripped tread on two stays, modelled down and folding flat against its plate on the step node, with a grab rail over it. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: step. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-folding-step-440b1a07","cdnUrl":"https://cdn.3dassets.dev/assets/36513/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-folding-step-440b1a07","thumbnailUrl":"https://cdn.3dassets.dev/assets/36513/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36513/v1/poster.webp","blurhash":"UD9%-cIA00%g~qRP9Ft7D*t7t3WAD*t8xtaw","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":32504,"triangles":656,"vertices":1466,"meshes":5,"materials":4,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.3012000024318695,-0.0000025488818329033602,-0.05999359163429602],"max":[0.3012000024318695,0.7665639890517416,0.32000212777007947]},"sizeMeters":[0.602,0.767,0.38],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:44.051Z","updatedAt":"2026-09-11T21:13:44.159Z","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/36513/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 FoldingStepSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36513/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/36513/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36513/v1/model.glb\" alt=\"Folding Step (Submarine Interior and Control Room)\" 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/36513/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/36513/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36490","slug":"submarine-interior-and-control-room-klaxon-with-alarm--d18a50a8","title":"Klaxon with Alarm Push (Submarine Interior and Control Room)","summary":"A twin trumpet klaxon on a bulkhead bracket 280 mm wide, with a red alarm push under the smaller horn. It is static: the diaphragm inside a horn is not something a rigid node transform reaches.","description":"A twin trumpet klaxon on a bulkhead bracket 280 mm wide, with a red alarm push under the smaller horn. It is static: the diaphragm inside a horn is not something a rigid node transform reaches. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-klaxon-with-alarm--d18a50a8","cdnUrl":"https://cdn.3dassets.dev/assets/36490/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-klaxon-with-alarm--d18a50a8","thumbnailUrl":"https://cdn.3dassets.dev/assets/36490/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36490/v1/poster.webp","blurhash":"U6BMi8vf00PpP3KOID#800t8~nM{Ht$%?t9[","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":22668,"triangles":488,"vertices":998,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.1700095298548855,0,-0.11821126364523149],"max":[0.1700095298548855,0.3674173057079315,0.2000009182392049]},"sizeMeters":[0.34,0.367,0.318],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:26.482Z","updatedAt":"2026-09-11T21:13:26.949Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36490/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function KlaxonWithAlarmPushSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36490/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36490/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36490/v1/model.glb\" alt=\"Klaxon with Alarm Push (Submarine Interior and Control Room)\" 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/36490/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/36490/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36492","slug":"submarine-interior-and-control-room-sound-powered-tele-e5964b0e","title":"Sound Powered Telephone (Submarine Interior and Control Room)","summary":"A bulkhead telephone 260 mm wide: a handset on its cradle, a brass selector and a red call push, with the lead modelled in the position it hangs. The lead is static, because a flexible cord is not reachable with one rigid node transform.","description":"A bulkhead telephone 260 mm wide: a handset on its cradle, a brass selector and a red call push, with the lead modelled in the position it hangs. The lead is static, because a flexible cord is not reachable with one rigid node transform. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-sound-powered-tele-e5964b0e","cdnUrl":"https://cdn.3dassets.dev/assets/36492/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-sound-powered-tele-e5964b0e","thumbnailUrl":"https://cdn.3dassets.dev/assets/36492/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36492/v1/poster.webp","blurhash":"U88EC}M{00%N~qRj8_xuWAt7RjM{xuofM{Rj","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":24756,"triangles":516,"vertices":1115,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.13001068203183377,0,-0.06999145511533357],"max":[0.13001068203183377,0.5675216913223267,0.17888867428267238]},"sizeMeters":[0.26,0.568,0.249],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:29.406Z","updatedAt":"2026-09-11T21:13:29.522Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36492/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function SoundPoweredTelephoneSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36492/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36492/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36492/v1/model.glb\" alt=\"Sound Powered Telephone (Submarine Interior and Control Room)\" 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/36492/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/36492/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36502","slug":"submarine-interior-and-control-room-wardroom-table-cc218de3","title":"Wardroom Table (Submarine Interior and Control Room)","summary":"A 1.7 by 0.82 m wardroom table on a single bolted pedestal with a foot rail: a timber top inside a brass fiddle rail, a crumb tray underneath and a condiment fiddle at one end.","description":"A 1.7 by 0.82 m wardroom table on a single bolted pedestal with a foot rail: a timber top inside a brass fiddle rail, a crumb tray underneath and a condiment fiddle at one end. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-wardroom-table-cc218de3","cdnUrl":"https://cdn.3dassets.dev/assets/36502/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-wardroom-table-cc218de3","thumbnailUrl":"https://cdn.3dassets.dev/assets/36502/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36502/v1/poster.webp","blurhash":"UFBpLSxu0KIn~TxZNIWW4:%1%MNI59xtenIV","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":37972,"triangles":880,"vertices":1870,"meshes":3,"materials":3,"textures":0,"animations":[],"boundingBox":{"min":[-0.8600000143051147,0.0000015060573195224691,-0.41996094329343975],"max":[0.8600000143051147,0.7999861204542683,0.41996094329343975]},"sizeMeters":[1.72,0.8,0.84],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:35.458Z","updatedAt":"2026-09-11T21:13:35.671Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36502/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function WardroomTableSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36502/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36502/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36502/v1/model.glb\" alt=\"Wardroom Table (Submarine Interior and Control Room)\" 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/36502/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/36502/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36500","slug":"submarine-interior-and-control-room-wardroom-bench-6fcfb55d","title":"Wardroom Bench (Submarine Interior and Control Room)","summary":"A 1.7 m bench seat that is also a locker: a timber carcass with a padded lid hinged on its after edge on the hatch node, a raked back pad on two brackets and a brass grab rail along the top.","description":"A 1.7 m bench seat that is also a locker: a timber carcass with a padded lid hinged on its after edge on the hatch node, a raked back pad on two brackets and a brass grab rail along the top. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: hatch. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-wardroom-bench-6fcfb55d","cdnUrl":"https://cdn.3dassets.dev/assets/36500/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-wardroom-bench-6fcfb55d","thumbnailUrl":"https://cdn.3dassets.dev/assets/36500/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36500/v1/poster.webp","blurhash":"U6DJ0B~U00%LF~^+-P9Z005AtnMx:|RNA0Ne","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":81588,"triangles":2080,"vertices":4057,"meshes":6,"materials":4,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.8500000238418579,0.0000393681184844806,-0.3334985923318877],"max":[0.8500000238418579,0.9960087790367175,0.2300005502548388]},"sizeMeters":[1.7,0.996,0.563],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:35.426Z","updatedAt":"2026-09-11T21:13:35.541Z","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/36500/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 WardroomBenchSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36500/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/36500/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36500/v1/model.glb\" alt=\"Wardroom Bench (Submarine Interior and Control Room)\" 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/36500/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/36500/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36503","slug":"submarine-interior-and-control-room-coffee-urn-91c723cc","title":"Coffee Urn (Submarine Interior and Control Room)","summary":"A 600 mm stainless coffee urn on a rubber mat: a brass lid, a tap over a drip tray, a sight glass and two carrying handles. Static geometry.","description":"A 600 mm stainless coffee urn on a rubber mat: a brass lid, a tap over a drip tray, a sight glass and two carrying handles. Static geometry. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-coffee-urn-91c723cc","cdnUrl":"https://cdn.3dassets.dev/assets/36503/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-coffee-urn-91c723cc","thumbnailUrl":"https://cdn.3dassets.dev/assets/36503/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36503/v1/poster.webp","blurhash":"U17-c,x[00DkX1E24o^%00tR_3RP~p%LWC9a","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":34440,"triangles":788,"vertices":1629,"meshes":4,"materials":4,"textures":0,"animations":[],"boundingBox":{"min":[-0.21600402855618805,0,-0.15000531029907876],"max":[0.21600402855618805,0.6499999761581421,0.2600029010701303]},"sizeMeters":[0.432,0.65,0.41],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:37.256Z","updatedAt":"2026-09-11T21:13:37.348Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36503/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function CoffeeUrnSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36503/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36503/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36503/v1/model.glb\" alt=\"Coffee Urn (Submarine Interior and Control Room)\" 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/36503/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/36503/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36499","slug":"submarine-interior-and-control-room-galley-range-4cfe0632","title":"Galley Range (Submarine Interior and Control Room)","summary":"A 920 mm galley range: a four ring hob inside a brass sea fiddle, an oven with a glazed drop door on the door-oven node, four control knobs and a pilot lamp. Nothing on it is lettered, so no maker is named.","description":"A 920 mm galley range: a four ring hob inside a brass sea fiddle, an oven with a glazed drop door on the door-oven node, four control knobs and a pilot lamp. Nothing on it is lettered, so no maker is named. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: door-oven. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-galley-range-4cfe0632","cdnUrl":"https://cdn.3dassets.dev/assets/36499/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-galley-range-4cfe0632","thumbnailUrl":"https://cdn.3dassets.dev/assets/36499/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36499/v1/poster.webp","blurhash":"UBA,%pt600M{~oj[IUaxD#RjRkt7t5ofM|Rj","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":58676,"triangles":1328,"vertices":2776,"meshes":7,"materials":5,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.47049999237060547,0,-0.3505336962107987],"max":[0.47049999237060547,0.999981405714679,0.4280181257303726]},"sizeMeters":[0.941,1,0.779],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:34.294Z","updatedAt":"2026-09-11T21:13:34.395Z","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/36499/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 GalleyRangeSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36499/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/36499/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36499/v1/model.glb\" alt=\"Galley Range (Submarine Interior and Control Room)\" 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/36499/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/36499/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36501","slug":"submarine-interior-and-control-room-galley-sink-unit-78e28cd3","title":"Galley Sink Unit (Submarine Interior and Control Room)","summary":"A 1.1 m stainless sink unit with two pressed bowls, a swan neck mixer and a cupboard under it closed by two doors on the door-1 and door-2 nodes.","description":"A 1.1 m stainless sink unit with two pressed bowls, a swan neck mixer and a cupboard under it closed by two doors on the door-1 and door-2 nodes. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: door-1, door-2. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-galley-sink-unit-78e28cd3","cdnUrl":"https://cdn.3dassets.dev/assets/36501/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-galley-sink-unit-78e28cd3","thumbnailUrl":"https://cdn.3dassets.dev/assets/36501/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36501/v1/poster.webp","blurhash":"U6DS?%~q0000xvR-fhxr009G~q-os$%MD+9F","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":31428,"triangles":744,"vertices":1643,"meshes":7,"materials":4,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.5600000023841858,-0.000016480213943591282,-0.3200341820931505],"max":[0.5600000023841858,1.1699999570846558,0.3689921177251281]},"sizeMeters":[1.12,1.17,0.689],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:35.445Z","updatedAt":"2026-09-11T21:13:35.654Z","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/36501/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 GalleySinkUnitSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36501/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/36501/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36501/v1/model.glb\" alt=\"Galley Sink Unit (Submarine Interior and Control Room)\" 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/36501/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/36501/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36509","slug":"submarine-interior-and-control-room-stores-locker-low-aacc5953","title":"Stores Locker, Low (Submarine Interior and Control Room)","summary":"The same two door stores locker at 920 mm, which is what goes under a bunk run or against a bulkhead where a tall one would not clear the deckhead. Both doors swing on the door-1 and door-2 nodes.","description":"The same two door stores locker at 920 mm, which is what goes under a bunk run or against a bulkhead where a tall one would not clear the deckhead. Both doors swing on the door-1 and door-2 nodes. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: door-1, door-2. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-stores-locker-low-aacc5953","cdnUrl":"https://cdn.3dassets.dev/assets/36509/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-stores-locker-low-aacc5953","thumbnailUrl":"https://cdn.3dassets.dev/assets/36509/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36509/v1/poster.webp","blurhash":"UBF=~;IU00M{_4%MIUE100xu_2bH%2M{IUt7","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":24280,"triangles":640,"vertices":1471,"meshes":9,"materials":6,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-0.4699999988079071,0.000010683784115193828,-0.22997253275817667],"max":[0.4699999988079071,0.9400154034391868,0.2739961515266676]},"sizeMeters":[0.94,0.94,0.504],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:41.206Z","updatedAt":"2026-09-11T21:13:41.310Z","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/36509/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 StoresLockerLowSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36509/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/36509/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36509/v1/model.glb\" alt=\"Stores Locker, Low (Submarine Interior and Control Room)\" 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/36509/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/36509/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36508","slug":"submarine-interior-and-control-room-fire-hose-reel-fcc4d893","title":"Fire Hose Reel (Submarine Interior and Control Room)","summary":"A 680 mm swinging arm hose reel on a bulkhead plate: a red drum with five turns of hose wound on it turning about Z on the reel node, a nozzle on its clip and a supply valve on the wheel-hose node.","description":"A 680 mm swinging arm hose reel on a bulkhead plate: a red drum with five turns of hose wound on it turning about Z on the reel node, a nozzle on its clip and a supply valve on the wheel-hose node. The wound hose is part of the drum, because a node transform here does not nest inside another one. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: reel, wheel-hose. Rigid node-transform clips: spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-fire-hose-reel-fcc4d893","cdnUrl":"https://cdn.3dassets.dev/assets/36508/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-fire-hose-reel-fcc4d893","thumbnailUrl":"https://cdn.3dassets.dev/assets/36508/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36508/v1/poster.webp","blurhash":"UECE@1]k0K2[$*xFR*Na0eAW}t]QEeJ7t7$j","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":97512,"triangles":2344,"vertices":4789,"meshes":7,"materials":6,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.3400000035762787,0,-0.1599999964237213],"max":[0.3400000035762787,0.9565550592892316,0.43598180838412437]},"sizeMeters":[0.68,0.957,0.596],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:41.144Z","updatedAt":"2026-09-11T21:13:41.241Z","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/36508/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 FireHoseReelSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36508/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/36508/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36508/v1/model.glb\" alt=\"Fire Hose Reel (Submarine Interior and Control Room)\" 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/36508/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/36508/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36476","slug":"submarine-interior-and-control-room-search-periscope-8477413d","title":"Search Periscope (Submarine Interior and Control Room)","summary":"A 3.1 m search periscope through the deck: a gland and well with a brass training ring, a stepped barrel, an eyepiece housing with a rubber brow and a bearing dial, and an optics head with a window band.","description":"A 3.1 m search periscope through the deck: a gland and well with a brass training ring, a stepped barrel, an eyepiece housing with a rubber brow and a bearing dial, and an optics head with a window band. The head trains on the head node and the two training handles fold up against the barrel on the grip-port and grip-stbd nodes. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: grip-port, grip-stbd, head. Rigid node-transform clips: grip-port-open, grip-port-close, grip-stbd-open, grip-stbd-close and spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-search-periscope-8477413d","cdnUrl":"https://cdn.3dassets.dev/assets/36476/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-search-periscope-8477413d","thumbnailUrl":"https://cdn.3dassets.dev/assets/36476/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36476/v1/poster.webp","blurhash":"U15#kc-;00000Kj^_2WS?wj?8_RkNHM{xZ-;","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":101172,"triangles":2368,"vertices":4880,"meshes":11,"materials":7,"textures":0,"animations":["grip-port-open","grip-port-close","grip-stbd-open","grip-stbd-close","spin"],"boundingBox":{"min":[-0.419999977350235,-0.00001862125857382546,-0.29696036825633504],"max":[0.419999977350235,3.0599999380111695,0.4100009510296161]},"sizeMeters":[0.84,3.06,0.707],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:17.107Z","updatedAt":"2026-09-11T21:13:17.203Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36476/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 SearchPeriscopeSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36476/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/36476/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36476/v1/model.glb\" alt=\"Search Periscope (Submarine Interior and Control Room)\" 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/36476/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/36476/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36477","slug":"submarine-interior-and-control-room-attack-periscope-s-028b30fe","title":"Attack Periscope Stand (Submarine Interior and Control Room)","summary":"The attack periscope housed in its well: a 1.3 m stand with a brass bearing ring graduated in 24 divisions, a capped barrel stub, a boxed hoist frame and a hoist handwheel on the wheel-hoist node. Stands on the deck beside the search periscope.","description":"The attack periscope housed in its well: a 1.3 m stand with a brass bearing ring graduated in 24 divisions, a capped barrel stub, a boxed hoist frame and a hoist handwheel on the wheel-hoist node. Stands on the deck beside the search periscope. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: wheel-hoist. Rigid node-transform clips: spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-attack-periscope-s-028b30fe","cdnUrl":"https://cdn.3dassets.dev/assets/36477/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-attack-periscope-s-028b30fe","thumbnailUrl":"https://cdn.3dassets.dev/assets/36477/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36477/v1/poster.webp","blurhash":"U5A,,+_N0000%Nj?M_og00RP.7xuIAWBxvj]","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":127928,"triangles":3080,"vertices":6534,"meshes":5,"materials":4,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.450017413432486,0,-0.450017413432486],"max":[0.6000000262260436,1.3200000524520874,0.450017413432486]},"sizeMeters":[1.05,1.32,0.9],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:17.359Z","updatedAt":"2026-09-11T21:13:17.473Z","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/36477/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 AttackPeriscopeStandSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36477/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/36477/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36477/v1/model.glb\" alt=\"Attack Periscope Stand (Submarine Interior and Control Room)\" 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/36477/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/36477/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36478","slug":"submarine-interior-and-control-room-helm-station-with--5041df91","title":"Helm Station with Control Yokes (Submarine Interior and Control Room)","summary":"The driving position: a 1.7 m console with a raked desk, two aircraft style control yokes on canted columns, a bank of eight dials over a row of eight switches, a small order screen, red and amber order lamps and a foot rail.","description":"The driving position: a 1.7 m console with a raked desk, two aircraft style control yokes on canted columns, a bank of eight dials over a row of eight switches, a small order screen, red and amber order lamps and a foot rail. Both yokes turn about Z on the yoke-port and yoke-stbd nodes. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: yoke-port, yoke-stbd. Rigid node-transform clips: steer. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-helm-station-with--5041df91","cdnUrl":"https://cdn.3dassets.dev/assets/36478/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-helm-station-with--5041df91","thumbnailUrl":"https://cdn.3dassets.dev/assets/36478/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36478/v1/poster.webp","blurhash":"U7Csv{%M00V@~qtR9FIU00RjWARk?c-;RO9G","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":443080,"triangles":11592,"vertices":24132,"meshes":11,"materials":9,"textures":0,"animations":["steer"],"boundingBox":{"min":[-0.8500000238418579,-0.00003353500983238611,-0.3599795626958056],"max":[0.8500000238418579,1.4200100689082968,0.4320472536371135]},"sizeMeters":[1.7,1.42,0.792],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:17.851Z","updatedAt":"2026-09-11T21:13:17.951Z","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/36478/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 HelmStationWithControlYokesSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36478/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/36478/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36478/v1/model.glb\" alt=\"Helm Station with Control Yokes (Submarine Interior and Control Room)\" 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/36478/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/36478/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36480","slug":"submarine-interior-and-control-room-planesman-seat-e3198e71","title":"Planesman's Seat (Submarine Interior and Control Room)","summary":"A bolted pedestal seat for a watchkeeper at the planes: a deck plate, a clamped column with a foot ring, and a padded pan and raked back on arms. The seat swivels about Y on the seat node.","description":"A bolted pedestal seat for a watchkeeper at the planes: a deck plate, a clamped column with a foot ring, and a padded pan and raked back on arms. The seat swivels about Y on the seat node. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: seat. Rigid node-transform clips: spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-planesman-seat-e3198e71","cdnUrl":"https://cdn.3dassets.dev/assets/36480/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-planesman-seat-e3198e71","thumbnailUrl":"https://cdn.3dassets.dev/assets/36480/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36480/v1/poster.webp","blurhash":"U68N|X%g00Dipyt7q[Rj9?jF-DbcJ3Rjr{oy","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":89092,"triangles":2272,"vertices":4414,"meshes":5,"materials":4,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.257999986410141,-0.0000032037572170844075,-0.32853734493255615],"max":[0.257999986410141,0.8821994499282781,0.24001689149278213]},"sizeMeters":[0.516,0.882,0.569],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:19.966Z","updatedAt":"2026-09-11T21:13:20.163Z","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/36480/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 PlanesmanSSeatSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36480/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/36480/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36480/v1/model.glb\" alt=\"Planesman's Seat (Submarine Interior and Control Room)\" 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/36480/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/36480/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36479","slug":"submarine-interior-and-control-room-ballast-control-pa-d8bbeb9a","title":"Ballast Control Panel (Submarine Interior and Control Room)","summary":"The trim and blowing position: a 1.5 by 1.85 m panel with a lit mimic board of plain blocks and links, six indicator lamps, four blowing levers in a quadrant, two 300 mm vent handwheels and a bank of four gauges.","description":"The trim and blowing position: a 1.5 by 1.85 m panel with a lit mimic board of plain blocks and links, six indicator lamps, four blowing levers in a quadrant, two 300 mm vent handwheels and a bank of four gauges. The levers rock on lever-1 to lever-4 and the wheels turn on wheel-vent-1 and wheel-vent-2. The mimic carries no lettering, so no system or boat is named. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: lever-1, lever-2, lever-3, lever-4, wheel-vent-1, wheel-vent-2. Rigid node-transform clips: tilt and spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-ballast-control-pa-d8bbeb9a","cdnUrl":"https://cdn.3dassets.dev/assets/36479/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-ballast-control-pa-d8bbeb9a","thumbnailUrl":"https://cdn.3dassets.dev/assets/36479/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36479/v1/poster.webp","blurhash":"U4BDZyaf00Rj?v-;IT0K00WB^+t7_4xv8_IA","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":271188,"triangles":7472,"vertices":15692,"meshes":14,"materials":8,"textures":0,"animations":["tilt","spin"],"boundingBox":{"min":[-0.7499763578204695,0,-0.1200189237274025],"max":[0.7499763578204695,1.850000023841858,0.22199241430686378]},"sizeMeters":[1.5,1.85,0.342],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:19.949Z","updatedAt":"2026-09-11T21:13:20.122Z","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/36479/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 BallastControlPanelSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36479/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/36479/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36479/v1/model.glb\" alt=\"Ballast Control Panel (Submarine Interior and Control Room)\" 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/36479/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/36479/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36483","slug":"submarine-interior-and-control-room-sonar-console-2081dec9","title":"Sonar Console with Waterfall Display (Submarine Interior and Control Room)","summary":"A 1.1 m sonar position: a console with a tall waterfall screen over a bearing strip, nine switches and two tuning knobs on the raked desk, and a headset hook on the cheek.","description":"A 1.1 m sonar position: a console with a tall waterfall screen over a bearing strip, nine switches and two tuning knobs on the raked desk, and a headset hook on the cheek. The screen is a plain lit panel: a drawn trace would imply a contact and a scale that do not exist, and it is static because a trace is not reachable with a node transform. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-sonar-console-2081dec9","cdnUrl":"https://cdn.3dassets.dev/assets/36483/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-sonar-console-2081dec9","thumbnailUrl":"https://cdn.3dassets.dev/assets/36483/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36483/v1/poster.webp","blurhash":"U4AAt1_M004T%zS1IAw}00WB-;Ri~W-;EK4-","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":128732,"triangles":3048,"vertices":6571,"meshes":6,"materials":6,"textures":0,"animations":[],"boundingBox":{"min":[-0.5500241108087489,0,-0.3499752807621326],"max":[0.7070000171661377,1.8000063910058512,0.3499752807621326]},"sizeMeters":[1.257,1.8,0.7],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:23.273Z","updatedAt":"2026-09-11T21:13:23.507Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36483/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function SonarConsoleWithWaterfallDisplaySubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36483/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36483/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36483/v1/model.glb\" alt=\"Sonar Console with Waterfall Display (Submarine Interior and Control Room)\" 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/36483/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/36483/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36481","slug":"submarine-interior-and-control-room-watchkeepers-stool-f192642d","title":"Watchkeeper's Stool (Submarine Interior and Control Room)","summary":"The same pedestal at standing watch height with a shallow back pad instead of a full one, for a plotter or a sonar operator. The seat swivels about Y on the seat node.","description":"The same pedestal at standing watch height with a shallow back pad instead of a full one, for a plotter or a sonar operator. The seat swivels about Y on the seat node. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: seat. Rigid node-transform clips: spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-watchkeepers-stool-f192642d","cdnUrl":"https://cdn.3dassets.dev/assets/36481/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-watchkeepers-stool-f192642d","thumbnailUrl":"https://cdn.3dassets.dev/assets/36481/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36481/v1/poster.webp","blurhash":"U584#xxv00IAyZkDR3adI;bHxGjrM^jat9bF","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":83908,"triangles":2128,"vertices":4142,"meshes":5,"materials":4,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.257999986410141,-0.0000032037572170844075,-0.2942706346511841],"max":[0.257999986410141,0.871535679066409,0.24001689149278213]},"sizeMeters":[0.516,0.872,0.534],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:20.277Z","updatedAt":"2026-09-11T21:13:20.597Z","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/36481/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 WatchkeeperSStoolSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36481/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/36481/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36481/v1/model.glb\" alt=\"Watchkeeper's Stool (Submarine Interior and Control Room)\" 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/36481/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/36481/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36485","slug":"submarine-interior-and-control-room-fire-control-conso-6871bd79","title":"Fire Control Console (Submarine Interior and Control Room)","summary":"A 1.35 m fire control position: two lit panels over a bank of three dials, ten switches, six solution knobs on the raked desk and a guarded firing key. Every face is abstract, with no scale, plot or marking that names a weapon, a target or a boat.","description":"A 1.35 m fire control position: two lit panels over a bank of three dials, ten switches, six solution knobs on the raked desk and a guarded firing key. Every face is abstract, with no scale, plot or marking that names a weapon, a target or a boat. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-fire-control-conso-6871bd79","cdnUrl":"https://cdn.3dassets.dev/assets/36485/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-fire-control-conso-6871bd79","thumbnailUrl":"https://cdn.3dassets.dev/assets/36485/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36485/v1/poster.webp","blurhash":"U7BgPV%g00Io%gRPIAoM8_RPMxae_N.8Io9Y","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":245632,"triangles":6112,"vertices":12744,"meshes":9,"materials":9,"textures":0,"animations":[],"boundingBox":{"min":[-0.6749962046741302,0,-0.38001649096657275],"max":[0.6749962046741302,1.7000000476837158,0.38001649096657275]},"sizeMeters":[1.35,1.7,0.76],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:23.363Z","updatedAt":"2026-09-11T21:13:23.695Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36485/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function FireControlConsoleSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36485/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36485/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36485/v1/model.glb\" alt=\"Fire Control Console (Submarine Interior and Control Room)\" 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/36485/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/36485/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36482","slug":"submarine-interior-and-control-room-navigation-chart-t-a43495dc","title":"Navigation Chart Table (Submarine Interior and Control Room)","summary":"The plot: a 1.6 by 0.9 m chart table with a lit tracing top inside a brass fiddle rail, two chart drawers on drawer-1 and drawer-2, a rack of five rolled charts below, a dividers tray and a plotting light on a jointed arm.","description":"The plot: a 1.6 by 0.9 m chart table with a lit tracing top inside a brass fiddle rail, two chart drawers on drawer-1 and drawer-2, a rack of five rolled charts below, a dividers tray and a plotting light on a jointed arm. The charts themselves carry no printed detail of any kind. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: drawer-1, drawer-2. Rigid node-transform clips: open and close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-navigation-chart-t-a43495dc","cdnUrl":"https://cdn.3dassets.dev/assets/36482/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-navigation-chart-t-a43495dc","thumbnailUrl":"https://cdn.3dassets.dev/assets/36482/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36482/v1/poster.webp","blurhash":"U59tZ9IT00%gDhxaxcRQ00NG.k%3RrbJx@Sc","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":53964,"triangles":1240,"vertices":2744,"meshes":10,"materials":8,"textures":0,"animations":["open","close"],"boundingBox":{"min":[-1.0499999523162842,0,-0.47002288478227083],"max":[0.8199999928474426,1.632872865418019,0.5109636593379371]},"sizeMeters":[1.87,1.633,0.981],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:20.666Z","updatedAt":"2026-09-11T21:13:20.797Z","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/36482/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 NavigationChartTableSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36482/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/36482/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36482/v1/model.glb\" alt=\"Navigation Chart Table (Submarine Interior and Control Room)\" 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/36482/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/36482/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36484","slug":"submarine-interior-and-control-room-radar-repeater-c6557859","title":"Radar Repeater (Submarine Interior and Control Room)","summary":"A pedestal radar repeater 1.6 m tall: a round screen behind a brass bezel under a raked reading hood, five switches and two brilliance knobs. The screen is a plain lit disc with no trace, sweep or range ring drawn on it.","description":"A pedestal radar repeater 1.6 m tall: a round screen behind a brass bezel under a raked reading hood, five switches and two brilliance knobs. The screen is a plain lit disc with no trace, sweep or range ring drawn on it. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-radar-repeater-c6557859","cdnUrl":"https://cdn.3dassets.dev/assets/36484/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-radar-repeater-c6557859","thumbnailUrl":"https://cdn.3dassets.dev/assets/36484/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36484/v1/poster.webp","blurhash":"U28;c9xu00ITnMMxo~?wH@WEyCo[xZozD*IB","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":65056,"triangles":1536,"vertices":3160,"meshes":6,"materials":6,"textures":0,"animations":[],"boundingBox":{"min":[-0.3299508595807139,0,-0.2999572689784917],"max":[0.3299508595807139,1.5461384057998657,0.35158386602977315]},"sizeMeters":[0.66,1.546,0.652],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:23.316Z","updatedAt":"2026-09-11T21:13:23.609Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36484/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function RadarRepeaterSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36484/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36484/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36484/v1/model.glb\" alt=\"Radar Repeater (Submarine Interior and Control Room)\" 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/36484/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/36484/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36489","slug":"submarine-interior-and-control-room-engine-order-teleg-d3c8700a","title":"Engine Order Telegraph (Submarine Interior and Control Room)","summary":"A brass pedestal engine order telegraph 1.6 m tall with a glazed dial each side and a handle that rocks across its quadrant on the telegraph node. The dials carry tick marks and no words, so no order and no maker is named.","description":"A brass pedestal engine order telegraph 1.6 m tall with a glazed dial each side and a handle that rocks across its quadrant on the telegraph node. The dials carry tick marks and no words, so no order and no maker is named. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: telegraph. Rigid node-transform clips: tilt. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-engine-order-teleg-d3c8700a","cdnUrl":"https://cdn.3dassets.dev/assets/36489/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-engine-order-teleg-d3c8700a","thumbnailUrl":"https://cdn.3dassets.dev/assets/36489/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36489/v1/poster.webp","blurhash":"U78gjFRk00tQ~pRk4oxtx^WBMwt7D+j=%0bJ","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":57052,"triangles":1404,"vertices":2868,"meshes":5,"materials":4,"textures":0,"animations":["tilt"],"boundingBox":{"min":[-0.3400518850429336,0,-0.33654469789706176],"max":[0.3400518850429336,1.5099999940395354,0.38500117931694494]},"sizeMeters":[0.68,1.51,0.722],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:26.385Z","updatedAt":"2026-09-11T21:13:26.794Z","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/36489/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 EngineOrderTelegraphSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36489/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/36489/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36489/v1/model.glb\" alt=\"Engine Order Telegraph (Submarine Interior and Control Room)\" 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/36489/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/36489/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36488","slug":"submarine-interior-and-control-room-depth-gauge-cluste-700280a8","title":"Depth Gauge Cluster (Submarine Interior and Control Room)","summary":"A bulkhead board of three depth and trim gauges in brass bezels, the largest 380 mm across, with four lamps under them on a stiffened back plate 1.04 m wide. The dial faces carry tick marks and a needle and no numerals, so no depth, scale or maker is stated.","description":"A bulkhead board of three depth and trim gauges in brass bezels, the largest 380 mm across, with four lamps under them on a stiffened back plate 1.04 m wide. The dial faces carry tick marks and a needle and no numerals, so no depth, scale or maker is stated. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-depth-gauge-cluste-700280a8","cdnUrl":"https://cdn.3dassets.dev/assets/36488/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-depth-gauge-cluste-700280a8","thumbnailUrl":"https://cdn.3dassets.dev/assets/36488/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36488/v1/poster.webp","blurhash":"U9D9;o-=4nt7_3~qV[D%00Rk%Mt6IVogofs.","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":157928,"triangles":3952,"vertices":8176,"meshes":7,"materials":7,"textures":0,"animations":[],"boundingBox":{"min":[-0.5199999809265137,0.0000027604206701004053,-0.050016781196401114],"max":[0.5199999809265137,0.6199972443477015,0.09099999815225601]},"sizeMeters":[1.04,0.62,0.141],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:26.359Z","updatedAt":"2026-09-11T21:13:26.649Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36488/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function DepthGaugeClusterSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36488/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36488/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36488/v1/model.glb\" alt=\"Depth Gauge Cluster (Submarine Interior and Control Room)\" 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/36488/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/36488/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36487","slug":"submarine-interior-and-control-room-chronometer-and-ba-7bffbdcd","title":"Chronometer and Barograph Board (Submarine Interior and Control Room)","summary":"A timber instrument board 460 mm wide carrying a chronometer and a gimballed barograph in brass bezels, with a blank builder's plate between them. Both faces are tick marks and a needle only, naming no maker and no reading.","description":"A timber instrument board 460 mm wide carrying a chronometer and a gimballed barograph in brass bezels, with a blank builder's plate between them. Both faces are tick marks and a needle only, naming no maker and no reading. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-chronometer-and-ba-7bffbdcd","cdnUrl":"https://cdn.3dassets.dev/assets/36487/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-chronometer-and-ba-7bffbdcd","thumbnailUrl":"https://cdn.3dassets.dev/assets/36487/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36487/v1/poster.webp","blurhash":"U8E2:]tS00H=^+%L9a4:00i_~qtSnhs+W=Nf","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":108156,"triangles":2640,"vertices":5423,"meshes":6,"materials":6,"textures":0,"animations":[],"boundingBox":{"min":[-0.22999054103090172,0,-0.05998107898543467],"max":[0.22999054103090172,0.6200000047683716,0.11140122570825747]},"sizeMeters":[0.46,0.62,0.171],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:26.328Z","updatedAt":"2026-09-11T21:13:26.597Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36487/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function ChronometerAndBarographBoardSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36487/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36487/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36487/v1/model.glb\" alt=\"Chronometer and Barograph Board (Submarine Interior and Control Room)\" 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/36487/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/36487/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36475","slug":"submarine-interior-and-control-room-high-pressure-air--003272f9","title":"High Pressure Air Manifold (Submarine Interior and Control Room)","summary":"A bulkhead mounted air manifold 1.24 m wide: a flanged 150 mm header on a stiffened back plate, four branch valves with 220 mm handwheels, a drain trap and a bank of four pressure dials over them. Each wheel turns about Z on its own wheel-1 to wheel-4 node.","description":"A bulkhead mounted air manifold 1.24 m wide: a flanged 150 mm header on a stiffened back plate, four branch valves with 220 mm handwheels, a drain trap and a bank of four pressure dials over them. Each wheel turns about Z on its own wheel-1 to wheel-4 node. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: wheel-1, wheel-2, wheel-3, wheel-4. Rigid node-transform clips: spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-high-pressure-air--003272f9","cdnUrl":"https://cdn.3dassets.dev/assets/36475/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-high-pressure-air--003272f9","thumbnailUrl":"https://cdn.3dassets.dev/assets/36475/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36475/v1/poster.webp","blurhash":"U5Bptl-:00M|~q?b9F9E00og-:Rj%N%NRiDi","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":250500,"triangles":7692,"vertices":16058,"meshes":11,"materials":7,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.645009440895068,0,-0.09999999692363123],"max":[0.645009440895068,1.5499999523162842,0.21429326223273965]},"sizeMeters":[1.29,1.55,0.314],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:17.053Z","updatedAt":"2026-09-11T21:13:17.151Z","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/36475/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 HighPressureAirManifoldSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36475/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/36475/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36475/v1/model.glb\" alt=\"High Pressure Air Manifold (Submarine Interior and Control Room)\" 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/36475/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/36475/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36506","slug":"submarine-interior-and-control-room-emergency-breathin-108f5339","title":"Emergency Breathing Apparatus Station (Submarine Interior and Control Room)","summary":"A 1.2 m breathing station: four masks on hooks over a charging manifold with four connection valves on the wheel-eba-1 to wheel-eba-4 nodes, and an amber warning strip along the top.","description":"A 1.2 m breathing station: four masks on hooks over a charging manifold with four connection valves on the wheel-eba-1 to wheel-eba-4 nodes, and an amber warning strip along the top. The hoses are modelled as they hang and are static, because flexible hose is not reachable with one rigid node transform. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: wheel-eba-1, wheel-eba-2, wheel-eba-3, wheel-eba-4. Rigid node-transform clips: spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-emergency-breathin-108f5339","cdnUrl":"https://cdn.3dassets.dev/assets/36506/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-emergency-breathin-108f5339","thumbnailUrl":"https://cdn.3dassets.dev/assets/36506/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36506/v1/poster.webp","blurhash":"U5CP|u9F00o#~q_39F4n00-;x]IUt7%2Rj9Z","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":70900,"triangles":3032,"vertices":6444,"meshes":9,"materials":6,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.6000320444349498,0,-0.08002929866316663],"max":[0.6000320444349498,1.5,0.17594253966323825]},"sizeMeters":[1.2,1.5,0.256],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:38.324Z","updatedAt":"2026-09-11T21:13:38.433Z","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/36506/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 EmergencyBreathingApparatusStationSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36506/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/36506/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36506/v1/model.glb\" alt=\"Emergency Breathing Apparatus Station (Submarine Interior and Control Room)\" 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/36506/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/36506/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36515","slug":"submarine-interior-and-control-room-diesel-engine-bloc-267773e3","title":"Diesel Engine Block (Submarine Interior and Control Room)","summary":"A 3.2 m six cylinder diesel: a bedplate on resilient mounts, a crankcase and block, six heads with rocker covers, an exhaust manifold down one flank and a charge air trunk down the other, a blower forward and a flywheel housing aft.","description":"A 3.2 m six cylinder diesel: a bedplate on resilient mounts, a crankcase and block, six heads with rocker covers, an exhaust manifold down one flank and a charge air trunk down the other, a blower forward and a flywheel housing aft. A small instrument panel carries a blank builder's plate. Static geometry: a crankshaft and a valve train are a linkage, and a linkage is not reachable with one rigid node transform. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-diesel-engine-bloc-267773e3","cdnUrl":"https://cdn.3dassets.dev/assets/36515/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-diesel-engine-bloc-267773e3","thumbnailUrl":"https://cdn.3dassets.dev/assets/36515/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36515/v1/poster.webp","blurhash":"U8BX1TyW00$+.l%zM{IB00RPt+V@M0n5S1In","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":285656,"triangles":7152,"vertices":14858,"meshes":9,"materials":9,"textures":0,"animations":[],"boundingBox":{"min":[-1.6200000047683716,-0.00004516787597132893,-0.6876454342782059],"max":[1.6200000047683716,1.8199729648386807,0.8099668731978172]},"sizeMeters":[3.24,1.82,1.498],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:45.641Z","updatedAt":"2026-09-11T21:13:45.747Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36515/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function DieselEngineBlockSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36515/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36515/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36515/v1/model.glb\" alt=\"Diesel Engine Block (Submarine Interior and Control Room)\" 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/36515/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/36515/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36517","slug":"submarine-interior-and-control-room-battery-bank-175d6eb4","title":"Battery Bank (Submarine Interior and Control Room)","summary":"A tanked battery bank 2.4 by 1.0 m: a coamed tray holding twelve cells in two rows with vent caps and brass links, a vent trunk with two risers over them, a grating lid to walk on, two meters on the outboard face and an amber warning strip. Static geometry.","description":"A tanked battery bank 2.4 by 1.0 m: a coamed tray holding twelve cells in two rows with vent caps and brass links, a vent trunk with two risers over them, a grating lid to walk on, two meters on the outboard face and an amber warning strip. Static geometry. Metre units, +Y up, the operator side toward +Z, resting on y=0. Static geometry; no rig, collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-battery-bank-175d6eb4","cdnUrl":"https://cdn.3dassets.dev/assets/36517/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-battery-bank-175d6eb4","thumbnailUrl":"https://cdn.3dassets.dev/assets/36517/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36517/v1/poster.webp","blurhash":"U4BDsM~p00T100.8xuIB009YX7Mxvf.7.SDi","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"}],"license":{"slug":"cc0-1.0","name":"CC0 1.0 Universal","url":"https://creativecommons.org/publicdomain/zero/1.0/","attributionRequired":false},"contributor":{"username":"3dassets","name":"3D Assets","url":"https://3dassets.dev/u/3dassets"},"stats":{"fileSize":330296,"triangles":8032,"vertices":17204,"meshes":8,"materials":8,"textures":0,"animations":[],"boundingBox":{"min":[-1.2000000476837158,0.00007293427349225334,-0.5000030717192838],"max":[1.2799999713897705,1.4999279693220628,0.5460000038146973]},"sizeMeters":[2.48,1.5,1.046],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:47.085Z","updatedAt":"2026-09-11T21:13:47.401Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36517/v1/model.glb', (gltf) => {\n  scene.add(gltf.scene)\n})","r3f":"import { useGLTF } from '@react-three/drei'\n\nexport function BatteryBankSubmarineInteriorAndControlRoom(props) {\n  const { scene } = useGLTF('https://cdn.3dassets.dev/assets/36517/v1/model.glb')\n  return <primitive object={scene} {...props} />\n}\nuseGLTF.preload('https://cdn.3dassets.dev/assets/36517/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36517/v1/model.glb\" alt=\"Battery Bank (Submarine Interior and Control Room)\" 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/36517/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/36517/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);"}},{"id":"36486","slug":"submarine-interior-and-control-room-electrical-switchb-fcb4a81c","title":"Electrical Switchboard (Submarine Interior and Control Room)","summary":"A 1.3 by 1.95 m switchboard: twenty four moulded breakers in three rows, two isolator handles that rock on lever-iso-1 and lever-iso-2, a bank of three meters, a bolted blank plate, an amber warning strip and an earthing bar.","description":"A 1.3 by 1.95 m switchboard: twenty four moulded breakers in three rows, two isolator handles that rock on lever-iso-1 and lever-iso-2, a bank of three meters, a bolted blank plate, an amber warning strip and an earthing bar. Nothing on it is lettered, so no circuit or maker is named. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: lever-iso-1, lever-iso-2. Rigid node-transform clips: tilt. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-electrical-switchb-fcb4a81c","cdnUrl":"https://cdn.3dassets.dev/assets/36486/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-electrical-switchb-fcb4a81c","thumbnailUrl":"https://cdn.3dassets.dev/assets/36486/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36486/v1/poster.webp","blurhash":"U6AmrHV?00bw~qtQ8_IU9FWU%Mt7$*ofNZR*","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":249088,"triangles":6096,"vertices":13229,"meshes":9,"materials":8,"textures":0,"animations":["tilt"],"boundingBox":{"min":[-0.6500396899578609,0,-0.20995514292514267],"max":[0.6500396899578609,1.9500000476837158,0.34399979002824693]},"sizeMeters":[1.3,1.95,0.554],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:23.617Z","updatedAt":"2026-09-11T21:13:23.753Z","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/36486/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 ElectricalSwitchboardSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36486/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/36486/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36486/v1/model.glb\" alt=\"Electrical Switchboard (Submarine Interior and Control Room)\" 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/36486/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/36486/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36518","slug":"submarine-interior-and-control-room-fresh-water-tank-fbe184d2","title":"Fresh Water Tank (Submarine Interior and Control Room)","summary":"A welded fresh water tank 1.6 by 0.9 m and 1.5 m tall on two saddles with hold down straps: a bolted manhole on the crown, an external sight glass, a flanged draw connection with a stop valve on the wheel-tank node and a blank builder's plate.","description":"A welded fresh water tank 1.6 by 0.9 m and 1.5 m tall on two saddles with hold down straps: a bolted manhole on the crown, an external sight glass, a flanged draw connection with a stop valve on the wheel-tank node and a blank builder's plate. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: wheel-tank. Rigid node-transform clips: spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-fresh-water-tank-fbe184d2","cdnUrl":"https://cdn.3dassets.dev/assets/36518/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-fresh-water-tank-fbe184d2","thumbnailUrl":"https://cdn.3dassets.dev/assets/36518/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36518/v1/poster.webp","blurhash":"UBAK5T?b00M__4%NIAD%IVofWAIUM{s;xuR%","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":83264,"triangles":1952,"vertices":4116,"meshes":6,"materials":5,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.9200000166893005,0,-0.47002867777728763],"max":[1.2699999803304673,1.6280308802142498,0.47002867777728763]},"sizeMeters":[2.19,1.628,0.94],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:47.382Z","updatedAt":"2026-09-11T21:13:47.489Z","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/36518/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 FreshWaterTankSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36518/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/36518/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36518/v1/model.glb\" alt=\"Fresh Water Tank (Submarine Interior and Control Room)\" 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/36518/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/36518/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36516","slug":"submarine-interior-and-control-room-electric-motor-and-14b44502","title":"Electric Motor and Shaft Coupling (Submarine Interior and Control Room)","summary":"A 1.4 m ribbed main motor on a bedframe with a terminal box, brush covers and a blank builder's plate, and 1.6 m of tail shaft aft of it through a bearing pedestal and a stuffing box.","description":"A 1.4 m ribbed main motor on a bedframe with a terminal box, brush covers and a blank builder's plate, and 1.6 m of tail shaft aft of it through a bearing pedestal and a stuffing box. The shaft and its two coupling flanges turn about X on the shaft node and the gland is packed up on the wheel-gland node. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: shaft, wheel-gland. Rigid node-transform clips: spin. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-electric-motor-and-14b44502","cdnUrl":"https://cdn.3dassets.dev/assets/36516/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-electric-motor-and-14b44502","thumbnailUrl":"https://cdn.3dassets.dev/assets/36516/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36516/v1/poster.webp","blurhash":"U79Qv^_N4TROx[.8s;9F00IT%fWGRPD$j=%M","category":{"slug":"props","title":"Props & Furniture"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":210980,"triangles":5304,"vertices":10811,"meshes":6,"materials":4,"textures":0,"animations":["spin"],"boundingBox":{"min":[-0.8500000238418579,-0.000027467974107159288,-0.630043198854467],"max":[2.440000057220459,1.6399295056763394,0.630043198854467]},"sizeMeters":[3.29,1.64,1.26],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:45.763Z","updatedAt":"2026-09-11T21:13:46.190Z","usage":{"threejs":"import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'\nimport { AnimationMixer } from 'three'\n\nlet mixer\n\nconst loader = new GLTFLoader()\nloader.load('https://cdn.3dassets.dev/assets/36516/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 ElectricMotorAndShaftCouplingSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36516/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/36516/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36516/v1/model.glb\" alt=\"Electric Motor and Shaft Coupling (Submarine Interior and Control Room)\" 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/36516/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/36516/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}},{"id":"36519","slug":"submarine-interior-and-control-room-tool-locker-76779266","title":"Tool Locker (Submarine Interior and Control Room)","summary":"A 1 m tool locker 1.66 m tall: a shadow board of plain tool silhouettes behind a single door on the door node, and one deep drawer under it on the drawer node. The silhouettes are outlines only, naming no tool and no maker.","description":"A 1 m tool locker 1.66 m tall: a shadow board of plain tool silhouettes behind a single door on the door node, and one deep drawer under it on the drawer node. The silhouettes are outlines only, naming no tool and no maker. Metre units, +Y up, the operator side toward +Z, resting on y=0. Named pivoted nodes: door, drawer. Rigid node-transform clips: door-open, door-close, drawer-open and drawer-close. No skinning. No collision or navigation data.","status":"published","url":"https://3dassets.dev/assets/submarine-interior-and-control-room-tool-locker-76779266","cdnUrl":"https://cdn.3dassets.dev/assets/36519/v1/model.glb","downloadUrl":"https://3dassets.dev/download/submarine-interior-and-control-room-tool-locker-76779266","thumbnailUrl":"https://cdn.3dassets.dev/assets/36519/v1/thumb.webp","posterUrl":"https://cdn.3dassets.dev/assets/36519/v1/poster.webp","blurhash":"UFB:${WA00M|~qt79FM{Djay%LxaNGRjt6xu","category":{"slug":"weapons-tools","title":"Weapons & Tools"},"tags":[{"slug":"modern","title":"Modern"},{"slug":"realistic","title":"Realistic"},{"slug":"interior","title":"Interior"},{"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":52832,"triangles":1096,"vertices":2464,"meshes":7,"materials":4,"textures":0,"animations":["door-open","door-close","drawer-open","drawer-close"],"boundingBox":{"min":[-0.5099999904632568,0,-0.24001911192928665],"max":[0.5099999904632568,1.6799716391616386,0.29101445506761464]},"sizeMeters":[1.02,1.68,0.531],"hasDraco":false,"hasMeshopt":false,"hasKTX2":false,"extensionsUsed":["KHR_mesh_quantization"]},"aiGenerated":true,"aiModel":"Claude Opus 5","downloads":0,"publishedAt":"2026-09-11T21:13:48.888Z","updatedAt":"2026-09-11T21:13:48.998Z","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/36519/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 ToolLockerSubmarineInteriorAndControlRoom(props) {\n  const { scene, animations } = useGLTF('https://cdn.3dassets.dev/assets/36519/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/36519/v1/model.glb')","modelViewer":"<model-viewer src=\"https://cdn.3dassets.dev/assets/36519/v1/model.glb\" alt=\"Tool Locker (Submarine Interior and Control Room)\" 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/36519/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/36519/v1/model.glb\")) await gltf.InstantiateMainSceneAsync(transform);\n// Clips import as legacy AnimationClips on the root; GetComponent<Animation>().Play() starts the first."}}]}}