Skip to content
Kiln0.10Get Kiln

Jointed pressure suit with a rigid helmet

Earlier examples from earlier Kiln versions.

Historical gallery render of Deep-sea diver; see the poster provenance below.

Drag to orbit after opening. The model starts stationary.

For your engine. The download is a standard glTF 2.0 binary (GLB) with PBR metallic-roughness materials. glTF stores materials, not lighting or tone mapping, so your engine decides how they read. This 3D view tone-maps with Review Neutral, the Khronos PBR Neutral construction with a smaller glare offset (0.015 instead of 0.04), at exposure 0.9. Its Tone mapping control also shows ACES and Linear, for comparison.

Build measurements

Triangles
10,876
Estimated draws
157
Materials
9
Textures
0
Animation clips
0
Bounds X × Y × Z
0.7 × 2.01 × 1.1 m
Build warnings
0

Measurements come from this build.

Download this build

Runtime: 271,904 bytes. Original: 271,676 bytes.

These GLBs are build outputs of the MIT-licensed example source; no separate terms are stated for the builds.

Runtime provenance metadata
SHA-256 download hashes
Runtime GLB
995ed362bb86c3747d85cfb49cb9f78c85342d48b4fafb543dfbbe871484e8d3
Original GLB
316da66b4cd473cfa1ffac90a0b1d37318047e94c4b525bc6bd2e9228d273333
Source
1e461d16ca2e965bdb8fd1e32d9cfff40bf78e835c823065851e6a8558afb8eb

The example source is part of the Kiln repository. Repository licence: MIT.

These GLBs are build outputs of the MIT-licensed example source; no separate terms are stated for the builds.

Recorded authorship

Gemini 3.8 Flash through Antigravity CLI (agy)

Source-header credit

Source access
Source header declares no repository implementation or finished examples supplied
Inherited context
Not independently recorded; source-header declarations only
Starting example
None supplied, according to source header
Human input
Header declares no hand-authored source; other intervention not recorded
Authoring review
Six-view review declared; renderer fidelity not recorded

Gallery GPU render of this exact source. Source, artifact, image hashes and camera settings are recorded alongside the poster; the artifact hash names the GLB bytes the image was rendered from, which the downloadable rebuild reproduces byte for byte only on the platform that recorded it.

Poster camera and render record

The source behind this build

deep-sea-diver.kiln.js
// Authored by: gemini-3.8-flash-high, via agy.
//
// Written by the model itself through the Kiln MCP tools: it wrote the
// program, rendered it, looked at its own six-view contact sheet, and
// revised. Not a line of it is hand-authored.
//
// Dispatched into a clean directory containing only the brief and the Kiln
// skills, with no access to this repository or to any finished example.

const meta = { name: 'DeepSeaDiver', category: 'character' };

async function build() {
  const root = createRoot('DeepSeaDiver');

  // =========================================================================
  // MATERIALS
  // Authentic historical standard diving dress palette
  // =========================================================================
  // Spun copper bonnet and corselet bib
  const copper = gameMaterial(0xc26842, { metalness: 0.85, roughness: 0.32 });
  // Polished cast brass for viewports, neck ring, valves, scabbard, buckles
  const brass = gameMaterial(0xd8b248, { metalness: 0.90, roughness: 0.25 });
  // Heavy vulcanized double-twill canvas diving dress (weathered buff/khaki)
  const canvas = gameMaterial(0xcdbe9e, { roughness: 0.92, metalness: 0.04 });
  // Darker canvas for reinforced knee patches, seams, and folds
  const canvasDark = gameMaterial(0xb2a280, { roughness: 0.95, metalness: 0.04 });
  // Heavy vulcanized black rubber for wrist cuffs, collar gaskets, boot tops
  const rubber = gameMaterial(0x232528, { roughness: 0.80, metalness: 0.12 });
  // Dull cast lead for weighted breastplate, back counterweight, boot soles
  const lead = gameMaterial(0x4f545a, { roughness: 0.65, metalness: 0.55 });
  // Oiled harness leather for belt, weight harness, boot straps
  const leather = gameMaterial(0x482b18, { roughness: 0.84, metalness: 0.08 });
  // Tempered bullseye glass for helmet viewing ports
  const glass = glassMaterial(0x9fd0e8, { opacity: 0.55, roughness: 0.08, metalness: 0.15 });
  // Braided manila hemp rope for lifeline
  const rope = gameMaterial(0xc4af85, { roughness: 0.96, metalness: 0.02 });

  // =========================================================================
  // 1. BOOTS & LEGS (Grounded at Y = 0)
  // Anatomical lead-soled diving boots, contoured brass toe caps,
  // double instep buckles, baggy canvas trousers with knee reinforcements.
  // =========================================================================
  for (const side of [-1, 1]) {
    const z = side * 0.22;
    const sideSuffix = side === 1 ? 'R' : 'L';

    // --- Lead Sole (touching Y = 0) ---
    // Forward sole slab: length 0.22, height 0.045, width 0.15, resting on ground [0 .. 0.045]
    createPart(`SoleFore_${sideSuffix}`, await roundedBoxGeo(0.22, 0.045, 0.15, 0.01, { segments: 3 }), lead, {
      position: [0.08, 0.0225, z],
      parent: root,
    });
    // Raised heel block: length 0.12, height 0.055, width 0.14, resting on ground [0 .. 0.055]
    createPart(`SoleHeel_${sideSuffix}`, await roundedBoxGeo(0.12, 0.055, 0.14, 0.01, { segments: 3 }), lead, {
      position: [-0.07, 0.0275, z],
      parent: root,
    });
    // Brass sole welt / securing flange
    createPart(`SoleWelt_${sideSuffix}`, boxGeo(0.31, 0.012, 0.155), brass, {
      position: [0.025, 0.05, z],
      parent: root,
    });

    // --- Brass Toe Cap (curved shield over the toe) ---
    createPart(`ToeCap_${sideSuffix}`, cylinderGeo(0.075, 0.075, 0.10, 14), brass, {
      position: [0.14, 0.085, z],
      rotation: [0, 0, 90],
      parent: root,
    });
    createPart(`ToeCapTip_${sideSuffix}`, sphereGeo(0.074, 10, 8), brass, {
      position: [0.19, 0.085, z],
      scale: [0.35, 0.9, 0.9],
      parent: root,
    });

    // --- Boot Body (Heavy oiled leather upper) ---
    createPart(`BootBody_${sideSuffix}`, await roundedBoxGeo(0.24, 0.15, 0.13, 0.015, { segments: 3 }), leather, {
      position: [0.01, 0.135, z],
      parent: root,
    });
    // Boot tongue / instep curve
    createPart(`BootVamp_${sideSuffix}`, cylinderGeo(0.065, 0.060, 0.16, 10), leather, {
      position: [0.07, 0.15, z],
      rotation: [-20, 0, 0],
      parent: root,
    });
    // Vulcanized rubber ankle gaiter
    createPart(`BootGaiter_${sideSuffix}`, cylinderGeo(0.090, 0.082, 0.09, 14), rubber, {
      position: [-0.01, 0.24, z],
      parent: root,
    });

    // Leather instep straps & brass buckles securing boot
    createPart(`InstepStrap1_${sideSuffix}`, boxGeo(0.025, 0.035, 0.145), leather, {
      position: [0.05, 0.11, z],
      parent: root,
    });
    createPart(`InstepBuckle1_${sideSuffix}`, boxGeo(0.030, 0.022, 0.035), brass, {
      position: [0.05, 0.125, z + side * 0.070],
      parent: root,
    });
    createPart(`InstepStrap2_${sideSuffix}`, boxGeo(0.025, 0.035, 0.140), leather, {
      position: [-0.01, 0.17, z],
      parent: root,
    });
    createPart(`InstepBuckle2_${sideSuffix}`, boxGeo(0.030, 0.022, 0.035), brass, {
      position: [-0.01, 0.19, z + side * 0.068],
      parent: root,
    });

    // --- Lower Leg / Shin (Heavy canvas diving suit trousers) ---
    createPart(`ShinLower_${sideSuffix}`, cylinderGeo(0.102, 0.090, 0.20, 14), canvas, {
      position: [-0.01, 0.37, z],
      parent: root,
    });
    createPart(`ShinUpper_${sideSuffix}`, cylinderGeo(0.118, 0.102, 0.20, 14), canvas, {
      position: [0.00, 0.54, z],
      parent: root,
    });

    // Calf anti-ballooning cinch strap (keeps air from pooling in feet)
    createPart(`CalfStrap_${sideSuffix}`, cylinderGeo(0.110, 0.110, 0.035, 14), leather, {
      position: [0.0, 0.46, z],
      parent: root,
    });
    createPart(`CalfBuckle_${sideSuffix}`, boxGeo(0.035, 0.040, 0.020), brass, {
      position: [0.0, 0.46, z + side * 0.108],
      parent: root,
    });

    // --- Knee Joint & Heavy Reinforcement Patch ---
    createPart(`KneeJoint_${sideSuffix}`, sphereGeo(0.115, 12, 10), canvasDark, {
      position: [0.02, 0.70, z],
      scale: [1.08, 1.0, 0.95],
      parent: root,
    });
    // Stitched canvas/leather knee patch
    createPart(`KneePad_${sideSuffix}`, await roundedBoxGeo(0.07, 0.15, 0.16, 0.015, { segments: 3 }), canvasDark, {
      position: [0.10, 0.70, z],
      parent: root,
    });
    createPart(`KneeBorder_${sideSuffix}`, boxGeo(0.015, 0.16, 0.17), leather, {
      position: [0.07, 0.70, z],
      parent: root,
    });

    // --- Thigh (Bulky canvas tapering into pelvis) ---
    createPart(`ThighLower_${sideSuffix}`, cylinderGeo(0.135, 0.118, 0.22, 14), canvas, {
      position: [0.01, 0.83, z * 0.96],
      parent: root,
    });
    createPart(`ThighUpper_${sideSuffix}`, cylinderGeo(0.150, 0.135, 0.22, 14), canvas, {
      position: [0.00, 0.99, z * 0.92],
      parent: root,
    });
  }

  // =========================================================================
  // 2. PELVIS, TORSO, BELT & KNIFE SCABBARD (Y = 1.05 to 1.55)
  // Bulky canvas suit, leather diver's belt, brass scabbard, and crotch strap.
  // =========================================================================
  createPart('PelvisLower', cylinderGeo(0.23, 0.20, 0.15, 16), canvas, {
    position: [0.0, 1.08, 0],
    parent: root,
  });
  createPart('PelvisUpper', cylinderGeo(0.255, 0.23, 0.15, 16), canvas, {
    position: [0.0, 1.17, 0],
    parent: root,
  });

  // Torso / Suit body
  createPart('TorsoMid', cylinderGeo(0.275, 0.255, 0.18, 18), canvas, {
    position: [0.01, 1.29, 0],
    parent: root,
  });
  createPart('TorsoUpper', cylinderGeo(0.285, 0.275, 0.18, 18), canvas, {
    position: [0.01, 1.42, 0],
    parent: root,
  });

  // Diver's wide leather waist belt
  createPart('BeltBand', cylinderGeo(0.272, 0.272, 0.085, 20), leather, {
    position: [0.0, 1.16, 0],
    parent: root,
  });
  // Cast brass buckle
  createPart('BeltBuckleFrame', await roundedBoxGeo(0.035, 0.10, 0.12, 0.01, { segments: 3 }), brass, {
    position: [0.275, 1.16, 0],
    parent: root,
  });
  createPart('BeltBuckleProng', cylinderGeo(0.007, 0.007, 0.08, 8), brass, {
    position: [0.285, 1.16, 0],
    parent: root,
  });
  createPart('BeltTongue', boxGeo(0.07, 0.07, 0.018), leather, {
    position: [0.255, 1.16, 0.07],
    parent: root,
  });

  // Crotch strap (jock strap)
  createPart('CrotchStrapFront', boxGeo(0.035, 0.22, 0.07), leather, {
    position: [0.20, 1.05, 0],
    rotation: [-14, 0, 0],
    parent: root,
  });
  createPart('CrotchStrapBack', boxGeo(0.035, 0.22, 0.07), leather, {
    position: [-0.20, 1.05, 0],
    rotation: [14, 0, 0],
    parent: root,
  });

  // --- Diver's Knife & Brass Scabbard (Forward-right hip, clearly visible) ---
  // Belt frog / attachment bracket
  createPart('ScabbardBracket', boxGeo(0.035, 0.09, 0.04), leather, {
    position: [0.20, 1.16, 0.20],
    rotation: [0, 40, 0],
    parent: root,
  });
  // Cast brass threaded mouth
  createPart('ScabbardMouth', cylinderGeo(0.030, 0.028, 0.05, 12), brass, {
    position: [0.22, 1.12, 0.21],
    rotation: [8, 25, -12],
    parent: root,
  });
  // Brass sheath tube angled along upper right leg
  createPart('ScabbardTube', cylinderGeo(0.026, 0.018, 0.34, 12), brass, {
    position: [0.26, 0.94, 0.25],
    rotation: [8, 25, -12],
    parent: root,
  });
  createPart('ScabbardTip', sphereGeo(0.019, 8, 6), brass, {
    position: [0.30, 0.76, 0.29],
    parent: root,
  });
  // Knife hilt (turned brass / ribbed grip with pommel ring)
  createPart('KnifeGuard', cylinderGeo(0.032, 0.032, 0.012, 10), brass, {
    position: [0.21, 1.16, 0.20],
    rotation: [8, 25, -12],
    parent: root,
  });
  createPart('KnifeGrip', cylinderGeo(0.017, 0.015, 0.13, 10), brass, {
    position: [0.19, 1.23, 0.19],
    rotation: [8, 25, -12],
    parent: root,
  });
  createPart('KnifePommel', sphereGeo(0.020, 8, 6), brass, {
    position: [0.17, 1.30, 0.18],
    parent: root,
  });
  createPart('KnifePommelRing', torusGeo(0.014, 0.003, 6, 10), brass, {
    position: [0.16, 1.32, 0.175],
    rotation: [0, 60, 0],
    parent: root,
  });

  // =========================================================================
  // 3. WEIGHTED BREASTPLATE / CORSELET (Y = 1.35 to 1.62)
  // Spun copper corselet collar, brass brails, 12 bolted collar studs,
  // heavy lead chest weight and back weight with suspension lanyards.
  // =========================================================================
  // Copper corselet body (flared bell collar)
  createPart('CorseletBell', cylinderGeo(0.21, 0.30, 0.22, 18), copper, {
    position: [0.0, 1.48, 0],
    parent: root,
  });
  // Front bib plate
  createPart('CorseletBibFront', await roundedBoxGeo(0.10, 0.24, 0.38, 0.03, { segments: 3 }), copper, {
    position: [0.17, 1.42, 0],
    parent: root,
  });
  // Back bib plate
  createPart('CorseletBibBack', await roundedBoxGeo(0.10, 0.24, 0.38, 0.03, { segments: 3 }), copper, {
    position: [-0.17, 1.42, 0],
    parent: root,
  });

  // Brass brails (4 curved clamping bands)
  createPart('BrailFront', boxGeo(0.025, 0.025, 0.34), brass, {
    position: [0.225, 1.34, 0],
    parent: root,
  });
  createPart('BrailBack', boxGeo(0.025, 0.025, 0.34), brass, {
    position: [-0.225, 1.34, 0],
    parent: root,
  });
  for (const side of [-1, 1]) {
    createPart(`BrailSide_${side === 1 ? 'R' : 'L'}`, boxGeo(0.34, 0.025, 0.025), brass, {
      position: [0.0, 1.45, side * 0.25],
      parent: root,
    });
  }

  // Heavy Lead Chest Weight (hung from corselet studs)
  createPart('ChestWeightMain', await roundedBoxGeo(0.065, 0.24, 0.26, 0.015, { segments: 3 }), lead, {
    position: [0.255, 1.36, 0],
    parent: root,
  });
  createPart('ChestWeightBevel', boxGeo(0.015, 0.16, 0.18), lead, {
    position: [0.29, 1.36, 0],
    parent: root,
  });
  for (const side of [-1, 1]) {
    createPart(`WeightLugFront_${side === 1 ? 'R' : 'L'}`, torusGeo(0.022, 0.005, 6, 10), brass, {
      position: [0.26, 1.49, side * 0.09],
      rotation: [0, 90, 0],
      parent: root,
    });
  }

  // Matching Lead Back Weight
  createPart('BackWeightMain', await roundedBoxGeo(0.065, 0.24, 0.26, 0.015, { segments: 3 }), lead, {
    position: [-0.255, 1.36, 0],
    parent: root,
  });
  for (const side of [-1, 1]) {
    createPart(`WeightLugBack_${side === 1 ? 'R' : 'L'}`, torusGeo(0.022, 0.005, 6, 10), brass, {
      position: [-0.26, 1.49, side * 0.09],
      rotation: [0, 90, 0],
      parent: root,
    });
  }

  // Leather suspension straps across shoulders
  for (const side of [-1, 1]) {
    createPart(`WeightStrap_${side === 1 ? 'R' : 'L'}`, boxGeo(0.52, 0.022, 0.040), leather, {
      position: [0.0, 1.55, side * 0.11],
      parent: root,
    });
    createPart(`WeightStrapBuckle_${side === 1 ? 'R' : 'L'}`, boxGeo(0.025, 0.030, 0.045), brass, {
      position: [0.14, 1.51, side * 0.11],
      parent: root,
    });
  }

  // --- Bolted Neck Ring Flange ---
  createPart('NeckRingBase', cylinderGeo(0.205, 0.22, 0.035, 20), brass, {
    position: [0.0, 1.58, 0],
    parent: root,
  });
  createPart('NeckRingRim', torusGeo(0.21, 0.012, 6, 20), brass, {
    position: [0.0, 1.60, 0],
    rotation: [90, 0, 0],
    parent: root,
  });

  // 12 Neck Ring Hex Bolts
  const neckBolt = createPart('SampleNeckBolt', cylinderGeo(0.011, 0.011, 0.030, 6), brass, {
    position: [0.21, 1.61, 0],
    parent: root,
  });
  arrayRadial('NeckBolt', neckBolt, 12, 'y', root);

  // =========================================================================
  // 4. SPUN COPPER HELMET & 4 BULLSEYE PORTS (Y = 1.60 to 1.95)
  // Spun copper dome, front faceplate with 4-bar guard, 2 side ports with 3 bars,
  // top port with 2 bars, spitcock, regulating exhaust valve, and air fittings.
  // =========================================================================
  // Spun copper helmet bonnet
  createPart('BonnetDome', sphereGeo(0.22, 20, 16), copper, {
    position: [0.0, 1.75, 0],
    scale: [1.02, 1.05, 1.0],
    parent: root,
  });
  // Crown ring
  createPart('BonnetCrown', torusGeo(0.075, 0.010, 6, 16), copper, {
    position: [0.0, 1.97, 0],
    rotation: [90, 0, 0],
    parent: root,
  });

  // ----------------------------------------------------
  // PORT 1: FRONT FACEPLATE (Main Bullseye, +X)
  // ----------------------------------------------------
  createPart('FrontPortFrame', cylinderXGeo(0.095, 0.095, 0.045, 20), brass, {
    position: [0.205, 1.75, 0],
    parent: root,
  });
  createPart('FrontPortBezel', torusGeo(0.092, 0.010, 8, 20), brass, {
    position: [0.228, 1.75, 0],
    rotation: [0, 90, 0],
    parent: root,
  });
  createPart('FrontPortGlass', cylinderXGeo(0.080, 0.080, 0.025, 18), glass, {
    position: [0.215, 1.75, 0],
    parent: root,
  });
  // Faceplate hinge & wing-latch
  createPart('FrontPortHinge', cylinderGeo(0.014, 0.014, 0.06, 8), brass, {
    position: [0.205, 1.75, -0.10],
    parent: root,
  });
  createPart('FrontPortLatch', boxGeo(0.025, 0.035, 0.025), brass, {
    position: [0.205, 1.75, 0.10],
    parent: root,
  });
  // 4-Bar Protective Cross Grille
  createPart('FrontBarH', cylinderZGeo(0.006, 0.006, 0.17, 8), brass, {
    position: [0.236, 1.75, 0],
    parent: root,
  });
  createPart('FrontBarV', cylinderGeo(0.006, 0.006, 0.17, 8), brass, {
    position: [0.236, 1.75, 0],
    parent: root,
  });
  createPart('FrontBarD1', cylinderGeo(0.005, 0.005, 0.17, 8), brass, {
    position: [0.235, 1.75, 0],
    rotation: [0, 0, 45],
    parent: root,
  });
  createPart('FrontBarD2', cylinderGeo(0.005, 0.005, 0.17, 8), brass, {
    position: [0.235, 1.75, 0],
    rotation: [0, 0, -45],
    parent: root,
  });

  // ----------------------------------------------------
  // PORT 2: RIGHT SIDE BULLSEYE (+Z)
  // ----------------------------------------------------
  createPart('RightPortFrame', cylinderZGeo(0.075, 0.075, 0.045, 18), brass, {
    position: [0.02, 1.75, 0.205],
    parent: root,
  });
  createPart('RightPortBezel', torusGeo(0.073, 0.009, 6, 18), brass, {
    position: [0.02, 1.75, 0.228],
    parent: root,
  });
  createPart('RightPortGlass', cylinderZGeo(0.063, 0.063, 0.025, 16), glass, {
    position: [0.02, 1.75, 0.215],
    parent: root,
  });
  // 3 Horizontal Protective Bars
  for (const dy of [-0.030, 0.0, 0.030]) {
    createPart(`RightBar_${dy}`, cylinderXGeo(0.005, 0.005, 0.13, 8), brass, {
      position: [0.02, 1.75 + dy, 0.236],
      parent: root,
    });
  }

  // ----------------------------------------------------
  // PORT 3: LEFT SIDE BULLSEYE (-Z)
  // ----------------------------------------------------
  createPart('LeftPortFrame', cylinderZGeo(0.075, 0.075, 0.045, 18), brass, {
    position: [0.02, 1.75, -0.205],
    parent: root,
  });
  createPart('LeftPortBezel', torusGeo(0.073, 0.009, 6, 18), brass, {
    position: [0.02, 1.75, -0.228],
    parent: root,
  });
  createPart('LeftPortGlass', cylinderZGeo(0.063, 0.063, 0.025, 16), glass, {
    position: [0.02, 1.75, -0.215],
    parent: root,
  });
  // 3 Horizontal Protective Bars
  for (const dy of [-0.030, 0.0, 0.030]) {
    createPart(`LeftBar_${dy}`, cylinderXGeo(0.005, 0.005, 0.13, 8), brass, {
      position: [0.02, 1.75 + dy, -0.236],
      parent: root,
    });
  }

  // ----------------------------------------------------
  // PORT 4: TOP VIEWPORT (Angled upward & forward at +X/+Y)
  // ----------------------------------------------------
  createPart('TopPortFrame', cylinderGeo(0.070, 0.070, 0.045, 16), brass, {
    position: [0.11, 1.92, 0],
    rotation: [0, 0, -36],
    parent: root,
  });
  createPart('TopPortBezel', torusGeo(0.068, 0.008, 6, 16), brass, {
    position: [0.125, 1.938, 0],
    rotation: [0, 0, -36],
    parent: root,
  });
  createPart('TopPortGlass', cylinderGeo(0.058, 0.058, 0.025, 14), glass, {
    position: [0.115, 1.926, 0],
    rotation: [0, 0, -36],
    parent: root,
  });
  // 2 Protective Bars
  createPart('TopBar1', cylinderGeo(0.005, 0.005, 0.12, 6), brass, {
    position: [0.132, 1.950, -0.022],
    rotation: [0, 0, -36],
    parent: root,
  });
  createPart('TopBar2', cylinderGeo(0.005, 0.005, 0.12, 6), brass, {
    position: [0.132, 1.950, 0.022],
    rotation: [0, 0, -36],
    parent: root,
  });

  // ----------------------------------------------------
  // HELMET FITTINGS
  // ----------------------------------------------------
  // Spitcock valve on lower front-left
  createPart('SpitcockBody', cylinderGeo(0.014, 0.014, 0.045, 8), brass, {
    position: [0.18, 1.67, -0.10],
    rotation: [45, 30, 0],
    parent: root,
  });
  createPart('SpitcockLever', cylinderGeo(0.005, 0.003, 0.045, 6), brass, {
    position: [0.20, 1.65, -0.11],
    rotation: [0, 0, 90],
    parent: root,
  });

  // Regulating exhaust valve on right-rear (+Z, -X)
  createPart('ExhaustMount', cylinderGeo(0.035, 0.035, 0.035, 12), brass, {
    position: [-0.07, 1.73, 0.19],
    rotation: [25, 45, 0],
    parent: root,
  });
  createPart('ExhaustWheel', cylinderGeo(0.038, 0.038, 0.015, 10), brass, {
    position: [-0.09, 1.74, 0.22],
    rotation: [25, 45, 0],
    parent: root,
  });
  createPart('ExhaustDeflector', cylinderGeo(0.022, 0.032, 0.05, 10), copper, {
    position: [-0.12, 1.70, 0.18],
    rotation: [45, 0, -60],
    parent: root,
  });

  // Telephone / comms cup on left-rear (-Z, -X)
  createPart('CommsCup', cylinderGeo(0.028, 0.028, 0.025, 10), brass, {
    position: [-0.09, 1.79, -0.18],
    rotation: [-25, -45, 0],
    parent: root,
  });

  // Lifting eyes on top of helmet
  for (const side of [-1, 1]) {
    createPart(`LiftEye_${side === 1 ? 'R' : 'L'}`, torusGeo(0.020, 0.004, 6, 10), brass, {
      position: [0.0, 1.96, side * 0.11],
      rotation: [0, 90, 0],
      parent: root,
    });
  }

  // =========================================================================
  // 5. ARMS & DIVER'S MITTENS (Natural relaxed stance at sides)
  // Sleeves hang naturally slightly away from hips to prevent interpenetration.
  // =========================================================================
  for (const side of [-1, 1]) {
    const zSign = side;
    const sideSuffix = side === 1 ? 'R' : 'L';

    // Shoulder cloth bulge
    createPart(`ShoulderJoint_${sideSuffix}`, sphereGeo(0.13, 12, 10), canvasDark, {
      position: [0.0, 1.49, zSign * 0.34],
      parent: root,
    });

    // Upper arm (hanging down with 12° outward tilt, slight forward slant)
    createPart(`UpperArmTop_${sideSuffix}`, cylinderGeo(0.108, 0.098, 0.17, 12), canvas, {
      position: [0.01, 1.39, zSign * 0.38],
      rotation: [0, 0, zSign * 12],
      parent: root,
    });
    createPart(`UpperArmBot_${sideSuffix}`, cylinderGeo(0.098, 0.090, 0.17, 12), canvas, {
      position: [0.02, 1.25, zSign * 0.41],
      rotation: [0, 0, zSign * 12],
      parent: root,
    });

    // Elbow joint
    createPart(`ElbowJoint_${sideSuffix}`, sphereGeo(0.095, 10, 8), canvasDark, {
      position: [0.03, 1.14, zSign * 0.43],
      parent: root,
    });

    // Forearm (slanted slightly forward 8° and outward)
    createPart(`ForearmTop_${sideSuffix}`, cylinderGeo(0.090, 0.082, 0.15, 12), canvas, {
      position: [0.05, 1.03, zSign * 0.44],
      rotation: [-8 * zSign, 0, 8],
      parent: root,
    });
    createPart(`ForearmBot_${sideSuffix}`, cylinderGeo(0.082, 0.075, 0.15, 12), canvas, {
      position: [0.07, 0.90, zSign * 0.45],
      rotation: [-8 * zSign, 0, 8],
      parent: root,
    });

    // Heavy vulcanized rubber wrist cuff (seals gauntlet)
    createPart(`RubberCuffFlare_${sideSuffix}`, cylinderGeo(0.088, 0.078, 0.07, 14), rubber, {
      position: [0.09, 0.81, zSign * 0.455],
      rotation: [-8 * zSign, 0, 8],
      parent: root,
    });
    createPart(`RubberCuffRing_${sideSuffix}`, torusGeo(0.084, 0.008, 6, 14), rubber, {
      position: [0.095, 0.78, zSign * 0.46],
      rotation: [0, 90, 0],
      parent: root,
    });

    // Diver's 3-finger mitten
    createPart(`GlovePalm_${sideSuffix}`, await roundedBoxGeo(0.060, 0.10, 0.080, 0.012, { segments: 3 }), rubber, {
      position: [0.11, 0.71, zSign * 0.46],
      rotation: [0, 0, 6],
      parent: root,
    });
    createPart(`GloveFingers_${sideSuffix}`, cylinderGeo(0.035, 0.030, 0.08, 10), rubber, {
      position: [0.12, 0.63, zSign * 0.46],
      rotation: [0, 0, 6],
      parent: root,
    });
    createPart(`GloveThumb_${sideSuffix}`, cylinderGeo(0.018, 0.014, 0.06, 8), rubber, {
      position: [0.13, 0.70, zSign * 0.425],
      rotation: [25 * zSign, 0, -15],
      parent: root,
    });
  }

  // =========================================================================
  // 6. AIR HOSE & LIFELINE (Coiled gracefully behind helmet at -X)
  // Inlet elbow, lifeline bridle shackle, ribbed air hose and braided rope.
  // =========================================================================
  createPart('AirInletValve', cylinderGeo(0.028, 0.028, 0.07, 10), brass, {
    position: [-0.20, 1.76, -0.06],
    rotation: [0, 0, 90],
    parent: root,
  });
  createPart('AirInletElbow', cylinderGeo(0.024, 0.024, 0.045, 10), brass, {
    position: [-0.24, 1.74, -0.06],
    rotation: [0, 45, 90],
    parent: root,
  });

  createPart('LifelineShackle', torusGeo(0.020, 0.005, 6, 12), brass, {
    position: [-0.22, 1.67, 0.06],
    rotation: [0, 90, 0],
    parent: root,
  });

  // Supply air hose: smooth hanging loop descending from inlet into coiled turns
  const airHoseSpline = [
    [-0.25, 1.74, -0.06],
    [-0.32, 1.67, -0.08],
    [-0.36, 1.52, -0.11],
    [-0.35, 1.35, -0.15],
    [-0.31, 1.20, -0.20],
    [-0.25, 1.08, -0.24],
    [-0.18, 1.00, -0.22],
    [-0.17, 0.91, -0.17],
    [-0.22, 0.85, -0.12],
    [-0.29, 0.84, -0.11],
    [-0.34, 0.89, -0.14],
    [-0.35, 0.98, -0.20],
    [-0.31, 1.06, -0.26],
    [-0.23, 1.08, -0.27],
    [-0.17, 1.02, -0.24],
    [-0.16, 0.94, -0.18],
    [-0.21, 0.88, -0.13],
    [-0.27, 0.86, -0.10],
  ];
  const airHoseGeo = curveToMesh(airHoseSpline, 0.019, 36, 8);
  createPart('AirHose', airHoseGeo, rubber, { parent: root });

  // Lifeline rope: manila hemp line bundled alongside hose
  const lifelineSpline = [
    [-0.23, 1.67, 0.06],
    [-0.30, 1.57, 0.07],
    [-0.34, 1.40, 0.04],
    [-0.33, 1.25, -0.01],
    [-0.28, 1.13, -0.06],
    [-0.21, 1.03, -0.10],
    [-0.18, 0.95, -0.09],
    [-0.21, 0.88, -0.06],
    [-0.27, 0.86, -0.04],
    [-0.32, 0.90, -0.06],
    [-0.34, 0.98, -0.11],
    [-0.29, 1.05, -0.16],
    [-0.23, 1.06, -0.18],
    [-0.18, 1.00, -0.16],
    [-0.17, 0.93, -0.13],
    [-0.22, 0.87, -0.08],
    [-0.28, 0.85, -0.06],
  ];
  const lifelineGeo = curveToMesh(lifelineSpline, 0.012, 32, 6);
  createPart('LifelineRope', lifelineGeo, rope, { parent: root });

  // Leather binding lashings
  createPart('HoseLash1', torusGeo(0.040, 0.007, 6, 12), leather, {
    position: [-0.33, 0.93, -0.15],
    rotation: [25, 40, 0],
    parent: root,
  });
  createPart('HoseLash2', torusGeo(0.038, 0.007, 6, 12), leather, {
    position: [-0.19, 0.95, -0.18],
    rotation: [-20, 50, 0],
    parent: root,
  });

  return root;
}

Brief and retained revisions

No brief or earlier revisions are recorded. The source download contains the version built for this page.