Polar rover
Tracked expedition rover with folding solar panels and instruments
Earlier examples from earlier Kiln versions.

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. Optional extensions declared by this file: KHR_materials_emissive_strength. Importer support varies; see the Blender and Unity guide. 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
- 22,262
- Estimated draws
- 241
- Materials
- 14
- Textures
- 0
- Animation clips
- 1
- Bounds X × Y × Z
- 2.64 × 2.17 × 2.18 m
- Build warnings
- 1
Measurements come from this build.
Download this build
Runtime: 283,704 bytes. Original: 283,476 bytes.
These GLBs are build outputs of the MIT-licensed example source; no separate terms are stated for the builds.
Runtime provenance metadataSHA-256 download hashes
- Runtime GLB
- 281b4f1f1687eb4cee739cab41fe06127e00a35ad25fcbef46d85b8374b72eda
- Original GLB
- 4359ae5ea373b1b7d88751bb1edd80849c2be335bf956f1e3c44d17ed9537a03
- Source
- aea09b2491cc06ac710648d0de30bb365fa1b2c0fff10712cb70db07e8216515
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
Gemini 3.8 Flash through Antigravity CLI (agy) ·
Recorded Antigravity / gemini-3.8-flash-high run; configured model, no provider-internal attestation.
- Source access
- Fresh project-local authoring workspace with a brief, installed skills and Kiln tools.
- Inherited context
- Fresh independent authoring conversation.
- Starting example
- None supplied.
- Human input
- Maintainer supplied the brief and reviewed actual exports and uniform gallery posters. Final source bytes are preserved from the model export.
- Authoring review
- Actual GPU images inspected independently. Roof highlights remain bright. Tracked motion and mechanical clearance are not certified; this is a stylized expedition vehicle.
Gallery GPU render of this exact source. The separate poster receipt records image, camera, renderer, and the artifact hash of the GLB bytes the image was rendered from.
Poster camera and render recordThe source behind this build
const meta = {
name: 'Polar Research Rover',
category: 'vehicle',
role: 'vehicle',
};
async function build() {
const root = createRoot('PolarRover');
// --- Materials ---
// Expedition safety orange bodywork
const matOrange = gameMaterial(0xee5511, { roughness: 0.35, metalness: 0.15 });
// Arctic ivory / white aerodynamic fairings and roof
const matIvory = gameMaterial(0xf5f3ec, { roughness: 0.28, metalness: 0.12 });
// Heavy chassis structural steel / gunmetal
const matChassis = gameMaterial(0x1e2226, { roughness: 0.65, metalness: 0.75 });
// High-durability reinforced rubber track composite
const matTrack = gameMaterial(0x131518, { roughness: 0.88, metalness: 0.05 });
// Machined titanium / alloy sprockets and hubs
const matMachined = gameMaterial(0x4a525d, { roughness: 0.38, metalness: 0.85 });
// Polar expedition tinted glass
const matGlass = glassMaterial(0x203f5b, { opacity: 0.55, roughness: 0.12, metalness: 0.80 });
// Dark window trim and gaskets
const matGasket = gameMaterial(0x151618, { roughness: 0.90, metalness: 0.10 });
// Photovoltaic solar cells
const matSolar = gameMaterial(0x0c1e36, { roughness: 0.18, metalness: 0.90 });
// Gold thermal insulation foil
const matGoldFoil = gameMaterial(0xd8b030, { roughness: 0.35, metalness: 0.85 });
// Scientific instrument anodized cobalt
const matSciBlue = gameMaterial(0x225588, { roughness: 0.40, metalness: 0.60 });
// Polished chrome / optical mirror
const matChrome = gameMaterial(0xbbbbbb, { roughness: 0.15, metalness: 0.95 });
// LED headlight cluster (bright cool white)
const matLedWhite = gameMaterial(0xffffff, { emissive: 0xeef6ff, emissiveIntensity: 3.2 });
// Amber expedition fog / hazard lamps
const matAmber = gameMaterial(0xffaa00, { emissive: 0xff8800, emissiveIntensity: 2.2 });
// Red LED taillights / beacon
const matRed = gameMaterial(0xff2211, { emissive: 0xee1100, emissiveIntensity: 2.0 });
// ==========================================
// 1. CHASSIS & UNDERBODY
// ==========================================
// Main structural hull
const chassisGeo = await roundedBoxGeo(2.30, 0.36, 1.22, 0.05, { style: 'chamfer', segments: 8 });
createPart('ChassisTub', chassisGeo, matChassis, { position: [0.0, 0.44, 0.0], parent: root });
// Underbody skid plate (angled nose deflection)
const skidPlateGeo = await extrudeProfile([
[-1.10, 0.28],
[0.70, 0.28],
[1.15, 0.44],
[1.12, 0.48],
[0.68, 0.32],
[-1.10, 0.32]
], { depth: 1.16, axis: 'z', center: true });
createPart('SkidPlate', skidPlateGeo, matChassis, { parent: root });
// Front heavy-duty bumper & bullbar
const bumperCenterGeo = await roundedBoxGeo(0.18, 0.14, 1.28, 0.03, { style: 'chamfer' });
createPart('BumperBar', bumperCenterGeo, matChassis, { position: [1.16, 0.46, 0.0], parent: root });
// Winch assembly
const winchBodyGeo = await roundedBoxGeo(0.20, 0.16, 0.38, 0.02, { style: 'chamfer' });
createPart('WinchHousing', winchBodyGeo, matMachined, { position: [1.22, 0.48, 0.0], parent: root });
const winchDrumGeo = cylinderZGeo(0.06, 0.06, 0.22, 16);
createPart('WinchDrum', winchDrumGeo, matSciBlue, { position: [1.22, 0.48, 0.0], parent: root });
// Front recovery D-rings (red)
for (const zSign of [-1, 1]) {
const shackleGeo = torusGeo(0.045, 0.012, 8, 16);
createPart(`RecoveryShackle_${zSign > 0 ? 'R' : 'L'}`, shackleGeo, matRed, {
position: [1.26, 0.42, zSign * 0.45],
rotation: [90, 0, 0],
parent: root
});
}
// Rear towing hitch & tow pintle
const hitchGeo = await roundedBoxGeo(0.16, 0.12, 0.20, 0.02);
createPart('RearHitch', hitchGeo, matChassis, { position: [-1.20, 0.42, 0.0], parent: root });
// Rear red marker / tail lamps
for (const zSign of [-1, 1]) {
const tailLampGeo = await roundedBoxGeo(0.05, 0.08, 0.16, 0.01);
createPart(`TailLamp_${zSign > 0 ? 'R' : 'L'}`, tailLampGeo, matRed, {
position: [-1.16, 0.52, zSign * 0.52],
parent: root
});
}
// ==========================================
// 2. TRACKS AND SUSPENSION
// ==========================================
// Build track side profile polygon
const rRear = 0.34;
const xRear = -0.75;
const yRear = 0.36;
const rFront = 0.26;
const xFront = 0.75;
const yFront = 0.40;
const trackThick = 0.04;
const trackDepth = 0.30;
// Outer track profile (CCW)
const outerOutline = [];
// Bottom straight
outerOutline.push([xRear, 0.02]);
outerOutline.push([0.45, 0.02]);
// Approach ramp to front idler
const frontBottomAngle = -Math.PI * 0.42;
const frontTopAngle = Math.PI * 0.40;
for (let i = 0; i <= 8; i++) {
const a = frontBottomAngle + (frontTopAngle - frontBottomAngle) * (i / 8);
outerOutline.push([xFront + rRear * 0.76 * Math.cos(a), yFront + rRear * 0.76 * Math.sin(a)]);
}
// Top straight back to rear sprocket
const rearTopAngle = Math.PI * 0.50;
const rearBackAngle = Math.PI * 1.50;
for (let i = 0; i <= 10; i++) {
const a = rearTopAngle + (rearBackAngle - rearTopAngle) * (i / 10);
outerOutline.push([xRear + rRear * Math.cos(a), yRear + rRear * Math.sin(a)]);
}
// Inner track hole (offset inward)
const innerHole = [];
innerHole.push([xRear, 0.02 + trackThick]);
innerHole.push([0.45, 0.02 + trackThick]);
for (let i = 0; i <= 8; i++) {
const a = frontBottomAngle + (frontTopAngle - frontBottomAngle) * (i / 8);
innerHole.push([xFront + (rRear * 0.76 - trackThick) * Math.cos(a), yFront + (rRear * 0.76 - trackThick) * Math.sin(a)]);
}
for (let i = 0; i <= 10; i++) {
const a = rearTopAngle + (rearBackAngle - rearTopAngle) * (i / 10);
innerHole.push([xRear + (rRear - trackThick) * Math.cos(a), yRear + (rRear - trackThick) * Math.sin(a)]);
}
// Extrude continuous track geometry
const trackGeo = await extrudeProfile(outerOutline, {
depth: trackDepth,
holes: [innerHole],
axis: 'z',
center: true,
});
// Grousers / tread cleats
const grouserGeo = await roundedBoxGeo(0.045, 0.018, trackDepth + 0.02, 0.004);
// Build left and right track assemblies
for (const zSign of [-1, 1]) {
const sideName = zSign > 0 ? 'Right' : 'Left';
const zTrack = zSign * 0.80;
// Track belt
createPart(`TrackBelt_${sideName}`, trackGeo, matTrack, { position: [0, 0, zTrack], parent: root });
// Grousers around track belt
// Bottom run grousers
for (let gx = -0.70; gx <= 0.42; gx += 0.14) {
createPart(`GrouserBot_${sideName}_${gx.toFixed(2)}`, grouserGeo, matChassis, {
position: [gx, 0.01, zTrack],
parent: root
});
}
// Top run grousers
for (let gx = -0.70; gx <= 0.70; gx += 0.15) {
createPart(`GrouserTop_${sideName}_${gx.toFixed(2)}`, grouserGeo, matChassis, {
position: [gx, 0.69 - (gx > 0 ? (gx - 0) * 0.05 : 0), zTrack],
parent: root
});
}
// Rear curved grousers
for (let a = 90; a <= 270; a += 30) {
const rad = a * Math.PI / 180;
const gx = xRear + (rRear + 0.008) * Math.cos(rad);
const gy = yRear + (rRear + 0.008) * Math.sin(rad);
createPart(`GrouserRear_${sideName}_${a}`, grouserGeo, matChassis, {
position: [gx, gy, zTrack],
rotation: [0, 0, -a + 90],
parent: root
});
}
// Front curved grousers around front idler
for (let a = -60; a <= 60; a += 30) {
const rad = a * Math.PI / 180;
const gx = xFront + (rRear * 0.76 + 0.008) * Math.cos(rad);
const gy = yFront + (rRear * 0.76 + 0.008) * Math.sin(rad);
createPart(`GrouserFront_${sideName}_${a}`, grouserGeo, matChassis, {
position: [gx, gy, zTrack],
rotation: [0, 0, -a + 90],
parent: root
});
}
// Rear drive sprocket wheel
const sprocketRimGeo = cylinderZGeo(0.30, 0.30, 0.26, 20);
createPart(`SprocketRim_${sideName}`, sprocketRimGeo, matMachined, {
position: [xRear, yRear, zTrack],
parent: root
});
const sprocketHubGeo = cylinderZGeo(0.14, 0.14, 0.32, 16);
createPart(`SprocketHub_${sideName}`, sprocketHubGeo, matChassis, {
position: [xRear, yRear, zTrack],
parent: root
});
// Sprocket teeth ring
const toothRingGeo = torusGeo(0.30, 0.015, 8, 24);
createPart(`SprocketTeeth_${sideName}`, toothRingGeo, matChassis, {
position: [xRear, yRear, zTrack],
parent: root
});
// Front idler wheel
const idlerRimGeo = cylinderZGeo(0.22, 0.22, 0.26, 18);
createPart(`IdlerRim_${sideName}`, idlerRimGeo, matMachined, {
position: [xFront, yFront, zTrack],
parent: root
});
const idlerHubGeo = cylinderZGeo(0.10, 0.10, 0.32, 12);
createPart(`IdlerHub_${sideName}`, idlerHubGeo, matChassis, {
position: [xFront, yFront, zTrack],
parent: root
});
// Front track tensioner hydraulic cylinder
const tensionerArmGeo = cylinderXGeo(0.035, 0.035, 0.28, 8);
createPart(`Tensioner_${sideName}`, tensionerArmGeo, matChassis, {
position: [xFront - 0.16, yFront - 0.04, zTrack - zSign * 0.08],
rotation: [0, 0, -15],
parent: root
});
// 4 Road wheels along bottom run
const roadXPositions = [-0.48, -0.16, 0.16, 0.46];
for (let rIdx = 0; rIdx < roadXPositions.length; rIdx++) {
const rx = roadXPositions[rIdx];
const ry = 0.20;
// Road wheel rim (dual rubber wheel)
const roadWheelGeo = cylinderZGeo(0.14, 0.14, 0.26, 16);
createPart(`RoadWheel_${sideName}_${rIdx}`, roadWheelGeo, matTrack, {
position: [rx, ry, zTrack],
parent: root
});
// Center alloy hub
const roadHubGeo = cylinderZGeo(0.08, 0.08, 0.29, 12);
createPart(`RoadHub_${sideName}_${rIdx}`, roadHubGeo, matMachined, {
position: [rx, ry, zTrack],
parent: root
});
// Trailing suspension arm to chassis
const armGeo = cylinderXGeo(0.025, 0.025, 0.18, 8);
createPart(`SuspensionArm_${sideName}_${rIdx}`, armGeo, matChassis, {
position: [rx - 0.08, ry + 0.08, zTrack - zSign * 0.08],
rotation: [0, 0, 40],
parent: root
});
// Coilover shock damper
const shockGeo = cylinderGeo(0.02, 0.02, 0.14, 8);
createPart(`Shock_${sideName}_${rIdx}`, shockGeo, matSciBlue, {
position: [rx - 0.02, ry + 0.16, zTrack - zSign * 0.08],
rotation: [0, 0, -20],
parent: root
});
}
// 2 Top track return rollers
for (const rx of [-0.25, 0.22]) {
const rollerGeo = cylinderZGeo(0.065, 0.065, 0.26, 12);
createPart(`ReturnRoller_${sideName}_${rx > 0 ? 'F' : 'R'}`, rollerGeo, matMachined, {
position: [rx, 0.58, zTrack],
parent: root
});
}
}
// ==========================================
// 3. CABIN (ORANGE & IVORY ROUNDED CAB)
// ==========================================
// Main lower cab body (polar safety orange)
const cabBodyGeo = await roundedBoxGeo(1.50, 0.72, 1.26, 0.14, { style: 'round', segments: 16 });
createPart('CabBodyOrange', cabBodyGeo, matOrange, { position: [0.15, 0.98, 0.0], parent: root });
// Aerodynamic nose / front snout transition (orange)
const noseSlopeGeo = await extrudeProfile([
[0.70, 0.65],
[1.08, 0.65],
[0.98, 0.95],
[0.65, 0.95]
], { depth: 1.18, axis: 'z', center: true, bevel: 0.015 });
createPart('CabNoseSlope', noseSlopeGeo, matOrange, { parent: root });
// Upper aerodynamic roof fairing & visor (arctic ivory)
const roofCapGeo = await roundedBoxGeo(1.64, 0.20, 1.30, 0.08, { style: 'round', segments: 14 });
createPart('RoofCapIvory', roofCapGeo, matIvory, { position: [0.18, 1.42, 0.0], parent: root });
// Roof grab rails along left and right edges
for (const zSign of [-1, 1]) {
const railGeo = cylinderXGeo(0.015, 0.015, 1.10, 8);
createPart(`RoofRail_${zSign > 0 ? 'R' : 'L'}`, railGeo, matMachined, {
position: [0.10, 1.55, zSign * 0.58],
parent: root
});
for (const rx of [-0.40, 0.10, 0.60]) {
const stanchionGeo = cylinderGeo(0.012, 0.012, 0.06, 8);
createPart(`RoofStanchion_${zSign > 0 ? 'R' : 'L'}_${rx.toFixed(1)}`, stanchionGeo, matChassis, {
position: [rx, 1.53, zSign * 0.58],
parent: root
});
}
}
// Emergency escape hatch on roof center
const hatchGeo = await roundedBoxGeo(0.42, 0.04, 0.42, 0.015, { style: 'chamfer' });
createPart('RoofEscapeHatch', hatchGeo, matOrange, { position: [0.05, 1.53, 0.0], parent: root });
const hatchHandleGeo = torusGeo(0.05, 0.01, 6, 12);
createPart('RoofHatchHandle', hatchHandleGeo, matMachined, {
position: [0.05, 1.56, 0.0],
rotation: [90, 0, 0],
parent: root
});
// Front aerodynamic sunvisor brow jutting forward (ivory)
const visorBrowGeo = await roundedBoxGeo(0.24, 0.08, 1.28, 0.03, { style: 'round' });
createPart('VisorBrowIvory', visorBrowGeo, matIvory, { position: [0.98, 1.42, 0.0], parent: root });
// Hood matte black anti-glare panel in front of windscreen
const antiGlareGeo = boxGeo(0.38, 0.015, 0.96);
createPart('HoodAntiGlarePanel', antiGlareGeo, matGasket, { position: [0.70, 1.01, 0.0], parent: root });
// Lower nose front sensor fairing (ivory)
const noseFairingGeo = await roundedBoxGeo(0.22, 0.22, 0.96, 0.05, { style: 'round' });
createPart('NoseFairingIvory', noseFairingGeo, matIvory, { position: [1.02, 0.76, 0.0], parent: root });
// Radiator cooling intake grille slats
for (let sIdx = 0; sIdx < 3; sIdx++) {
const grilleSlatGeo = boxGeo(0.02, 0.018, 0.72);
createPart(`NoseGrilleSlat_${sIdx}`, grilleSlatGeo, matChassis, {
position: [1.13, 0.70 + sIdx * 0.05, 0.0],
parent: root
});
}
// Forward LIDAR / radar sensor lens in the nose fairing
const noseSensorGeo = cylinderXGeo(0.08, 0.08, 0.08, 16);
createPart('NoseRadarLens', noseSensorGeo, matGlass, { position: [1.13, 0.76, 0.0], parent: root });
// ==========================================
// 4. WINDOWS & LIGHTS
// ==========================================
// Panoramic front windscreen
const windshieldFrameGeo = await roundedBoxGeo(0.06, 0.44, 1.12, 0.02, { style: 'chamfer' });
createPart('WindshieldFrame', windshieldFrameGeo, matGasket, {
position: [0.88, 1.15, 0.0],
rotation: [0, 0, -18],
parent: root
});
const windshieldGlassGeo = await roundedBoxGeo(0.04, 0.40, 1.08, 0.015);
createPart('WindshieldGlass', windshieldGlassGeo, matGlass, {
position: [0.89, 1.15, 0.0],
rotation: [0, 0, -18],
parent: root
});
// Windshield wipers
for (const zSign of [-1, 1]) {
const wiperBladeGeo = cylinderGeo(0.008, 0.008, 0.28, 6);
createPart(`WiperBlade_${zSign > 0 ? 'R' : 'L'}`, wiperBladeGeo, matChassis, {
position: [0.93, 1.12, zSign * 0.28],
rotation: [0, 0, -28],
parent: root
});
}
// Side observation windows (left and right)
for (const zSign of [-1, 1]) {
const sideName = zSign > 0 ? 'Right' : 'Left';
const zWindow = zSign * 0.635;
// Forward crew window
const winFrontFrameGeo = await roundedBoxGeo(0.42, 0.32, 0.04, 0.012, { style: 'chamfer' });
createPart(`SideWinFrontFrame_${sideName}`, winFrontFrameGeo, matGasket, {
position: [0.42, 1.12, zWindow],
parent: root
});
const winFrontGlassGeo = await roundedBoxGeo(0.38, 0.28, 0.03, 0.01);
createPart(`SideWinFrontGlass_${sideName}`, winFrontGlassGeo, matGlass, {
position: [0.42, 1.12, zWindow + zSign * 0.005],
parent: root
});
// Aft science observation port
const winAftFrameGeo = await roundedBoxGeo(0.36, 0.30, 0.04, 0.012, { style: 'chamfer' });
createPart(`SideWinAftFrame_${sideName}`, winAftFrameGeo, matGasket, {
position: [-0.14, 1.12, zWindow],
parent: root
});
const winAftGlassGeo = await roundedBoxGeo(0.32, 0.26, 0.03, 0.01);
createPart(`SideWinAftGlass_${sideName}`, winAftGlassGeo, matGlass, {
position: [-0.14, 1.12, zWindow + zSign * 0.005],
parent: root
});
// Expedition cabin door handle
const doorHandleGeo = boxGeo(0.08, 0.02, 0.02);
createPart(`DoorHandle_${sideName}`, doorHandleGeo, matMachined, {
position: [0.15, 1.05, zWindow + zSign * 0.01],
parent: root
});
// Scientific expedition insignia mission plate
const badgePlateGeo = boxGeo(0.22, 0.12, 0.015);
createPart(`ExpeditionBadge_${sideName}`, badgePlateGeo, matIvory, {
position: [0.15, 0.88, zWindow + zSign * 0.01],
parent: root
});
const chevronGeo = boxGeo(0.14, 0.03, 0.018);
createPart(`BadgeChevron_${sideName}`, chevronGeo, matSciBlue, {
position: [0.15, 0.88, zWindow + zSign * 0.012],
parent: root
});
// Amber side clearance marker lamp
const sideMarkerGeo = cylinderZGeo(0.025, 0.025, 0.02, 8);
createPart(`SideMarker_${sideName}`, sideMarkerGeo, matAmber, {
position: [0.82, 1.34, zWindow + zSign * 0.015],
parent: root
});
}
// High-intensity expedition LED light bar in visor brow
const lightBarHousingGeo = await roundedBoxGeo(0.08, 0.06, 1.04, 0.015);
createPart('LightBarHousing', lightBarHousingGeo, matChassis, { position: [1.08, 1.42, 0.0], parent: root });
const lightBarLedsGeo = await roundedBoxGeo(0.04, 0.035, 0.98, 0.01);
createPart('LightBarLeds', lightBarLedsGeo, matLedWhite, { position: [1.11, 1.42, 0.0], parent: root });
// Auxiliary amber fog lights in front bumper
for (const zSign of [-1, 1]) {
const fogLampHousingGeo = cylinderXGeo(0.07, 0.07, 0.08, 16);
createPart(`FogLampHousing_${zSign > 0 ? 'R' : 'L'}`, fogLampHousingGeo, matChassis, {
position: [1.22, 0.52, zSign * 0.42],
parent: root
});
const fogLampLensGeo = cylinderXGeo(0.055, 0.055, 0.03, 16);
createPart(`FogLampLens_${zSign > 0 ? 'R' : 'L'}`, fogLampLensGeo, matAmber, {
position: [1.26, 0.52, zSign * 0.42],
parent: root
});
// Protective steel wire cage
const fogGuardGeo = torusGeo(0.065, 0.006, 6, 16);
createPart(`FogLampGuard_${zSign > 0 ? 'R' : 'L'}`, fogGuardGeo, matMachined, {
position: [1.27, 0.52, zSign * 0.42],
rotation: [0, 90, 0],
parent: root
});
}
// ==========================================
// 5. REAR INSTRUMENT PACKAGES & EQUIPMENT BAY
// ==========================================
// Rear equipment deck diamond plate
const equipDeckGeo = await roundedBoxGeo(0.85, 0.05, 1.20, 0.02);
createPart('EquipmentDeck', equipDeckGeo, matChassis, { position: [-0.85, 0.64, 0.0], parent: root });
// Cryogenic ice-core sampling storage dewar flask
const cryoTankGeo = cylinderXGeo(0.20, 0.20, 0.65, 20);
createPart('CryoTankBody', cryoTankGeo, matMachined, { position: [-0.88, 0.85, 0.28], parent: root });
// Tank end cap domes
for (const xSign of [-1, 1]) {
const endCapGeo = sphereGeo(0.19, 16, 12);
createPart(`CryoTankCap_${xSign > 0 ? 'F' : 'R'}`, endCapGeo, matMachined, {
position: [-0.88 + xSign * 0.32, 0.85, 0.28],
scale: [0.5, 1, 1],
parent: root
});
}
// Tank saddle mounting brackets
for (const xOffset of [-0.20, 0.20]) {
const saddleGeo = await roundedBoxGeo(0.08, 0.22, 0.44, 0.015);
createPart(`CryoSaddle_${xOffset > 0 ? 'F' : 'R'}`, saddleGeo, matChassis, {
position: [-0.88 + xOffset, 0.74, 0.28],
parent: root
});
}
// Cryogenic pressure gauge & valve
const gaugeBezelGeo = cylinderGeo(0.045, 0.045, 0.03, 12);
createPart('CryoPressureGauge', gaugeBezelGeo, matGoldFoil, {
position: [-0.75, 1.07, 0.28],
rotation: [0, 0, 0],
parent: root
});
const gaugeFaceGeo = cylinderGeo(0.038, 0.038, 0.01, 12);
createPart('CryoGaugeFace', gaugeFaceGeo, matIvory, {
position: [-0.75, 1.09, 0.28],
parent: root
});
// Atmospheric Spectrometer instrument chassis
const spectrometerGeo = await roundedBoxGeo(0.60, 0.36, 0.44, 0.03, { style: 'chamfer', segments: 8 });
createPart('SpectrometerHousing', spectrometerGeo, matSciBlue, { position: [-0.88, 0.84, -0.28], parent: root });
// Cooling heatsink fins on spectrometer
for (let fIdx = 0; fIdx < 6; fIdx++) {
const finGeo = await roundedBoxGeo(0.56, 0.012, 0.42, 0.003);
createPart(`SpecCoolingFin_${fIdx}`, finGeo, matMachined, {
position: [-0.88, 0.72 + fIdx * 0.05, -0.28],
parent: root
});
}
// Spectrometer optical sampling aperture
const specOpticGeo = cylinderXGeo(0.04, 0.03, 0.08, 12);
createPart('SpectrometerOptic', specOpticGeo, matChrome, {
position: [-0.56, 0.92, -0.28],
parent: root
});
// Atmospheric air particle sampling intake tower
const airIntakeMastGeo = cylinderGeo(0.02, 0.02, 0.45, 8);
createPart('AirSamplingMast', airIntakeMastGeo, matChassis, { position: [-1.15, 0.88, 0.0], parent: root });
const airCycloneLeftGeo = coneGeo(0.045, 0.12, 10);
createPart('AirCycloneL', airCycloneLeftGeo, matMachined, {
position: [-1.15, 1.12, -0.08],
rotation: [180, 0, 0],
parent: root
});
const airCycloneRightGeo = coneGeo(0.045, 0.12, 10);
createPart('AirCycloneR', airCycloneRightGeo, matMachined, {
position: [-1.15, 1.12, 0.08],
rotation: [180, 0, 0],
parent: root
});
// Ground penetrating radar sled under rear chassis
const gprAntennaGeo = boxGeo(0.24, 0.04, 0.88);
createPart('GprAntennaSled', gprAntennaGeo, matOrange, { position: [-1.18, 0.28, 0.0], parent: root });
for (const zSign of [-1, 1]) {
const gprSkidGeo = cylinderXGeo(0.015, 0.015, 0.28, 8);
createPart(`GprSkid_${zSign > 0 ? 'R' : 'L'}`, gprSkidGeo, matMachined, {
position: [-1.18, 0.24, zSign * 0.40],
parent: root
});
}
// Ice-core sample canister carousel rack (next to spectrometer)
for (let cIdx = 0; cIdx < 3; cIdx++) {
const canisterGeo = cylinderGeo(0.04, 0.04, 0.30, 12);
createPart(`SampleCanister_${cIdx}`, canisterGeo, matMachined, {
position: [-0.60 - cIdx * 0.11, 0.82, -0.05],
parent: root
});
const canisterCapGeo = cylinderGeo(0.045, 0.045, 0.03, 12);
createPart(`SampleCanisterCap_${cIdx}`, canisterCapGeo, matOrange, {
position: [-0.60 - cIdx * 0.11, 0.98, -0.05],
parent: root
});
}
// Instrument cabling conduit bundle
const cableGeo = cylinderGeo(0.018, 0.018, 0.50, 8);
createPart('InstrumentCableLoom', cableGeo, matGasket, {
position: [-0.62, 0.72, 0.12],
rotation: [0, 25, 80],
parent: root
});
// ==========================================
// 6. ROOF EXPEDITION GEAR & COMMUNICATIONS
// ==========================================
// High-gain satellite communications dish
const satGimbalGeo = cylinderGeo(0.05, 0.05, 0.08, 12);
createPart('SatGimbalBase', satGimbalGeo, matChassis, { position: [-0.42, 1.56, -0.32], parent: root });
// Parabolic dish
const dishBowlGeo = cylinderGeo(0.24, 0.06, 0.10, 20);
createPart('SatDishBowl', dishBowlGeo, matIvory, {
position: [-0.42, 1.68, -0.32],
rotation: [25, 0, -20],
parent: root
});
// Sub-reflector feed horn
const dishFeedGeo = cylinderGeo(0.02, 0.03, 0.12, 8);
createPart('SatDishFeed', dishFeedGeo, matMachined, {
position: [-0.40, 1.74, -0.30],
rotation: [25, 0, -20],
parent: root
});
// Ultrasonic weather station / anemometer
const weatherPostGeo = cylinderGeo(0.018, 0.018, 0.28, 8);
createPart('WeatherPost', weatherPostGeo, matChassis, { position: [-0.42, 1.66, 0.32], parent: root });
// Radiation shield louvers (conical disks)
for (let lIdx = 0; lIdx < 4; lIdx++) {
const louverGeo = cylinderGeo(0.05, 0.06, 0.015, 12);
createPart(`WeatherLouver_${lIdx}`, louverGeo, matIvory, {
position: [-0.42, 1.62 + lIdx * 0.025, 0.32],
parent: root
});
}
// Anemometer cross-arms and cups
const cupArmGeo = cylinderZGeo(0.006, 0.006, 0.12, 6);
createPart('AnemometerArm', cupArmGeo, matMachined, { position: [-0.42, 1.78, 0.32], parent: root });
for (const cupSign of [-1, 1]) {
const cupGeo = sphereGeo(0.018, 8, 8);
createPart(`AnemometerCup_${cupSign > 0 ? 'R' : 'L'}`, cupGeo, matOrange, {
position: [-0.42, 1.78, 0.32 + cupSign * 0.06],
parent: root
});
}
// Whip antennas
for (const zSign of [-1, 1]) {
const whipGeo = cylinderGeo(0.004, 0.006, 0.65, 6);
createPart(`WhipAntenna_${zSign > 0 ? 'R' : 'L'}`, whipGeo, matChrome, {
position: [-0.55, 1.82, zSign * 0.48],
rotation: [-15, 0, zSign * 8],
parent: root
});
}
// ==========================================
// 7. ARTICULATED MAST & SENSOR HEAD (ANIMATED)
// ==========================================
// Fixed mounting base collar on the forward roof
const mastCollarGeo = cylinderGeo(0.09, 0.11, 0.06, 16);
createPart('MastCollar', mastCollarGeo, matChassis, { position: [0.50, 1.55, 0.28], parent: root });
// Joint 1: Azimuth rotation base (yaw)
const mastBase = createPivot('MastBase', [0.50, 1.58, 0.28], root);
// Azimuth turret platform
const turretPlatformGeo = cylinderGeo(0.08, 0.08, 0.05, 16);
createPart('MastTurretPlatform', turretPlatformGeo, matMachined, { position: [0, 0.025, 0], parent: mastBase });
// Lower boom twin carbon spars
for (const zSign of [-1, 1]) {
const sparGeo = cylinderGeo(0.015, 0.018, 0.42, 8);
createPart(`MastLowerSpar_${zSign > 0 ? 'R' : 'L'}`, sparGeo, matChassis, {
position: [0, 0.24, zSign * 0.045],
parent: mastBase
});
}
// Cross bracing
const mastBraceGeo = cylinderZGeo(0.01, 0.01, 0.10, 6);
createPart('MastLowerBrace', mastBraceGeo, matMachined, { position: [0, 0.26, 0], parent: mastBase });
// Linear elevation hydraulic actuator cylinder
const actuatorBodyGeo = cylinderGeo(0.016, 0.016, 0.20, 8);
createPart('MastActuatorBody', actuatorBodyGeo, matChassis, {
position: [-0.03, 0.22, 0],
rotation: [-18, 0, 0],
parent: mastBase
});
const actuatorRodGeo = cylinderGeo(0.009, 0.009, 0.14, 8);
createPart('MastActuatorRod', actuatorRodGeo, matChrome, {
position: [-0.03, 0.32, 0],
rotation: [-18, 0, 0],
parent: mastBase
});
// Joint 2: Articulated elbow / pan-tilt head pivot
const mastElbow = createPivot('MastElbow', [0, 0.46, 0], mastBase);
// Articulated sensor head pod
const sensorPodGeo = await roundedBoxGeo(0.18, 0.14, 0.28, 0.025, { style: 'chamfer', segments: 8 });
createPart('SensorHeadPod', sensorPodGeo, matIvory, { position: [0.04, 0.06, 0], parent: mastElbow });
// Stereoscopic scientific camera eyes
for (const zSign of [-1, 1]) {
const eyeBarrelGeo = cylinderXGeo(0.04, 0.04, 0.07, 16);
createPart(`StereoCamBarrel_${zSign > 0 ? 'R' : 'L'}`, eyeBarrelGeo, matMachined, {
position: [0.15, 0.06, zSign * 0.09],
parent: mastElbow
});
const eyeLensGeo = cylinderXGeo(0.032, 0.032, 0.015, 16);
createPart(`StereoCamLens_${zSign > 0 ? 'R' : 'L'}`, eyeLensGeo, matGlass, {
position: [0.185, 0.06, zSign * 0.09],
parent: mastElbow
});
}
// Central pulsed LIDAR rangefinder aperture
const lidarRingGeo = cylinderXGeo(0.03, 0.03, 0.05, 14);
createPart('MastLidarRing', lidarRingGeo, matGoldFoil, {
position: [0.14, 0.09, 0.0],
parent: mastElbow
});
// High-power masthead spotlight (bright white)
const spotHousingGeo = cylinderXGeo(0.038, 0.045, 0.06, 14);
createPart('MastSpotHousing', spotHousingGeo, matChassis, {
position: [0.12, 0.01, 0.0],
parent: mastElbow
});
const spotLensGeo = cylinderXGeo(0.035, 0.035, 0.015, 14);
createPart('MastSpotLens', spotLensGeo, matLedWhite, {
position: [0.155, 0.01, 0.0],
parent: mastElbow
});
// ==========================================
// 8. HINGED SOLAR ARRAY (ANIMATED)
// ==========================================
const panelLength = 0.82;
const panelWidth = 0.44;
const panelThick = 0.025;
// Left solar panel wing
const solarLeft = createPivot('SolarLeft', [-0.08, 1.52, -0.65], root);
// Left panel frame
const panelFrameLGeo = await roundedBoxGeo(panelLength, panelThick, panelWidth, 0.008);
createPart('SolarFrame_L', panelFrameLGeo, matMachined, {
position: [0, 0, -panelWidth * 0.5],
parent: solarLeft
});
// Top PV cells
const panelPvsLGeo = boxGeo(panelLength - 0.04, 0.006, panelWidth - 0.04);
createPart('SolarCells_L', panelPvsLGeo, matSolar, {
position: [0, panelThick * 0.5 + 0.002, -panelWidth * 0.5],
parent: solarLeft
});
// Silver busbar grid lines across PV cells
for (const bx of [-0.22, 0.0, 0.22]) {
const busbarGeo = boxGeo(0.008, 0.007, panelWidth - 0.04);
createPart(`SolarBusbar_L_${bx.toFixed(2)}`, busbarGeo, matChrome, {
position: [bx, panelThick * 0.5 + 0.003, -panelWidth * 0.5],
parent: solarLeft
});
}
// Bottom gold thermal insulation
const panelGoldLGeo = boxGeo(panelLength - 0.02, 0.004, panelWidth - 0.02);
createPart('SolarGold_L', panelGoldLGeo, matGoldFoil, {
position: [0, -panelThick * 0.5 - 0.001, -panelWidth * 0.5],
parent: solarLeft
});
// Hinge brackets
for (const hx of [-0.25, 0.25]) {
const hingeGeo = cylinderXGeo(0.02, 0.02, 0.06, 10);
createPart(`SolarHinge_L_${hx > 0 ? 'F' : 'R'}`, hingeGeo, matChassis, {
position: [hx, 0, 0],
parent: solarLeft
});
}
// Right solar panel wing
const solarRight = createPivot('SolarRight', [-0.08, 1.52, 0.65], root);
// Right panel frame
const panelFrameRGeo = await roundedBoxGeo(panelLength, panelThick, panelWidth, 0.008);
createPart('SolarFrame_R', panelFrameRGeo, matMachined, {
position: [0, 0, panelWidth * 0.5],
parent: solarRight
});
// Top PV cells
const panelPvsRGeo = boxGeo(panelLength - 0.04, 0.006, panelWidth - 0.04);
createPart('SolarCells_R', panelPvsRGeo, matSolar, {
position: [0, panelThick * 0.5 + 0.002, panelWidth * 0.5],
parent: solarRight
});
// Silver busbar grid lines across PV cells
for (const bx of [-0.22, 0.0, 0.22]) {
const busbarGeo = boxGeo(0.008, 0.007, panelWidth - 0.04);
createPart(`SolarBusbar_R_${bx.toFixed(2)}`, busbarGeo, matChrome, {
position: [bx, panelThick * 0.5 + 0.003, panelWidth * 0.5],
parent: solarRight
});
}
// Bottom gold thermal insulation
const panelGoldRGeo = boxGeo(panelLength - 0.02, 0.004, panelWidth - 0.02);
createPart('SolarGold_R', panelGoldRGeo, matGoldFoil, {
position: [0, -panelThick * 0.5 - 0.001, panelWidth * 0.5],
parent: solarRight
});
// Hinge brackets
for (const hx of [-0.25, 0.25]) {
const hingeGeo = cylinderXGeo(0.02, 0.02, 0.06, 10);
createPart(`SolarHinge_R_${hx > 0 ? 'F' : 'R'}`, hingeGeo, matChassis, {
position: [hx, 0, 0],
parent: solarRight
});
}
return root;
}
function animate(root) {
return [
createClip('ExpeditionScan', 4.0, [
// Mast Azimuth pan (Joint_MastBase)
rotationTrack('Joint_MastBase', [
{ time: 0.0, rotation: [0, 0, 0] },
{ time: 1.0, rotation: [0, 35, 0] },
{ time: 2.0, rotation: [0, -30, 0] },
{ time: 3.0, rotation: [0, 15, 0] },
{ time: 4.0, rotation: [0, 0, 0] },
]),
// Mast Elevation tilt (Joint_MastElbow)
rotationTrack('Joint_MastElbow', [
{ time: 0.0, rotation: [0, 0, 0] },
{ time: 1.0, rotation: [12, 0, 0] },
{ time: 2.0, rotation: [-8, 0, 0] },
{ time: 3.0, rotation: [16, 0, 0] },
{ time: 4.0, rotation: [0, 0, 0] },
]),
// Left Solar Wing tilt deployment
rotationTrack('Joint_SolarLeft', [
{ time: 0.0, rotation: [-38, 0, 0] },
{ time: 1.2, rotation: [18, 0, 0] },
{ time: 2.8, rotation: [18, 0, 0] },
{ time: 4.0, rotation: [-38, 0, 0] },
]),
// Right Solar Wing tilt deployment
rotationTrack('Joint_SolarRight', [
{ time: 0.0, rotation: [38, 0, 0] },
{ time: 1.2, rotation: [-18, 0, 0] },
{ time: 2.8, rotation: [-18, 0, 0] },
{ time: 4.0, rotation: [38, 0, 0] },
]),
])
];
}Scroll code horizontally
Brief and retained revisions
Brief summary
Create a compact orange and ivory polar research rover with shaped tracks, a rounded cab, scientific instruments, an articulated mast and hinged solar panels.
Initial draft: execution rejected
The original imported draft failed during evaluation. It is retained to show the repair process.
Download initial draft: execution rejected sourceSHA-256: 80be5bc99e05c37c5b11a0fbc60d9be83991dc1f44d517745238ab976a89907b
Working geometry repair
Reduced oversized rounding radii and disabled the track-loop bevel, producing the first rendered rover.
Download working geometry repair sourceSHA-256: 452b4cb2d887a0a249637d2a49aea5bdeb2aab023a9ffe6928d35ee8a809fc4a
Equipment revision: execution rejected
Added track grousers, roof rails, a radiator grille and revised solar motion. This source still failed evaluation.
Download equipment revision: execution rejected sourceSHA-256: b93a4f3830cb24b03f44a1436d23173a06af6aae893ab10dc83f5ddce465a048
Equipment repair
Repaired the failed equipment revision with an exact source edit, then reviewed the whole rover and mast detail.
Download equipment repair sourceSHA-256: 1b95d7f2a6ad8edfcc965624fccbfd89d67fadd5273041b4bd107dcc5874721b
Current gallery revision · Shown here
Added sample canisters, instrument cabling, a mast actuator, door handles and solar-panel grid lines.
Download current gallery revision sourceSHA-256: aea09b2491cc06ac710648d0de30bb365fa1b2c0fff10712cb70db07e8216515