Beer–Lambert through the wall, unrolled: colatitude down, longitude across. This is the picture the ball makes, and it is not the heightfield — the map is exponential, so the thin end spreads and the thick end crushes.
Beer–Lambert through the wall, unrolled: colatitude down, longitude across. This is the picture the ball makes, and it is not the heightfield — the map is exponential, so the thin end spreads and the thick end crushes.
Ball: 0.12 mm layers, 8 wall loops, 0.40 mm line width, 100 % infill, supports OFF, 5 mm outer brim, elephant-foot compensation 0.20 mm — the first layer is the sealing rim and the mouth of the bayonet bore. Print as exported, rim on the bed.
Cap: a different recipe — 0.16 mm layers, 4 wall loops, 25 % gyroid, minimum layer time 10 s, fan 100 %, 5 mm brim, supports off, spigot down.
To close it: push the cap in, then turn it counter-clockwise seen from above through about 52° to a hard stop. It is a one-way run; the wrong way jams after 6°.
A JavaScript port of xmas3.py's spherical path. Verified field by field against the Python on identical decoded pixels: 3.4e-13 mm at small and 1.6e-5 mm at the larger two, with every vertex and face of the mesh bit-identical. The exported small ball matches the one that was actually printed to 0.001 % by volume, and the real cap seats, twists and locks in it. For scale, the reference disagrees with itself by 8e-4 mm between runs, because the sort inside its histogram step is not stable.
The booleans run on manifold-3d in WebAssembly — the same library the Python uses, so the CSG is the same algorithm rather than two that agree by luck.
Everything runs in this page. No upload, no server, no network.
The sphere is the open question at the end of From Panel to Cylinder — no rectangle maps to it without distortion, and the overhang argument that governs the column gets worse near the equator. This page is that question answered and printed. painting2lamp is the same idea on a cylinder, and the build guide is where the heightfield comes from.