Skip to content
Kiln0.10Get Kiln

Demo run

Earlier examples from earlier Kiln versions.

Historical gallery render of Clockwork dragonfly; 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
9,572
Estimated draws
92
Materials
7
Textures
0
Animation clips
2
Bounds X × Y × Z
1.68 × 0.84 × 1.69 m
Build warnings
0

Measurements come from this build.

Download this build

Runtime: 191,932 bytes. Original: 191,692 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
d7b112e3defb47e5512cfd20d0a3946259ce8a0532daf05d6f9e1530fb3431ab
Original GLB
a2145b020b9e53089ac3fb33285c694ddbb29231e2ccecc59d9a98602517c2a2
Source
824ce3887151b2a551a7c1bd09a09924f9cb46bd6dd43b2606e2d1a3b7fc0317

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

Muse Spark 1.3 through OpenCode ·

Recorded demo session; model credit supplied only where the retained run identifies it.

Source access
See retained demo run; no stronger isolation claim is made.
Inherited context
Not independently recorded; source-header declarations only
Starting example
Not recorded
Human input
Owner supplied direction; model-authored exported source preserved byte-for-byte.
Authoring review
Authoring feedback and shaded demo previews where available. Not a destination-runtime acceptance claim.

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

demo-clockwork-dragonfly.kiln.js
const meta = { name: 'Mechanical Dragonfly', category: 'prop', role: 'prop' };

function build() {
  const root = createRoot('MechanicalDragonfly');

  // Materials
  const brass = gameMaterial(0xc9973f, { metalness: 0.9, roughness: 0.32 });
  const darkBrass = gameMaterial(0x7a5a28, { metalness: 0.85, roughness: 0.45 });
  const copper = gameMaterial(0xa66a3a, { metalness: 0.9, roughness: 0.35 });
  const darkSteel = gameMaterial(0x3a3f44, { metalness: 0.8, roughness: 0.5 });
  const emeraldGlass = glassMaterial(0x1fd47a, { opacity: 0.5, roughness: 0.15 });
  const emeraldSolid = gameMaterial(0x0fae5f, { metalness: 0.3, roughness: 0.3, emissive: 0x0a5c34, emissiveIntensity: 0.6 });
  const eyeMat = gameMaterial(0x0fd67c, { metalness: 0.2, roughness: 0.2, emissive: 0x0bd86e, emissiveIntensity: 0.9 });

  const bodyY = 0.6;

  // Thorax — main brass barrel along X
  createPart('Thorax', capsuleGeo(0.14, 0.28, 8), brass, {
    position: [0.15, bodyY, 0], rotation: [0, 0, 90], parent: root
  });
  // Thorax top housing / wing motor case
  createPart('WingCase', boxGeo(0.34, 0.1, 0.2), darkBrass, {
    position: [0.12, bodyY + 0.12, 0], parent: root
  });
  // Thorax belly plate
  createPart('BellyPlate', boxGeo(0.3, 0.04, 0.12), copper, {
    position: [0.15, bodyY - 0.13, 0], parent: root
  });
  // Thorax front collar
  createPart('Collar', torusGeo(0.11, 0.025, 8, 20), copper, {
    position: [0.34, bodyY, 0], rotation: [0, 90, 0], parent: root
  });

  // Head
  createPart('Head', sphereGeo(0.105, 16, 12), darkBrass, {
    position: [0.5, bodyY + 0.02, 0], parent: root
  });
  createPart('EyeR', sphereGeo(0.058, 14, 10), eyeMat, {
    position: [0.55, bodyY + 0.07, 0.07], parent: root
  });
  createPart('EyeL', sphereGeo(0.058, 14, 10), eyeMat, {
    position: [0.55, bodyY + 0.07, -0.07], parent: root
  });
  // Mandibles / snout
  createPart('Snout', cylinderGeo(0.035, 0.055, 0.12, 10), brass, {
    position: [0.6, bodyY - 0.01, 0], rotation: [0, 0, -90], parent: root
  });
  // Antennae
  beamBetween('AntennaR', [0.57, bodyY + 0.09, 0.03], [0.78, bodyY + 0.22, 0.1], 0.008, darkSteel, { parent: root });
  beamBetween('AntennaL', [0.57, bodyY + 0.09, -0.03], [0.78, bodyY + 0.22, -0.1], 0.008, darkSteel, { parent: root });
  createPart('AntennaTipR', sphereGeo(0.015, 8, 6), emeraldSolid, { position: [0.78, bodyY + 0.22, 0.1], parent: root });
  createPart('AntennaTipL', sphereGeo(0.015, 8, 6), emeraldSolid, { position: [0.78, bodyY + 0.22, -0.1], parent: root });

  // Abdomen — 6 tapering segments along -X
  const segX = [-0.08, -0.22, -0.36, -0.49, -0.61, -0.72];
  const segR = [0.095, 0.085, 0.073, 0.06, 0.047, 0.035];
  for (let i = 0; i < segX.length; i++) {
    const x = segX[i];
    const r = segR[i];
    createPart('AbdomenSeg' + i, cylinderGeo(r * 0.92, r, 0.14, 14), i % 2 === 0 ? brass : copper, {
      position: [x, bodyY - 0.01 - i * 0.008, 0], rotation: [0, 0, 90], parent: root
    });
    // segment ring
    createPart('AbdomenRing' + i, torusGeo(r, 0.012, 6, 18), darkBrass, {
      position: [x + 0.06, bodyY - 0.01 - i * 0.008, 0], rotation: [0, 90, 0], parent: root
    });
  }
  // Tail tip stinger
  createPart('TailTip', coneGeo(0.032, 0.12, 12), darkSteel, {
    position: [-0.83, bodyY - 0.06, 0], rotation: [0, 0, 90], parent: root
  });
  createPart('TailJewel', sphereGeo(0.022, 10, 8), emeraldSolid, {
    position: [-0.74, bodyY + 0.005, 0], parent: root
  });

  // Exposed brass gears on both flanks
  function sideGears(side) {
    const z = 0.14 * side;
    const pivMain = createPivot('GearR_Main_' + (side > 0 ? 'R' : 'L'), [0.14, bodyY, z], root);
    createPart('GearMain_' + (side > 0 ? 'R' : 'L'),
      gearGeo({ teeth: 18, rootRadius: 0.085, tipRadius: 0.105, boreRadius: 0.02, height: 0.03 }),
      brass, { rotation: [90, 0, 0], parent: pivMain });
    createPart('GearHub_' + (side > 0 ? 'R' : 'L'), cylinderGeo(0.022, 0.022, 0.055, 10), darkSteel, {
      rotation: [90, 0, 0], parent: pivMain
    });

    const pivA = createPivot('GearR_Aft_' + (side > 0 ? 'R' : 'L'), [-0.03, bodyY + 0.02, z], root);
    createPart('GearAft_' + (side > 0 ? 'R' : 'L'),
      gearGeo({ teeth: 14, rootRadius: 0.058, tipRadius: 0.072, boreRadius: 0.014, height: 0.028 }),
      copper, { rotation: [90, 0, 0], parent: pivA });

    const pivS = createPivot('GearR_Small_' + (side > 0 ? 'R' : 'L'), [0.28, bodyY - 0.02, z * 0.95], root);
    createPart('GearSmall_' + (side > 0 ? 'R' : 'L'),
      gearGeo({ teeth: 10, rootRadius: 0.038, tipRadius: 0.05, boreRadius: 0.01, height: 0.026 }),
      brass, { rotation: [90, 0, 0], parent: pivS });
    return { pivMain, pivA, pivS };
  }
  sideGears(1);
  sideGears(-1);

  // Emerald wings — 4 panels
  function makeWing(name, px, pz, span, rootChord, tipChord, sweep, mirror) {
    const pivot = createPivot(name, [px, bodyY + 0.17, pz], root);
    const geo = wingGeo({ span: span, rootChord: rootChord, tipChord: tipChord, sweep: sweep, thickness: 0.008, dihedral: 0.04 });
    // mirror left wings across Z
    const rot = mirror ? [180, 0, 0] : [0, 0, 0];
    createPart(name + 'Panel', geo, emeraldGlass, { rotation: rot, parent: pivot });
    // brass leading-edge spar + 2 veins lying on the panel top surface
    const dir = mirror ? -1 : 1;
    const leadRootX = 0.0, leadTipX = -sweep;
    beamBetween(name + 'Spar', [leadRootX, 0.008, 0.01 * dir], [leadTipX, 0.012, (span - 0.01) * dir], 0.009, brass, { parent: pivot });
    beamBetween(name + 'VeinA', [-rootChord * 0.3, 0.007, 0.08 * dir], [leadTipX - 0.03, 0.01, span * 0.8 * dir], 0.0045, darkBrass, { parent: pivot });
    beamBetween(name + 'VeinB', [-rootChord * 0.55, 0.007, 0.06 * dir], [leadTipX - 0.05, 0.01, span * 0.62 * dir], 0.0045, darkBrass, { parent: pivot });
    // rounded emerald tip cap with brass rim (broad rounded tip)
    const tipR = tipChord / 2;
    const tipCX = -sweep;
    const tipCZ = (span - tipR * 0.3) * dir;
    createPart(name + 'TipCap', cylinderGeo(tipR, tipR, 0.007, 20), emeraldGlass, {
      position: [tipCX, 0.009, tipCZ], parent: pivot
    });
    createPart(name + 'TipRim', torusGeo(tipR, 0.006, 6, 24), brass, {
      position: [tipCX, 0.009, tipCZ], rotation: [90, 0, 0], parent: pivot
    });
    // wing root cap
    createPart(name + 'Root', boxGeo(0.1, 0.025, 0.06), brass, {
      position: [0, 0, 0.02 * dir], parent: pivot
    });
    return pivot;
  }
  makeWing('WingFrontR', 0.22, 0.09, 0.68, 0.32, 0.2, 0.22, false);
  makeWing('WingFrontL', 0.22, -0.09, 0.68, 0.32, 0.2, 0.22, true);
  makeWing('WingRearR', 0.0, 0.09, 0.58, 0.28, 0.17, 0.18, false);
  makeWing('WingRearL', 0.0, -0.09, 0.58, 0.28, 0.17, 0.18, true);

  // Six brass legs down to ground
  function leg(name, hipX, side, kneeSpread, footSpread, hipY) {
    const hx = hipX, hz = 0.08 * side;
    const kx = hipX - 0.05, ky = 0.32, kz = (0.08 + kneeSpread) * side;
    const fx = hipX - 0.02, fy = 0.016, fz = (0.08 + footSpread) * side;
    beamBetween(name + 'Upper', [hx, hipY, hz], [kx, ky, kz], 0.014, brass, { parent: root });
    beamBetween(name + 'Lower', [kx, ky, kz], [fx, fy, fz], 0.01, darkBrass, { parent: root });
    createPart(name + 'Hip', sphereGeo(0.025, 10, 8), copper, { position: [hx, hipY, hz], parent: root });
    createPart(name + 'Knee', sphereGeo(0.018, 8, 6), copper, { position: [kx, ky, kz], parent: root });
    createPart(name + 'Foot', sphereGeo(0.016, 8, 6), darkSteel, { position: [fx, fy, fz], parent: root });
  }
  leg('LegFrontR', 0.3, 1, 0.12, 0.2, bodyY - 0.1);
  leg('LegFrontL', 0.3, -1, 0.12, 0.2, bodyY - 0.1);
  leg('LegMidR', 0.14, 1, 0.16, 0.26, bodyY - 0.12);
  leg('LegMidL', 0.14, -1, 0.16, 0.26, bodyY - 0.12);
  leg('LegRearR', -0.02, 1, 0.15, 0.24, bodyY - 0.11);
  leg('LegRearL', -0.02, -1, 0.15, 0.24, bodyY - 0.11);

  // Legs provide ground contact via feet near Y=0
  return root;
}

function animate(root) {
  return [
    createClip('GearSpin', 2, [
      rotationTrack('Joint_GearR_Main_R', [{ time: 0, rotation: [0, 0, 0] }, { time: 2, rotation: [0, 0, 360] }]),
      rotationTrack('Joint_GearR_Main_L', [{ time: 0, rotation: [0, 0, 0] }, { time: 2, rotation: [0, 0, -360] }]),
      rotationTrack('Joint_GearR_Aft_R', [{ time: 0, rotation: [0, 0, 0] }, { time: 2, rotation: [0, 0, -360] }]),
      rotationTrack('Joint_GearR_Aft_L', [{ time: 0, rotation: [0, 0, 0] }, { time: 2, rotation: [0, 0, 360] }]),
    ]),
    createClip('WingFlap', 1.2, [
      rotationTrack('Joint_WingFrontR', [{ time: 0, rotation: [0, 0, 0] }, { time: 0.3, rotation: [-18, 0, 0] }, { time: 0.6, rotation: [0, 0, 0] }, { time: 0.9, rotation: [-18, 0, 0] }, { time: 1.2, rotation: [0, 0, 0] }]),
      rotationTrack('Joint_WingFrontL', [{ time: 0, rotation: [0, 0, 0] }, { time: 0.3, rotation: [18, 0, 0] }, { time: 0.6, rotation: [0, 0, 0] }, { time: 0.9, rotation: [18, 0, 0] }, { time: 1.2, rotation: [0, 0, 0] }]),
      rotationTrack('Joint_WingRearR', [{ time: 0, rotation: [0, 0, 0] }, { time: 0.3, rotation: [-22, 0, 0] }, { time: 0.6, rotation: [0, 0, 0] }, { time: 0.9, rotation: [-22, 0, 0] }, { time: 1.2, rotation: [0, 0, 0] }]),
      rotationTrack('Joint_WingRearL', [{ time: 0, rotation: [0, 0, 0] }, { time: 0.3, rotation: [22, 0, 0] }, { time: 0.6, rotation: [0, 0, 0] }, { time: 0.9, rotation: [22, 0, 0] }, { time: 1.2, rotation: [0, 0, 0] }]),
    ])
  ];
}

Brief and retained revisions

Recorded brief

Broader emerald wings with rounded brass-rimmed tips

  1. Saved revision 1

    Mechanical dragonfly with emerald wings and brass gears

    Download saved revision 1 source

    SHA-256: 4ea377d1003135e677483730e90b47c8bcdc79d842832985d971dabcf3fa6207

  2. Saved revision 2 · Shown here

    Broader emerald wings with rounded brass-rimmed tips

    Download saved revision 2 source

    SHA-256: 824ce3887151b2a551a7c1bd09a09924f9cb46bd6dd43b2606e2d1a3b7fc0317