Skip to content
Kiln1.3Get Kiln

Original pair of AA cells with procedural pixel labels, raised positive caps and a paper band.

Cabin in the Woods: PSX Horror pack
Original pair of AA cells with procedural pixel labels, raised positive caps and a paper band.

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.

Triangles
184
Meshes
1
Materials
1
Dimensions (m)
0.01 × 0.05 × 0.03

Full Kiln assets (remixable)

Models plus Kiln source, editing metadata, materials and included revisions, so you can reopen and continue editing.

62,105 bytes (0.06 MB)

Download full kiln assets (remixable)

Runtime includes the GLB and metadata sidecar. The editable ZIP contains this selected revision and its complete material closure. Parent revision identifiers are retained; earlier authoring history is deliberately not distributed in this initial pack.

Import this ZIP into Kiln’s Library, or run node kiln.mjs import asset.zip in an authoring workspace. The full model, exact source, editing metadata, preview and material resources are included so you can reopen and remix it.

Use an importing Kiln build that supports the included material schemas. Use Kiln 1.2.3 or later.

Collection / asset / revision
project / a_5c156f53c97e40d691a837d7b79d69cb / r_13cfa449003d45fcaa97199bba3f5b10
Source SHA-256
2b8038b1db1d5c952852d2d33e0356f3eb2746c535a159228bb2102ae743a67b
AA battery pair: exact saved source
const MATERIAL={"schemaVersion": 3, "model": "pbrMetallicRoughness", "name": "Fictional battery cream and dark green labels", "roughness": 0.7, "metalness": 0.12, "emissiveIntensity": 1, "alphaMode": "opaque", "alphaCutoff": 0.5, "doubleSided": false, "textures": {"baseColor": {"kind": "resource", "resourceId": "kiln.library.40df14512765020548fa35dee36441e252843352d8cdcd7a8252a51ee049d07f.base-color", "sampler": {"minFilter": "nearest", "magFilter": "nearest", "wrapS": "clamp-to-edge", "wrapT": "clamp-to-edge"}}}};
const meta={name:'AA battery pair',role:'prop'};
// Real 50mm tall cells, 14mm nominal diameter. Presentation enlargement is consumer-only.
const PROFILE=[[0,.0066],[.0007,.007],[.047,.007],[.048,.0066]];
function buffer(){return {p:[],uv:[]};}
function tri(o,p,uv){for(let k=0;k<3;k++){o.p.push(...p[k]);o.uv.push(...uv[k]);}}
function quad(o,p,uv){tri(o,[p[0],p[1],p[2]],[uv[0],uv[1],uv[2]]);tri(o,[p[0],p[2],p[3]],[uv[0],uv[2],uv[3]]);}
function ring(x,z,y,r){return Array.from({length:8},(_,k)=>{const a=k*2*Math.PI/8-Math.PI/2;return[x+Math.cos(a)*r,y,z+Math.sin(a)*r];});}
function cap(o,x,z,y,r,up,region){const p=ring(x,z,y,r);for(let k=1;k<7;k++){const ids=up?[0,k+1,k]:[0,k,k+1];tri(o,ids.map(i=>p[i]),ids.map(i=>[.5+.4*Math.cos(i*2*Math.PI/8),region[0]+(region[1]-region[0])*(.5+.4*Math.sin(i*2*Math.PI/8))]));}}
function cell(o,x,z){const rings=PROFILE.map(([y,r])=>ring(x,z,y,r));for(let k=0;k<3;k++)for(let i=0;i<8;i++){const q=(i+1)%8,lo=k===1?.05:.635,hi=k===1?.455:.735;quad(o,[rings[k][i],rings[k+1][i],rings[k+1][q],rings[k][q]],[[i/8,lo],[i/8,hi],[(i+1)/8,hi],[(i+1)/8,lo]]);}cap(o,x,z,0,.0066,false,[.51,.615]);cap(o,x,z,.048,.0066,true,[.51,.615]);const a=ring(x,z,.048,.0028),b=ring(x,z,.050,.0028);for(let i=0;i<8;i++){const q=(i+1)%8;quad(o,[a[i],b[i],b[q],a[q]],[[.2,.51],[.2,.615],[.8,.615],[.8,.51]]);}cap(o,x,z,.050,.0028,true,[.51,.615]);}
function band(o){const d=.007*Math.SQRT1_2,outline=[[-.007,-.0076],[-d,-.0076-d],[0,-.0146],[d,-.0076-d],[.007,-.0076],[.007,.0076],[d,.0076+d],[0,.0146],[-d,.0076+d],[-.007,.0076]],bottom=.019,top=.029;for(let i=0;i<outline.length;i++){const a=outline[i],b=outline[(i+1)%outline.length];quad(o,[[a[0],bottom,a[1]],[a[0],top,a[1]],[b[0],top,b[1]],[b[0],bottom,b[1]]],[[i/outline.length,.758],[i/outline.length,.995],[(i+1)/outline.length,.995],[(i+1)/outline.length,.758]]);}}
async function build(){const root=createRoot('BatteryPair'),mat=await compilePortableMaterialSpecV3(MATERIAL),o=buffer();cell(o,0,-.0076);cell(o,0,.0076);band(o);const g=new THREE.BufferGeometry();g.setAttribute('position',new THREE.Float32BufferAttribute(o.p,3));g.setAttribute('uv',new THREE.Float32BufferAttribute(o.uv.map((v,i)=>i%2?1-v:v),2));g.computeVertexNormals();const mesh=new THREE.Mesh(g,mat);mesh.name='BatteryPair_CellsAndPaperBand';root.add(mesh);markOpenShell(mesh,'Intentional thin open paper strap around two closed cell bodies; overlaps attach the band, no manufacturing-solid claim.');for(const [name,pos]of [['pickup_root',[0,0,0]],['display_center',[0,.025,0]],['cell_left_positive',[0,.050,-.0076]],['cell_right_positive',[0,.050,.0076]]]){const a=new THREE.Object3D();a.name=name;a.position.set(...pos);root.add(a);}root.userData.batteryPickup={version:1,cellNominalDimensions:[.014,.050,.014],cellCount:2,canonicalScale:1,suggestedConsumerPresentationScale:2.5,axes:'+X forward,+Y cells up,+Z right',band:'thin fictional paper label strap',runtimeOnly:'Floating rotation/pickup collision/inventory are scene-owned; canonical AA dimensions are preserved.'};return root;}

Asset content follows the supplied CC0-1.0 licence record. Kiln and scene software retain their own licences.