Skip to content
Kiln0.10Get Kiln

Spiral shell roof around an open two-level habitat

Earlier examples from earlier Kiln versions.

Historical gallery render of Nautilus habitat; 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
41,380
Estimated draws
152
Materials
7
Textures
0
Animation clips
0
Bounds X × Y × Z
7.42 × 6.99 × 7.25 m
Build warnings
0

Measurements come from this build.

Download this build

Runtime: 667,268 bytes. Original: 667,040 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
c1cea1ef7a16d7ecb382bcf07a558b2894e458a55518e2120b81e5d549794751
Original GLB
f51bb4540994c552aa9755b3de2b323306df1eee89a7e2a7d8f3886382ee4dc6
Source
7c98646e72943fbbbaa79391cc3951dd804f459eb1a36ce7d21c46f75370f5b2

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 Codex ·

Recorded Codex / gpt-6-astra authoring run; configured model, no provider-internal attestation.

Source access
Fresh project-local workspace with a design brief, installed skills and Kiln tools.
Inherited context
Fresh independent authoring conversation.
Starting example
None supplied.
Human input
Maintainer supplied the brief, reviewed the exported image and generated the gallery poster. Source preserved byte-for-byte from the model export.
Authoring review
Maintainer inspected the actual GPU export. Whole and detail review and two refinement passes are recorded by the authoring run. Unchecked surface self-intersections remain a limitation; destination-runtime behavior has not been tested.

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

nautilus-habitat.kiln.js
const meta={name:'PELAGIC / Nautilus field habitat',category:'architecture',role:'building'};
function build(){
const root=createRoot('PelagicHabitat');
const ceramic=gameMaterial(0xd5ac82,{roughness:.62,flatShading:false}),edge=gameMaterial(0xefcfaa,{roughness:.48,flatShading:false}),metal=gameMaterial(0x263c40,{metalness:.72,roughness:.35,flatShading:false}),floor=gameMaterial(0x897c68,{roughness:.78}),glass=glassMaterial(0x6cae9d,{opacity:.38,roughness:.16}),white=gameMaterial(0xe4dfcd,{roughness:.6}),light=gameMaterial(0xb7ecd7,{emissive:0x80bca5,emissiveIntensity:.6});
const roof=createPivot('SpiralRoof',[0,0,0],root),interior=createPivot('Interior',[0,0,0],root),circulation=createPivot('Circulation',[0,0,0],interior),service=createPivot('ServicePack',[0,0,0],root);
function box(n,w,h,d,x,y,z,m=metal,p=root){return createPart(n,boxGeo(w,h,d),m,{position:[x,y,z],parent:p});}
function rod(n,a,b,r=.035,m=metal,p=root){return beamBetween(n,a,b,r,m,{segments:12,parent:p});}
function spiral(t,z,offset=0){const r=4.8*Math.exp(-.27*t)+offset;return[-.4+r*Math.cos(t),3.5+r*Math.sin(t)+.16*(1-z*z/5.76),z];}
function ribbon(a,b,z0,z1,thick,nu=12,nv=24){const positions=[],indices=[],uvs=[];for(let s=0;s<2;s++)for(let i=0;i<=nu;i++)for(let j=0;j<=nv;j++){let t=a+(b-a)*i/nu,z=z0+(z1-z0)*j/nv;positions.push(...spiral(t,z,s===0?thick/2:-thick/2));uvs.push(i/nu,j/nv);}const row=nv+1,N=(nu+1)*row;for(let s=0;s<2;s++)for(let i=0;i<nu;i++)for(let j=0;j<nv;j++){let q=s*N+i*row+j;if(s===0)indices.push(q,q+1,q+row,q+1,q+row+1,q+row);else indices.push(q,q+row,q+1,q+1,q+row,q+row+1);}function wall(a,b){indices.push(a,b,a+N,b,b+N,a+N);}for(let i=0;i<nu;i++){wall(i*row,(i+1)*row);wall((i+1)*row+nv,i*row+nv);}for(let j=0;j<nv;j++){wall(j+1,j);wall(nu*row+j,nu*row+j+1);}for(let f=0;f<indices.length;f+=3){const swap=indices[f+1];indices[f+1]=indices[f+2];indices[f+2]=swap;}return meshGeo({positions,indices,uvs});}
const start=-.6,end=4.82;
for(let k=0;k<26;k++){let a=start+(end-start)*k/26,b=start+(end-start)*(k+1)/26;createPart('CeramicVault_'+k,ribbon(a+.004,b-.004,-2.15,2.15,.16,8,24),ceramic,{parent:roof});}
for(let k=0;k<7;k++){let z=-2.18+k*4.36/6,path=[];for(let i=0;i<=170;i++)path.push(spiral(start+(end-start)*i/170,z,-.13));createPart('CurvedRib_'+k,sweepProfile([[-.065,-.06],[.065,-.06],[.065,.06],[-.065,.06]],path,{up:[0,0,1]}),metal,{parent:roof});}
for(const z of[-2.19,2.19])createPart('CeramicEdge_'+z,ribbon(start,end,z-.065,z+.065,.24,192,2),edge,{parent:roof});
box('LowerDeck',5.3,.22,3.7,.75,.65,0,floor,interior);
box('Mezzanine',2.75,.18,3.55,1.925,2.72,0,floor,interior);
for(const x of[-1.55,3.02])for(const z of[-1.45,1.45]){box('Footing_'+x+'_'+z,.72,.16,.65,x,.08,z,ceramic);rod('FoundationStrut_'+x+'_'+z,[x,.16,z],[x,.55,z],.10);}
for(const z of[-1.6,1.6]){rod('MezzanineColumn_'+z,[2.96,.76,z],[2.96,2.63,z],.065);rod('LeftShellSupport_'+z,[-1.55,.76,z],spiral(3.45,z,-.15),.075);rod('DeckGirder_'+z,[-1.85,.49,z],[3.4,.49,z],.09);}
for(let i=0;i<12;i++)box('StairTread_'+i,.24,.085,.9,-1.9+(i+.5)*.205,.76+(i+1)*1.87/12,2.77,edge,circulation);
for(const z of[2.28,3.26]){rod('StairStringer_'+z,[-1.9,.7,z],[.56,2.57,z],.075,metal,circulation);rod('StairHandrail_'+z,[-1.9,1.7,z],[.56,3.57,z],.03,metal,circulation);for(let i=0;i<4;i++){let x=-1.9+i*.82,y=.76+i*.623;rod('StairPost_'+z+'_'+i,[x,y,z],[x,y+.94,z],.022,metal,circulation);}}
for(let i=1;i<5;i++){let x=.69+i*.62;box('MezzanineGlass_'+i,.57,.78,.035,x,3.2,1.79,glass,interior);rod('Baluster_'+i,[x-.3,2.82,1.8],[x-.3,3.66,1.8],.025,metal,interior);}
rod('UpperGuardCap',[1.01,3.66,1.8],[3.48,3.66,1.8],.035,metal,interior);
box('StairLowerLanding',2.85,.18,1.52,-.53,.65,2.54,floor,circulation);
box('StairUpperLanding',.82,.18,1.57,.87,2.72,2.53,floor,circulation);
for(const x of[-1.65,1.17]){box('StairFoot_'+x,.48,.16,.48,x,.08,3.06,ceramic,circulation);rod('StairLandingLeg_'+x,[x,.16,3.06],[x,.57,3.06],.075,metal,circulation);}
rod('UpperLandingBrace',[1.17,.57,3.06],[1.17,2.64,3.06],.065,metal,circulation);
rod('LandingFrontGuard',[.5,3.66,3.28],[1.28,3.66,3.28],.03,metal,circulation);
rod('LandingReturnGuard',[1.28,3.66,3.28],[1.28,3.66,1.8],.03,metal,circulation);
for(const z of[1.8,2.55,3.28])rod('LandingGuardPost_'+z,[1.28,2.8,z],[1.28,3.66,z],.025,metal,circulation);
rod('RearMezzanineGuard',[.55,3.66,-1.77],[3.3,3.66,-1.77],.03,metal,interior);
for(const x of[.55,1.9,3.3])rod('RearGuardPost_'+x,[x,2.81,-1.77],[x,3.66,-1.77],.025,metal,interior);
box('ResearchBench',1.9,.11,.58,2.0,3.5,-1.13,white,interior);
for(const x of[1.2,2.8])box('BenchCabinet_'+x,.46,.62,.54,x,3.13,-1.13,metal,interior);
for(const x of[1.55,2.35]){rod('MonitorStand_'+x,[x,3.55,-1.27],[x,3.7,-1.27],.035,metal,interior);box('Monitor_'+x,.5,.37,.055,x,3.79,-1.27,metal,interior);box('MonitorDisplay_'+x,.43,.29,.012,x,3.79,-1.232,light,interior);}
box('LowerLabWorktop',1.65,.1,.64,1.7,1.51,-1.13,white,interior);box('LowerLabStorage',1.54,.65,.58,1.7,1.13,-1.13,metal,interior);
for(let i=0;i<4;i++)box('LabDrawer_'+i,.32,.46,.022,1.12+i*.39,1.19,-.827,ceramic,interior);
box('EntryLanding',1.55,.16,1.22,2.5,.64,2.45,edge,circulation);for(let i=0;i<3;i++)box('EntranceStep_'+i,1.5,.16,.34,2.5,.16+i*.16,3.48-i*.34,ceramic,circulation);
for(const x of[1.7,3.3])box('EntryJamb_'+x,.1,2.02,.12,x,1.74,1.96,metal,interior);
box('EntryLintel',1.7,.13,.15,2.5,2.78,1.96,metal,interior);box('SlidingDoorParked',.67,1.85,.04,3.66,1.72,1.98,glass,interior);
box('RearGlazing',3.1,1.8,.045,1.65,1.69,-1.89,glass,interior);for(const x of[.1,1.65,3.2])box('RearMullion_'+x,.055,1.85,.09,x,1.69,-1.91,metal,interior);
box('ServiceCradle',1.0,.15,2.2,-1.75,.42,-2.5,metal,service);
for(let i=0;i<2;i++){const z=-2.04-i*.9;createPart('PressureVessel_'+i,cylinderGeo(.31,.31,1.6,40),white,{position:[-1.75,1.3,z],parent:service});for(const y of[.69,1.89])createPart('VesselBand_'+i+'_'+y,cylinderGeo(.325,.325,.09,40),metal,{position:[-1.75,y,z],parent:service});rod('ServicePipe_'+i,[-1.75,2.13,z],[-.8,2.13,z],.055,metal,service);rod('SupplyRiser_'+i,[-.8,2.13,z],[-.8,.78,-1.5],.055,metal,service);}
box('HeatExchanger',.55,1.15,1.6,-2.39,1.14,-2.5,metal,service);for(let i=0;i<12;i++)box('CoolingFin_'+i,.65,.045,1.7,-2.4,.64+i*.092,-2.5,ceramic,service);
box('EntryWayfinding',.6,.19,.06,3.0,2.45,2.04,light,interior);
return root;
}

Brief and retained revisions

Brief summary

Design a small nautilus-inspired research habitat with a spiral roof, curved structural ribs, a visible multi-level interior, believable circulation and attached service equipment. Use ceramic, dark metal and sea-green glass; inspect and refine the form.

  1. Initial design

    Initial imported program.

    Download initial design source

    SHA-256: 7f8b05623ccd1ae68e8e1d9949550274c3772f363cf1f61567149dbec73d83c5

  2. Source revision 1

    Exact retained source after a successful literal edit call; unchanged text outside the requested edits was preserved.

    Download source revision 1 source

    SHA-256: 749a58cda43ae78d4ff0fefa946cafd90896e0d99118aa18cd5c73d7651a6383

  3. Source revision 2

    Exact retained source after a successful literal edit call; unchanged text outside the requested edits was preserved.

    Download source revision 2 source

    SHA-256: ef2ba2b6406792b7c5f621a32b89e7461c557fa02f7d13a36039c7f343edcdb5

  4. Current gallery revision · Shown here

    Exact retained source after a successful literal edit call; unchanged text outside the requested edits was preserved.

    Download current gallery revision source

    SHA-256: 7c98646e72943fbbbaa79391cc3951dd804f459eb1a36ce7d21c46f75370f5b2