Skip to content
Kiln0.10Get Kiln

Lofted pedestal, recessed optical opening and focusing slide

Earlier examples from earlier Kiln versions.

Historical gallery render of Bench refractor; 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
7,476
Estimated draws
88
Materials
6
Textures
0
Animation clips
1
Bounds X × Y × Z
0.79 × 1.21 × 0.36 m
Build warnings
0

Measurements come from this build.

Download this build

Runtime: 185,200 bytes. Original: 184,968 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
b2db6638150d8643d123538394f46b4658c877499b05460284b37b02dd44cf4b
Original GLB
73ff90035e117c178195edaf11d01f214351cc27e872490db77354fee11bf73b
Source
32223e1d94c3034d14f5d3f401fd7fbb5da3e471ddf92c3acdc319a85a03106d

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 OpenCode / opencode/muse-spark-1.3-contributor-free supplied-source creative refinement

Source access
Installed Kiln author/refine/QA skills and tool definitions, plus the supplied Muse Q1 instrument source; no engine implementation or other finished examples.
Inherited context
Fresh curation conversation with a supplied source from a separate Muse authoring journey.
Starting example
The earlier Muse optical instrument, source f21fc9f7ab93dfe56720232007668ba95fc541d6071454a7ba12289c5a519df0.
Human input
Maintainer supplied a creative refinement brief and reviewed returned images; no hand-edited geometry. Model redesigned the instrument and repaired a bore gap by reference.
Authoring review
GPU whole, part-relative, axial-opening and locked-motion views were delivered. Independent review found coherent geometry, bright brass highlights and smeared lens reflections. No engineering or optical-performance validation.

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

bench-refractor.kiln.js
const meta = { name: 'Bench Refractor Comparator', category: 'prop', role: 'prop' };
// Curation of supplied source 'Articulated Observatory Instrument' from Muse's
// earlier clean-room workflow test (provided-instrument.kiln.js). That plain
// tube-on-tripod is the starting point only: this revision redesigns it as a
// compact bench-top precision refractor with a lofted pier, yoke mount,
// segmented ribbed barrel and a genuinely recessed objective with visible
// internal optics, plus a sliding focus assembly. Credit to the Muse source.

const TILT_DEG = -52;
const FOCUS_BASE_Y = -0.20;
const FOCUS_TRAVEL = 0.05;

function ringPts(n, r, cx, cz) {
  const p = [];
  for (let i = 0; i < n; i++) {
    const a = (i / n) * Math.PI * 2;
    p.push([cx + Math.cos(a) * r, cz + Math.sin(a) * r]);
  }
  return p;
}
function octPts(rx, rz, cx, cz) {
  const p = [];
  for (let i = 0; i < 8; i++) {
    const a = (i / 8) * Math.PI * 2 + Math.PI / 8;
    p.push([cx + Math.cos(a) * rx, cz + Math.sin(a) * rz]);
  }
  return p;
}
function rectPts(cx, cz, hx, hz) {
  return [[cx - hx, cz - hz], [cx + hx, cz - hz], [cx + hx, cz + hz], [cx - hx, cz + hz]];
}

async function build() {
  const root = createRoot('BenchComparator');
  const enamel = gameMaterial(0x33454c, { metalness: 0.35, roughness: 0.45 });
  const brass = gameMaterial(0xb08a3e, { metalness: 0.85, roughness: 0.32 });
  const steel = gameMaterial(0x9aa2ab, { metalness: 0.85, roughness: 0.35 });
  const ironDark = gameMaterial(0x1d2126, { metalness: 0.55, roughness: 0.6 });
  const rubber = gameMaterial(0x141414, { metalness: 0.0, roughness: 0.9 });
  const lensGlass = glassMaterial(0x8fc8ff, { opacity: 0.35, roughness: 0.08, metalness: 0.1 });

  // ---- Asymmetric base: tapered wedge plate + 3 leveling feet ----
  const base = createPivot('Base', [0, 0, 0], root);
  const plateGeo = loftProfiles([
    { profile: rectPts(-0.02, 0, 0.36, 0.18) },
    { profile: rectPts(0.0, 0, 0.30, 0.15), frame: { origin: [0, 0.065, 0], rotation: [0, 0, 0] } },
  ]);
  createPart('BasePlate', plateGeo, enamel, { position: [0, 0.02, 0], parent: base });
  const footXZ = [[0.24, 0.11], [0.24, -0.12], [-0.27, -0.04]];
  footXZ.forEach(([fx, fz], i) => {
    createPart('FootPad' + i, cylinderGeo(0.045, 0.052, 0.02, 20), ironDark, { position: [fx, 0.01, fz], parent: base });
    createPart('FootBall' + i, sphereGeo(0.018, 12, 8), steel, { position: [fx, 0.028, fz], parent: base });
    createPart('LevelScrew' + i, cylinderGeo(0.011, 0.011, 0.10, 10), steel, { position: [fx, 0.075, fz], parent: base });
    createPart('TommyBar' + i, cylinderXGeo(0.005, 0.005, 0.10, 8), brass, { position: [fx, 0.115, fz], parent: base });
  });
  beamBetween('OutriggerArm', [-0.18, 0.05, -0.02], [-0.27, 0.05, -0.04], 0.022, enamel, { parent: base });
  createPart('VialBase', boxGeo(0.09, 0.012, 0.03), brass, { position: [0.12, 0.091, 0.09], parent: base });
  createPart('VialGlass', cylinderZGeo(0.011, 0.011, 0.07, 12), lensGlass, { position: [0.12, 0.103, 0.09], parent: base });
  createPart('VialCapA', cylinderZGeo(0.013, 0.013, 0.008, 10), brass, { position: [0.12, 0.103, 0.129], parent: base });
  createPart('VialCapB', cylinderZGeo(0.013, 0.013, 0.008, 10), brass, { position: [0.12, 0.103, 0.051], parent: base });

  // ---- Lofted pier: swept tapered housing ----
  const pierGeo = loftProfiles([
    { profile: octPts(0.20, 0.13, 0.0, 0.0) },
    { profile: octPts(0.135, 0.105, 0.01, 0.0), frame: { origin: [0, 0.215, 0], rotation: [0, 0, 0] } },
    { profile: octPts(0.10, 0.085, 0.02, 0.0), frame: { origin: [0, 0.435, 0], rotation: [0, 0, 0] } },
    { profile: octPts(0.115, 0.075, 0.03, 0.0), frame: { origin: [0, 0.615, 0], rotation: [0, 0, 0] } },
  ]);
  createPart('Pier', pierGeo, enamel, { position: [0, 0.085, 0], parent: root });
  createPart('PierCollar', torusGeo(0.115, 0.010, 8, 24), brass, { position: [0.025, 0.42, 0], rotation: [90, 0, 0], parent: root });

  // ---- Yoke fork with exposed elevation adjustment ----
  const yoke = createPivot('Yoke', [0, 0, 0], root);
  createPart('YokeCrossbar', boxGeo(0.24, 0.05, 0.18), enamel, { position: [0.03, 0.71, 0], parent: yoke });
  createPart('CheekL', boxGeo(0.09, 0.24, 0.028), enamel, { position: [0.03, 0.80, 0.085], parent: yoke });
  createPart('CheekR', boxGeo(0.09, 0.24, 0.028), enamel, { position: [0.03, 0.80, -0.085], parent: yoke });
  createPart('CheekBoltL', cylinderZGeo(0.009, 0.009, 0.04, 6), brass, { position: [0.03, 0.74, 0.085], parent: yoke });
  createPart('CheekBoltR', cylinderZGeo(0.009, 0.009, 0.04, 6), brass, { position: [0.03, 0.74, -0.085], parent: yoke });
  // elevation handwheel: faceted brass disc + rim teeth + hub
  createPart('ElevWheel', cylinderZGeo(0.075, 0.075, 0.024, 28), brass, { position: [0.03, 0.88, 0.115], parent: yoke });
  createPart('ElevHub', cylinderZGeo(0.016, 0.016, 0.04, 12), steel, { position: [0.03, 0.88, 0.115], parent: yoke });
  for (let i = 0; i < 14; i++) {
    const a = (i / 14) * 360;
    const r = a * Math.PI / 180;
    createPart('WheelTooth' + i, boxGeo(0.012, 0.012, 0.024), brass, {
      position: [0.03 + Math.cos(r) * 0.075, 0.88 + Math.sin(r) * 0.075, 0.115],
      rotation: [0, 0, a], parent: yoke
    });
  }
  createPart('ElevPinion', cylinderZGeo(0.028, 0.028, 0.03, 12), steel, { position: [0.10, 0.815, 0.115], parent: yoke });
  beamBetween('CrankArm', [0.10, 0.815, 0.13], [0.10, 0.775, 0.15], 0.007, steel, { parent: yoke });
  createPart('CrankKnob', sphereGeo(0.014, 10, 8), rubber, { position: [0.10, 0.768, 0.153], parent: yoke });

  // ---- Tilted optical assembly ----
  const tilt = createPivot('TiltCradle', [0.03, 0.88, 0], root);
  tilt.rotation.z = TILT_DEG * Math.PI / 180;
  createPart('TrunnionL', cylinderZGeo(0.032, 0.032, 0.05, 16), brass, { position: [0, 0, 0.085], parent: tilt });
  createPart('TrunnionR', cylinderZGeo(0.032, 0.032, 0.05, 16), brass, { position: [0, 0, -0.085], parent: tilt });
  createPart('CradlePlate', boxGeo(0.035, 0.34, 0.16), ironDark, { position: [0.10, 0.05, 0], parent: tilt });
  createPart('RiserA', boxGeo(0.05, 0.05, 0.06), enamel, { position: [0.075, -0.03, 0.04], parent: tilt });
  createPart('RiserB', boxGeo(0.05, 0.05, 0.06), enamel, { position: [0.075, 0.22, -0.04], parent: tilt });
  createPart('Dovetail', boxGeo(0.035, 0.30, 0.075), steel, { position: [0.078, 0.10, 0], parent: tilt });

  // main barrel: segmented lofted housing (solid, capped)
  const barrelGeo = loftProfiles([
    { profile: ringPts(16, 0.056, 0, 0) },
    { profile: ringPts(16, 0.062, 0, 0), frame: { origin: [0, 0.12, 0], rotation: [0, 0, 0] } },
    { profile: ringPts(16, 0.067, 0, 0), frame: { origin: [0, 0.26, 0], rotation: [0, 0, 0] } },
    { profile: ringPts(16, 0.071, 0, 0), frame: { origin: [0, 0.38, 0], rotation: [0, 0, 0] } },
  ]);
  createPart('Barrel', barrelGeo, enamel, { position: [0, -0.16, 0], parent: tilt });
  createPart('RearCap', cylinderGeo(0.057, 0.057, 0.03, 20), ironDark, { position: [0, -0.165, 0], parent: tilt });
  [[-0.04, 0.058], [0.10, 0.064], [0.24, 0.069]].forEach(([by, br], i) => {
    createPart('Band' + i, torusGeo(br + 0.002, 0.006, 8, 28), brass, { position: [0, by, 0], rotation: [90, 0, 0], parent: tilt });
  });
  // swept ribs hugging the taper (half-embedded, never floating)
  const ribDirs = [[0.7071, 0.7071], [0.7071, -0.7071], [-0.7071, 0.7071], [-0.7071, -0.7071]];
  ribDirs.forEach(([dx, dz], i) => {
    const stations = [[-0.10, 0.057], [0.10, 0.065], [0.33, 0.071]];
    const path = stations.map(([sy, sr]) => [dx * (sr - 0.001), sy, dz * (sr - 0.001)]);
    const ribGeo = sweepProfile([[-0.005, -0.003], [0.005, -0.003], [0.005, 0.003], [-0.005, 0.003]], path, { up: [0, 0, 1] });
    createPart('Rib' + i, ribGeo, ironDark, { parent: tilt });
  });

  // ---- Open objective: bell shroud (open loft) + recessed optics ----
  const bellGeo = loftProfiles([
    { profile: ringPts(24, 0.071, 0, 0) },
    { profile: ringPts(24, 0.086, 0, 0), frame: { origin: [0, 0.08, 0], rotation: [0, 0, 0] } },
    { profile: ringPts(24, 0.099, 0, 0), frame: { origin: [0, 0.14, 0], rotation: [0, 0, 0] } },
    { profile: ringPts(24, 0.103, 0, 0), frame: { origin: [0, 0.17, 0], rotation: [0, 0, 0] } },
  ], { cap: false });
  createPart('BellShroud', bellGeo, enamel, { position: [0, 0.22, 0], parent: tilt });
  createPart('BoreFloor', cylinderGeo(0.095, 0.095, 0.008, 24), ironDark, { position: [0, 0.281, 0], parent: tilt });
  createPart('ObjectiveLens', cylinderGeo(0.068, 0.068, 0.006, 28), lensGlass, { position: [0, 0.288, 0], parent: tilt });
  createPart('ApertureStop', torusGeo(0.068, 0.005, 8, 28), brass, { position: [0, 0.291, 0], rotation: [90, 0, 0], parent: tilt });
  createPart('BaffleA', torusGeo(0.082, 0.005, 8, 28), ironDark, { position: [0, 0.315, 0], rotation: [90, 0, 0], parent: tilt });
  createPart('BaffleB', torusGeo(0.090, 0.005, 8, 28), ironDark, { position: [0, 0.345, 0], rotation: [90, 0, 0], parent: tilt });
  createPart('RimLip', torusGeo(0.099, 0.013, 10, 32), brass, { position: [0, 0.39, 0], rotation: [90, 0, 0], parent: tilt });

  // ---- FocusSlide: named movable focusing assembly (slides along barrel Y) ----
  const slide = createPivot('FocusSlide', [0, FOCUS_BASE_Y, 0], tilt);
  createPart('Drawtube', cylinderGeo(0.030, 0.030, 0.14, 16), steel, { position: [0, 0.0, 0], parent: slide });
  createPart('DrawtubeCollar', torusGeo(0.031, 0.006, 8, 20), brass, { position: [0, 0.055, 0], rotation: [90, 0, 0], parent: slide });
  for (let i = 0; i < 7; i++) {
    createPart('RackTooth' + i, boxGeo(0.010, 0.008, 0.014), brass, { position: [0.032, -0.045 + i * 0.014, 0], parent: slide });
  }
  createPart('Eyecup', cylinderGeo(0.030, 0.034, 0.035, 16), rubber, { position: [0, -0.085, 0], parent: slide });
  createPart('EyeLens', cylinderGeo(0.018, 0.018, 0.004, 16), lensGlass, { position: [0, -0.066, 0], parent: slide });
  // barrel-fixed pinion driving the rack (stays while slide moves)
  createPart('PinionBracketA', boxGeo(0.03, 0.03, 0.02), ironDark, { position: [0.045, -0.17, 0.03], parent: tilt });
  createPart('PinionBracketB', boxGeo(0.03, 0.03, 0.02), ironDark, { position: [0.045, -0.17, -0.03], parent: tilt });
  createPart('FocusShaft', cylinderZGeo(0.007, 0.007, 0.11, 10), steel, { position: [0.045, -0.17, 0], parent: tilt });
  createPart('FocusKnobA', cylinderZGeo(0.020, 0.020, 0.022, 16), rubber, { position: [0.045, -0.17, 0.062], parent: tilt });
  createPart('FocusKnobB', cylinderZGeo(0.020, 0.020, 0.022, 16), rubber, { position: [0.045, -0.17, -0.062], parent: tilt });
  createPart('FocusGear', cylinderZGeo(0.020, 0.020, 0.016, 12), brass, { position: [0.032, -0.17, 0], parent: tilt });

  // ---- Finder scope (side-mounted, bracketed, attached) ----
  createPart('FinderTube', cylinderGeo(0.018, 0.018, 0.22, 14), ironDark, { position: [-0.092, 0.10, 0], parent: tilt });
  createPart('FinderLens', cylinderGeo(0.016, 0.016, 0.004, 14), lensGlass, { position: [-0.092, 0.212, 0], parent: tilt });
  createPart('FinderCup', cylinderGeo(0.020, 0.022, 0.03, 14), rubber, { position: [-0.092, -0.015, 0], parent: tilt });
  createPart('FinderBracketA', boxGeo(0.032, 0.03, 0.03), steel, { position: [-0.074, 0.03, 0], parent: tilt });
  createPart('FinderBracketB', boxGeo(0.032, 0.03, 0.03), steel, { position: [-0.074, 0.18, 0], parent: tilt });

  return root;
}

function animate(root) {
  return [createClip('FocusTravel', 2.0, [
    positionTrack('Joint_FocusSlide', [
      { time: 0, position: [0, FOCUS_BASE_Y, 0] },
      { time: 1.0, position: [0, FOCUS_BASE_Y + FOCUS_TRAVEL, 0] },
      { time: 2.0, position: [0, FOCUS_BASE_Y, 0] }
    ])
  ])];
}

Brief and retained revisions

Brief summary

Refine a supplied optical-instrument study into a compact precision bench instrument with a shaped housing, an open optical entrance and recessed optics, exposed mechanical adjustment and a stable asymmetric base. Use whole and close views to review the opening, attachments and moving focus assembly.

  1. Supplied starting study

    The earlier Muse instrument was supplied to a separate creative-refinement conversation; this starting point was not authored in that refinement run.

    Download supplied starting study source

    SHA-256: f21fc9f7ab93dfe56720232007668ba95fc541d6071454a7ba12289c5a519df0

  2. Current gallery revision · Shown here

    Redesigned the study as a bench refractor with a lofted pier, yoke, ribbed barrel and sliding focus assembly, then repaired an opening gap by reference.

    Download current gallery revision source

    SHA-256: 32223e1d94c3034d14f5d3f401fd7fbb5da3e471ddf92c3acdc319a85a03106d