Skip to content
Kiln0.10Get Kiln

Demo run

Earlier examples from earlier Kiln versions.

Historical gallery render of Diesel locomotive; 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
92,836
Estimated draws
668
Materials
8
Textures
0
Animation clips
0
Bounds X × Y × Z
18.16 × 4.98 × 3.07 m
Build warnings
0

Measurements come from this build.

Download this build

Runtime: 556,636 bytes. Original: 556,396 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
ed415f2e9f5b77e279b0b0b3d3eafb3b8d055ebe9e8e5e4ead461d9d06f56a59
Original GLB
16a9ac51e3864c02a738e3b425dbde18f8b9b3cbcf12ead88623a3a25a91c242
Source
483aef3d91f13d831e9c964dcd059957ee26b4c230b92cf2feb26d684e548378

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

GPT-6 Astra through ChatGPT Work ·

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-diesel-locomotive.kiln.js
const meta = {name:"RCL 2406 — Red & Cream Diesel",category:"vehicle",role:"vehicle"};
function build(){
const root=createRoot("RCL_2406_Diesel");
const red=gameMaterial(0x173f2c,{metalness:.3,roughness:.36});
const brass=gameMaterial(0xb9954e,{metalness:.85,roughness:.26});
const cream=gameMaterial(0xf1dfb2,{metalness:.15,roughness:.44});
const dark=gameMaterial(0x242b30,{metalness:.6,roughness:.48});
const steel=gameMaterial(0x697278,{metalness:.85,roughness:.28});
const black=gameMaterial(0x10191f,{metalness:.25,roughness:.5});
const glass=gameMaterial(0x244650,{metalness:.55,roughness:.18});
const lamp=gameMaterial(0xffedba,{emissive:0xffd994,emissiveIntensity:.45,roughness:.2});
function box(n,w,h,d,x,y,z,m,p=root){return createPart(n,boxGeo(w,h,d),m,{position:[x,y,z],parent:p});}
function cyl(n,r,h,x,y,z,m,rot=[90,0,0],p=root,seg=32){return createPart(n,cylinderGeo(r,r,h,seg),m,{position:[x,y,z],rotation:rot,parent:p});}
function rod(n,a,b,r,m,p=root){
const av=new THREE.Vector3(...a),bv=new THREE.Vector3(...b),v=bv.clone().sub(av);
const ob=createPart(n,cylinderGeo(r,r,v.length(),10),m,{position:av.clone().add(bv).multiplyScalar(.5).toArray(),parent:p});
ob.quaternion.setFromUnitVectors(new THREE.Vector3(0,1,0),v.normalize());return ob;
}
function pipe(n,pts,r,m,p=root){
const curve=new THREE.CatmullRomCurve3(pts.map(a=>new THREE.Vector3(...a)));
return createPart(n,new THREE.TubeGeometry(curve,Math.max(12,pts.length*5),r,6,false),m,{parent:p});
}
function prism(n,x0,x1,profile,m,p=root){
const v=[],idx=[],N=profile.length; for(const x of [x0,x1])for(const yz of profile)v.push(x,yz[0],yz[1]);
for(let i=1;i<N-1;i++){idx.push(0,i+1,i);idx.push(N,N+i,N+i+1);}
for(let i=0;i<N;i++){let j=(i+1)%N;idx.push(i,j,N+j,i,N+j,N+i);}
const g=new THREE.BufferGeometry();g.setAttribute("position",new THREE.Float32BufferAttribute(v,3));g.setIndex(idx);g.computeVertexNormals();
return createPart(n,g,m,{parent:p});
}
box("Main_sill",16.2,.32,2.9,0,1.56,0,dark);
box("Red_walkway_edge",16.35,.13,3.06,0,1.79,0,red);
box("Walkway_tread",16.25,.065,3.02,0,1.89,0,dark);
prism("Long_hood",-7.25,2.65,[[1.94,-1.06],[3.65,-1.06],[3.91,-.82],[3.91,.82],[3.65,1.06],[1.94,1.06]],red);
for(const s of [-1,1]){
box("Cream_hood_band_"+s,9.91,.42,.028,-2.3,3.06,s*1.077,cream);
box("Lower_cream_pinstripe_"+s,9.91,.055,.028,-2.3,2.77,s*1.079,cream);
for(let i=0;i<10;i++){
const x=-6.78+i*.92;
box("Engine_access_seam_"+s+"_"+i,.018,.70,.018,x,2.34,s*1.079,black);
box("Panel_handle_"+s+"_"+i,.16,.035,.05,x+.38,2.45,s*1.096,steel);
box("Panel_hinge_"+s+"_"+i,.065,.12,.044,x+.06,2.25,s*1.09,dark);
}
for(let j=0;j<3;j++){
let x=-6.37+j*1.07;
box("Radiator_recess_"+s+"_"+j,.9,.59,.034,x,3.5,s*1.08,black);
for(let k=0;k<7;k++)box("Radiator_louver_"+s+"_"+j+"_"+k,.83,.028,.048,x,3.26+k*.073,s*1.108,steel);
}
for(let j=0;j<2;j++){
box("Intake_recess_"+s+"_"+j,.7,.52,.03,1+j*.83,3.52,s*1.08,black);
for(let k=0;k<7;k++)box("Intake_grille_"+s+"_"+j+"_"+k,.025,.46,.045,.73+j*.83+k*.09,3.52,s*1.1,dark);
}
}
prism("Cab_shell",2.65,4.85,[[1.95,-1.43],[3.94,-1.43],[4.38,-1.04],[4.38,1.04],[3.94,1.43],[1.95,1.43]],red);
prism("Cream_cab_roof",2.49,5.00,[[3.99,-1.50],[4.46,-1.08],[4.50,-.8],[4.50,.8],[4.46,1.08],[3.99,1.50]],cream);
for(const s of [-1,1]){
box("Cab_cream_waist_"+s,2.21,.42,.026,3.75,3.06,s*1.447,cream);
box("Cab_window_seal_"+s,1.56,.73,.038,3.77,3.7,s*1.451,black);
box("Cab_side_glass_"+s,1.43,.61,.044,3.77,3.7,s*1.478,glass);
box("Cab_window_mullion_"+s,.055,.65,.057,3.64,3.7,s*1.505,cream);
box("Cab_sill_"+s,1.65,.055,.095,3.77,3.30,s*1.48,cream);
box("Cab_door_seam_"+s,.72,.94,.02,3.92,2.44,s*1.45,dark);
box("Cab_door_panel_"+s,.68,.90,.025,3.92,2.44,s*1.464,red);
box("Cab_door_latch_"+s,.17,.045,.07,4.13,2.71,s*1.5,steel);
}
for(const end of [2.633,4.872]){
for(const s of [-1,1]){
box("Windshield_gasket_"+end+"_"+s,.04,.70,.96,end,3.75,s*.66,black);
box("Windshield_glass_"+end+"_"+s,.055,.58,.84,end+(end>4?.025:-.025),3.75,s*.66,glass);
rod("Wiper_"+end+"_"+s,[end+(end>4?.068:-.068),3.47,s*.35],[end+(end>4?.068:-.068),3.91,s*.8],.013,dark);
}
}
prism("Short_nose",4.84,7.25,[[1.91,-1.06],[2.79,-1.06],[3.02,-.81],[3.02,.81],[2.79,1.06],[1.91,1.06]],red);
for(const s of [-1,1])box("Nose_cream_band_"+s,2.35,.32,.025,6.075,2.66,s*1.078,cream);
box("Front_nose_cream_band",.026,.32,2.13,7.27,2.66,0,cream);
box("Rear_cream_band",.026,.42,2.13,-7.27,3.06,0,cream);
// Roof fans: rings, radial blades, grille bars.
for(let i=0;i<3;i++){
let x=-5.9+i*1.55;
cyl("Fan_shroud_"+i,.61,.11,x,3.96,0,dark,[0,0,0]);
cyl("Fan_recess_"+i,.52,.12,x,3.97,0,black,[0,0,0]);
cyl("Fan_hub_"+i,.11,.15,x,4.02,0,steel,[0,0,0],root,20);
for(let j=0;j<10;j++){
let a=j*Math.PI/5;rod("Fan_radial_grille_"+i+"_"+j,[x+Math.cos(a)*.1,4.053,Math.sin(a)*.1],[x+Math.cos(a)*.56,4.053,Math.sin(a)*.56],.015,steel);
}
for(const r of [.27,.44,.59]){
const t=createPart("Fan_cage_ring_"+i+"_"+r,new THREE.TorusGeometry(r,.014,6,40),steel,{position:[x,4.057,0],rotation:[90,0,0],parent:root});
}
}
box("Exhaust_plinth",.7,.15,.65,-.70,3.98,0,dark);
cyl("Exhaust_stack",.18,.37,-.70,4.18,0,dark,[0,0,0],root,20);
cyl("Exhaust_dark_mouth",.135,.008,-.70,4.37,0,black,[0,0,0],root,20);
for(const s of [-1,1]){
cyl("Horn_"+s,.095,.39,3.16,4.61,s*.25,cream,[0,0,90],root,16);
cyl("Horn_bell_"+s,.14,.035,3.36,4.61,s*.25,dark,[0,0,90],root,20);
rod("Horn_mount_"+s,[3.05,4.44,s*.25],[3.05,4.6,s*.25],.025,dark);
}
rod("Antenna",[4.2,4.47,.15],[4.2,4.94,.15],.014,steel);
// Underbody tank and separate air reservoirs.
prism("Fuel_tank",-2.30,2.05,[[.34,-.85],[.34,.85],[.50,1.13],[1.32,1.13],[1.4,.95],[1.4,-.95],[1.32,-1.13],[.50,-1.13]],dark);
for(const x of [-1.8,1.5])for(const s of [-1,1])box("Tank_strap_"+x+"_"+s,.13,.80,.035,x,.91,s*1.15,steel);
for(const s of [-1,1]){
cyl("Air_reservoir_"+s,.21,2.7,-.1,1.28,s*1.32,dark,[0,0,90]);
cyl("Fuel_cap_"+s,.11,.06,.65,1.19,s*1.19,steel);
pipe("Air_line_"+s,[[-2.6,1.30,s*1.37],[-1.8,1.48,s*1.37],[1.7,1.48,s*1.37],[2.65,1.20,s*1.37]],.032,steel);
}
// Six powered axles, flanges, recessed wheel faces, exposed truck frames.
for(const c of [-4.75,4.75]){
const truck=createPivot(c<0?"Rear_truck":"Front_truck",[c,0,0],root);
box("Truck_cross_bolster",1.1,.30,2.35,0,1.14,0,dark,truck);
cyl("Truck_pivot",.4,.26,0,1.40,0,steel,[0,0,0],truck);
for(const a of [-1.28,0,1.28]){
cyl("Axle_"+a,.125,2.41,a,.59,0,steel,[90,0,0],truck,20);
cyl("Traction_motor_"+a,.27,.96,a+.28,.72,0,dark,[90,0,0],truck,20);
for(const s of [-1,1]){
cyl("Wheel_tread_"+a+"_"+s,.59,.19,a,.59,s*.84,steel,[90,0,0],truck,48);
cyl("Wheel_flange_"+a+"_"+s,.635,.047,a,.59,s*.733,dark,[90,0,0],truck,48);
cyl("Wheel_dished_face_"+a+"_"+s,.46,.032,a,.59,s*.955,dark,[90,0,0],truck,40);
cyl("Wheel_hub_"+a+"_"+s,.20,.11,a,.59,s*1.008,steel,[90,0,0],truck,24);
cyl("Axle_box_round_"+a+"_"+s,.185,.23,a,.59,s*1.16,dark,[90,0,0],truck,24);
box("Axle_box_cover_"+a+"_"+s,.30,.29,.06,a,.59,s*1.31,steel,truck);
for(const dx of [-.10,.10])for(const dy of [-.095,.095])cyl("Axlebox_bolt",.026,.028,a+dx,.59+dy,s*1.358,dark,[90,0,0],truck,8);
for(const dx of [-.43,.43]){
box("Brake_shoe",.12,.32,.19,a+dx,.57,s*.91,dark,truck);
rod("Brake_hanger",[a+dx,.66,s*1.01],[a+dx*.87,1.03,s*1.02],.038,steel,truck);
}
}
}
for(const s of [-1,1]){
box("Truck_upper_frame_"+s,3.55,.18,.24,0,1.06,s*1.18,dark,truck);
box("Truck_lower_tie_"+s,3.22,.105,.16,0,.37,s*1.18,dark,truck);
for(const x of [-.66,.66]){
box("Spring_bottom_seat",.54,.09,.35,x,.64,s*1.2,steel,truck);
box("Spring_upper_seat",.54,.07,.35,x,1.05,s*1.2,steel,truck);
for(const dx of [-.14,.14]){
const pts=[];for(let k=0;k<=64;k++){let a=k/64*Math.PI*12;pts.push([x+dx+.082*Math.cos(a),.70+k/64*.28,s*1.2+.082*Math.sin(a)]);}
pipe("Suspension_coil",pts,.023,steel,truck);
}
rod("Suspension_diagonal",[x-.24,.43,s*1.23],[x+.22,.93,s*1.23],.055,dark,truck);
}
rod("Brake_pull_rod",[-1.69,.79,s*1.37],[1.69,.79,s*1.37],.03,steel,truck);
for(const ax of [-1.28,0,1.28])rod("Brake_cross_link",[ax+.38,.91,s*1.02],[ax+.38,.79,s*1.37],.035,steel,truck);
cyl("Brake_cylinder",.115,.46,.62,1.20,s*1.19,dark,[0,0,90],truck,16);
for(const x of [-1.7,1.7])rod("Frame_end_taper",[x,1.06,s*1.18],[x*.90,.38,s*1.18],.08,dark,truck);
}
}
// End pilots, knuckle couplers, hoses and steps.
for(const e of [-1,1]){
box("Pilot_beam_"+e,.23,.64,2.88,e*8.13,1.16,0,red);
prism("Pilot_plow_"+e,e*8.13-.16,e*8.13+.16,[[.28,-1.30],[.28,1.30],[.94,1.43],[.94,-1.43]],dark);
box("Coupler_shank_"+e,.67,.19,.24,e*8.51,.94,0,steel);
box("Coupler_head_"+e,.30,.28,.40,e*8.85,.96,0,dark);
box("Coupler_knuckle_"+e,.18,.27,.16,e*8.99,.96,.17,steel);
for(const s of [-1,1]){
pipe("Brake_hose_"+e+"_"+s,[[e*8.3,1.28,s*.49],[e*8.53,.99,s*.55],[e*8.49,.56,s*.61],[e*8.30,.58,s*.65]],.042,black);
box("End_marker_housing_"+e+"_"+s,.1,.16,.18,e*7.32,2.23,s*.79,dark);
cyl("End_marker_lens_"+e+"_"+s,.06,.045,e*7.39,2.23,s*.79,lamp,[0,0,90],root,16);
for(let i=0;i<4;i++){
box("Entry_step_"+e+"_"+s,.59,.09,.40,e*(7.63+.07*i),.52+i*.35,s*1.28,steel);
}
rod("Step_outer_stringer_"+e+"_"+s,[e*7.9,.44,s*1.49],[e*7.6,1.88,s*1.49],.047,dark);
}
for(const y of [2.92,3.17]){
cyl("Headlight_bezel_"+e+"_"+y,.135,.09,e*(e>0?4.94:7.34),e>0?y+.89:y+.33,0,steel,[0,0,90]);
cyl("Headlight_lens_"+e+"_"+y,.102,.10,e*(e>0?4.97:7.37),e>0?y+.89:y+.33,0,lamp,[0,0,90]);
}
}
// Safety rails: side walkways and end returns.
for(const s of [-1,1]){
for(const range of [[-7.85,2.5],[5.1,7.9]]){
rod("Cream_top_handrail",[range[0],2.79,s*1.43],[range[1],2.79,s*1.43],.032,brass);
const count=Math.ceil((range[1]-range[0])/1.4);
for(let i=0;i<=count;i++){
let x=range[0]+(range[1]-range[0])*i/count;
rod("Handrail_stanchion",[x,1.91,s*1.43],[x,2.79,s*1.43],.028,brass);
box("Stanchion_foot",.09,.10,.09,x,1.96,s*1.43,dark);
}
}
for(const e of [-1,1]){
rod("End_handrail",[e*7.91,2.79,s*1.43],[e*7.91,2.79,s*.40],.032,brass);
rod("End_gate_upright",[e*7.91,1.93,s*.4],[e*7.91,2.79,s*.4],.03,brass);
}
}
// Crisp geometry-based road numbers.
const glyphs={"2":[0,1,6,4,3],"4":[5,6,1,2],"0":[0,1,2,3,4,5],"6":[0,5,6,4,3,2]};
function number(s){
const str="2406",sz=.30,base=-1.43;
for(let i=0;i<4;i++){let x=base+i*.39;for(const a of glyphs[str[i]]){
const xy=[[0,.2],[.1,.1],[.1,-.1],[0,-.2],[-.1,-.1],[-.1,.1],[0,0]][a];
box("Road_number_"+s+"_"+i+"_"+a,a===0||a===3||a===6?.19:.038,a===0||a===3||a===6?.035:.18,.018,x+xy[0],3.48+xy[1],s*1.087,cream);
}}
}
number(-1);number(1);
const nameCounts={};root.traverse(o=>{const n=o.name||"Part";nameCounts[n]=(nameCounts[n]||0)+1;if(nameCounts[n]>1)o.name=n+"_"+nameCounts[n];});
root.position.y=.045;
return root;
}

Brief and retained revisions

Recorded brief

Make the red paint deep forest green and the handrails brass.

  1. Saved revision 1

    Create a red and cream diesel locomotive with detailed wheels and running gear.

    Download saved revision 1 source

    SHA-256: 341f79e9b238326374b535b05221baa7eda081d38563e57df03dc931aadf74b1

  2. Saved revision 2 · Shown here

    Make the red paint deep forest green and the handrails brass.

    Download saved revision 2 source

    SHA-256: 483aef3d91f13d831e9c964dcd059957ee26b4c230b92cf2feb26d684e548378