11# moka-pot
22
3- ![ A polished eight-sided aluminium moka pot: a tapered boiler under a collector that flares back out , a faceted lid with a black bakelite knob, a pinched spout, and a curved black bakelite handle on a riveted bracket, a brass safety valve on the boiler] ( preview.webp )
3+ ![ A polished eight-sided aluminium moka pot pinched to an hourglass waist with a proud grip band at the joint , a V-beak spout, a faceted lid with a black bakelite knob and a hinge knuckle, a black bakelite D handle on a fin, and a brass safety valve on the boiler] ( preview.webp )
44
5- A three-cup stovetop moka pot: a tapered eight-flat boiler, a collector
6- that flares back out from the waist, a faceted lid under a bakelite
7- knob, a pinched pour spout, a bakelite handle on a riveted bracket, and a
8- brass safety valve. ** A showcase piece, not an example** — it witnesses
9- no API contract. It asserts that generated geometry meets declared asset
10- budgets, recomputed from the finished mesh.
5+ A three-cup Moka Express-pattern stovetop pot: an eight-flat boiler that
6+ flares out to its foot, a collector that flares out to its rim, both
7+ pinching to the screw joint where the collector's threaded skirt stands
8+ proud as a grip band, a V beak pinched from the rim, a faceted lid on a
9+ hinge knuckle under a bakelite knob, a bakelite D handle rooted in a
10+ riveted fin, and a brass safety valve. ** A showcase piece, not an
11+ example** — it witnesses no API contract. It asserts that generated
12+ geometry meets declared asset budgets, recomputed from the finished mesh.
1113
1214## What it composes
1315
1416| Shipped content | Used for |
1517| --- | --- |
16- | ` skills/mesh-editing-and-bmesh ` | eight-flat lathes, a swept handle, wedges and plates, all in one ` bmesh ` ; bevel pinned to a material slot |
18+ | ` skills/mesh-editing-and-bmesh ` | eight-flat lathes, a swept handle, a prism beak and plates, all in one ` bmesh ` ; bevel pinned to a material slot |
1719| ` skills/procedural-materials-and-shaders ` | brushed aluminium, glossy bakelite, brass |
1820| ` skills/bake-high-to-low ` | Cycles tangent-space normal bake, high onto low |
1921| ` skills/engine-export-presets ` | Unity glTF (` export_yup=True ` ) |
@@ -52,7 +54,7 @@ off the generated vertices:
5254` --odd-facet ` pushes one flat of the collector's mid ring 2.5 mm out and
5355exits 19 on the spread (1.97 mm measured, with the AABB unchanged).
5456` --lean-pot ` shears the pot 4 mm over its height and exits 19 on the
55- plumb line (3.41 mm measured, spread untouched).
57+ plumb line (3.28 mm measured, spread untouched).
5658
5759## Budgets
5860
@@ -63,60 +65,74 @@ both).
6365
6466| Budget | Band | Measured |
6567| --- | --- | --- |
66- | Base triangles | 950–1250 | 1092 |
68+ | Base triangles | 1200–1400 | 1300 |
6769| LOD1 ratio | 0.32–0.62 | 0.5000 |
68- | LOD2 ratio | 0.10–0.35 | 0.2179 |
70+ | LOD2 ratio | 0.10–0.35 | 0.2185 |
6971| Material slots | exactly 3, distinct | 3 |
70- | Aluminium / bakelite / brass faces | ≥ 160 / 210 / 150 | 190 / 244 / 180 |
71- | UV bounds | inside 0..1 | (0.0023 , 0.0023 )–(0.9977 , 0.9977 ) |
72+ | Aluminium / bakelite / brass faces | ≥ 160 / 280 / 100 | 197 / 388 / 124 |
73+ | UV bounds | inside 0..1 | (0.0025 , 0.0025 )–(0.9975 , 0.9975 ) |
7274| UV AABB overlap | ≤ 1e-5 | 0.000000 |
73- | Outer AABB | 0.1665 × 0.0928 × 0.1522 m ± 0.006 | 0.1665 × 0.0928 × 0.1522 |
74- | Collider triangles | ≤ 200 | 170 (two hulls) |
75+ | Outer AABB | 0.1327 × 0.0832 × 0.1600 m ± 0.006 | 0.1327 × 0.0832 × 0.1600 |
76+ | Collider triangles | ≤ 200 | 154 (two hulls) |
7577| Normal bake | ` {'FINISHED'} ` with image data | ` {'FINISHED'} ` , ` has_data=True ` |
76- | glTF export | file written, non-empty | ~ 72 kB |
78+ | glTF export | file written, non-empty | ~ 78 kB |
7779| Hygiene | all zero | loose 0/0, non-manifold 0, zero-area 0, doubles 0, n-gons 0, coplanar cross-shell pairs 0 |
7880| Grounded AABB | \| zmin\| ≤ 1e-4, boiler zmin ≤ 1e-4 | 0.00000 |
79- | Shells | exactly 11 , none unclassified | 11 |
81+ | Shells | exactly 10 , none unclassified | 10 |
8082| Collector seat on the boiler | 2.5–4.5 mm | 3.50 mm |
81- | Handle bite into the bracket | 1.0–3.0 mm, per root vertex | 1.71–1.80 mm |
82- | Knob bite into the lid | 1.0–3.0 mm | 2.00 mm |
83- | Lid seat on the collector | 1.0–3.0 mm | 1.50 mm |
84- | Spout bite and reach | base 0.9–3.0 mm into the wall; tip 10–15 mm beyond it | 1.50 mm; 12.50 mm |
85- | Bracket bite | 0.9–3.0 mm into the wall | 1.50 mm |
86- | Hinge bite | 1.5–5.0 mm into the collector | 3.10 mm |
87- | Fasteners (valve, two rivets ) | bite 0.8–2.5 mm, proud ≥ 1.2 mm | valve 1.60 / 4.60; rivets 1.20 / 1.80 |
88- | Real size: foot, collector, height | 92.8 / 91 .2 / 152.2 mm ± 3 | 92.8 / 91 .2 / 152.2 |
83+ | Handle bite into the fin | 1.0–3.0 mm, each of the two roots | 2.50 mm, both roots |
84+ | Knob bite into the lid | 1.0–3.0 mm | 1.80 mm |
85+ | Lid seat on the collector | 1.0–3.0 mm | 1.80 mm |
86+ | Spout bite and reach | base 0.9–3.0 mm into the wall; tip 10–15 mm beyond it | 1.50 mm; 12.41 mm |
87+ | Fin bite | 0.9–3.0 mm into the wall | 1.50 mm |
88+ | Hinge bite | 1.5–5.0 mm into the collector | 2.63 mm |
89+ | Fasteners (valve, one rivet ) | bite 0.8–2.5 mm, proud ≥ 1.2 mm | valve 1.60 / 4.60; rivet 1.20 / 1.80 |
90+ | Real size: foot, collector, height | 83.2 / 80 .2 / 160.0 mm ± 3 | 83.2 / 80 .2 / 160.0 |
8991| Plumb | ≤ 0.8 mm | 0.000 mm |
9092| Eight-fold spread | ≤ 0.2 mm | 0.000 mm |
9193
92- Real-world size: 92.8 mm across the foot flats, 91.2 mm across the
93- collector, 152.2 mm to the top of the knob, about 166 mm from the spout
94- tip to the handle end. It is a three-cup Bialetti-pattern pot.
94+ Real-world size: a three-cup Moka Express is listed at 16.0 cm tall and
95+ 9.0 cm across the base point to point, which is 83.2 mm across its
96+ flats. The collector rim is read off product photos at 0.96 of the foot,
97+ 80.2 mm across its flats. The waist at the joint is 0.76 of the foot.
98+ Spout tip to handle is about 133 mm.
9599
96100## Construction
97101
98102- ** Body.** Boiler, collector and lid are eight-flat lathes from
99103 ` (apothem, z) ` profiles: the distance from the axis to the middle of a
100104 flat, which is what a ruler across the pot reads. Vertices every 45°
101- offset by 22.5° put a flat square on each axis, so the handle bracket
102- and spout each sit on a flat. Every edge over 30° is chamfered 0.7 mm,
103- which includes the 45° ridge between flats, so the ridges catch light.
105+ offset by 22.5° put a flat square on each axis, so the fin and the
106+ spout each sit on a flat. The boiler flares from a 63.6 mm neck to an
107+ 83.2 mm foot; the collector from a 65.2 mm waist to an 80.2 mm rim. Its
108+ bottom 9 mm is a vertical skirt 67.6 mm across, 2.0 mm proud of the
109+ boiler's neck and 1.2 mm proud of its own waist: the grip band. Every edge over 30°
110+ is chamfered 0.7 mm, which includes the 45° ridge between flats, so the
111+ ridges catch light.
104112- ** Joints are tenoned, not stood.** The collector's floor sits 3.5 mm
105- below the boiler's top plane (the boiler's neck runs up inside it); the
106- lid sits 1.5 mm below the collector's top plane; the knob is driven
107- 2 mm into the lid. Nothing lands on a shared plane.
108- - ** Spout.** A wedge on the −x flat, 28 mm wide at the wall and 10 mm at
109- the tip, its base vertices computed per corner from the collector's own
110- wall function and driven 1.5 mm in.
111- - ** Bracket.** A plate on the +x flat built the same way, so it follows
112- the wall's 5.6° rake, with two brass rivets above and below the handle.
113- The handle's root is driven 2 mm into it.
114- - ** Handle.** A swept bakelite blade: ten rings of a twelve-point rounded
115- rectangle along a cubic Bézier in the XZ plane, thicker mid-span than
116- at either end, smooth-shaded with end caps hard and chamfered 1.2 mm.
117- - ** Fasteners.** Rivets and the valve are small turned heads aimed down
118- the host's normal (the bracket's rake, the boiler's taper). Their
119- seat is read back as height above the host's own nearest face.
113+ below the boiler's top plane (the boiler's neck runs up inside the
114+ skirt); the lid sits 1.8 mm below the collector's top plane; the knob
115+ is driven 1.8 mm into the lid. Nothing lands on a shared plane.
116+ - ** Spout.** A triangular prism on the −x flat: its base spans 30 mm of
117+ the flat and is driven 1.5 mm into the wall per vertex from the
118+ collector's own wall function; its apex is one vertical edge 12.4 mm
119+ out. The underside sweeps 21 mm down the wall to the base, and the lip
120+ rises 1.2 mm from the rim to the tip, so it reads as a V pinched out of
121+ the rim rather than a block stuck to it.
122+ - ** Fin.** A 22 mm plate on the +x flat built the same way, so it
123+ follows the collector's 7° flare from the waist almost to the rim. One
124+ brass rivet sits in the opening of the D.
125+ - ** Handle.** A bakelite D in the XZ plane: twenty-two rings of a
126+ twelve-point rounded rectangle along a superellipse half (exponent
127+ 0.55, 34 mm out from the fin, 41 mm between roots), slim at the roots
128+ and fuller through the grip. Both roots leave the fin horizontally and
129+ each root cap is cut parallel to the fin's raked face, 2.5 mm inside
130+ it.
131+ - ** Hinge.** An aluminium knuckle on top of the fin, through the
132+ collector's rim and the lid's edge.
133+ - ** Fasteners.** The rivet and the valve are small turned heads aimed
134+ down the host's normal (the fin's rake, the boiler's taper). Their seat
135+ is read back as height above the host's own nearest face.
120136- ** Shading.** Aluminium is flat-shaded, because the faceting is the
121137 object. Bakelite and brass are turned or swept and smooth-shaded with
122138 every edge over 35° hard.
@@ -128,14 +144,26 @@ tip to the handle end. It is a three-cup Bialetti-pattern pot.
128144 the failure was a sunk spout, not a floating one. It now lifts the base
129145 outward by 4 mm and leaves the tip where it was, so only the bite fails
130146 and the reach stays in its band.
131- - ** Handle bite measured the chamfer, not the root.** The root's rays
132- were cast from every vertex within 1.5 mm of the root plane, which
133- includes the chamfer ring 1.2 mm out; that ring is seated only 0.8 mm
134- and tripped the band on a correct model. The root cap ring alone is
135- now measured.
136- - ** Collider hit its ceiling by 6 triangles** when the spout was widened
137- for the silhouette; the hull's planar-dissolve angle went from 6° to 9°
138- rather than the ceiling being raised (206 → 170 triangles).
147+ - ** The first pass was not a Moka Express.** It was 152 mm tall with a
148+ 100 mm foot, its waist pinched to only 0.81 of the foot, the handle a
149+ horn curving up off a bracket, and the spout a blunt block. Every
150+ budget passed. The quality pass took the size from retailer listings,
151+ pinched the waist to 0.76, added the grip band, and replaced the horn
152+ with a two-root D and the block with a V beak.
153+ - ** Two rivets on one fin are a coplanar pair.** The D's opening leaves
154+ room for rivets only 8.5 mm apart. On one raked plane with centres
155+ closer than the 20 mm window, their caps counted as 200 cross-shell
156+ coplanar pairs. The fin now carries one rivet, as the real one carries
157+ one screw.
158+ - ** The fin rakes further than it is thick.** Splitting the fin's
159+ vertices into inner and outer by world x put the outer face's low
160+ corners on the inner side, and its bite read −4.5 mm on a correct
161+ model. The split is now by signed distance off the collector's own
162+ surface.
163+ - ** A D handle has two roots.** Measuring the vertices nearest the
164+ pot in x saw only the lower root, because the wall flares out with
165+ height. Each half of the D is now read on its own, from the handle
166+ vertices inside the fin, and a root with none inside is a float.
139167
140168## Conventions walked
141169
@@ -147,14 +175,14 @@ Every convention in `showcase/README.md`, and whether it applies here.
147175| Falsifier fails the budget it targets | yes | table below |
148176| Hygiene incl. cross-shell coplanar | yes | exit 15; ` --flush-joint ` is the coplanar falsifier |
149177| Named supports | no | one support (the boiler's foot) |
150- | Joint-fit budgets | yes | shell count, collector seat, handle bite (exit 17) |
151- | Fasteners aimed down the host normal | yes | rivets and valve (` --float-valve ` , exit 18) |
152- | Seat conformance | yes | knob, lid, spout, bracket , hinge, fasteners (exit 18) |
178+ | Joint-fit budgets | yes | shell count, collector seat, both handle roots (exit 17) |
179+ | Fasteners aimed down the host normal | yes | rivet and valve (` --float-valve ` , exit 18) |
180+ | Seat conformance | yes | knob, lid, spout, fin , hinge, fasteners (exit 18) |
153181| A member is tenoned into its seat, never stood on it | yes | collector, lid, knob, handle |
154182| Plumb and real-world size | yes | exit 19; plumb, three sizes in metres |
155- | Mirrored assemblies | no | the two rivets are not a paired budget |
183+ | Mirrored assemblies | no | nothing is paired |
156184| Even shaping terms | n/a | no shaping function; profiles are piecewise linear |
157- | Edge treatment: no right angles | yes | 0.7 mm chamfer on every aluminium edge over 30°; the asset-quality right-angle fraction is 0.059 |
185+ | Edge treatment: no right angles | yes | 0.7 mm chamfer on every aluminium edge over 30°; the asset-quality right-angle fraction is 0.044 |
158186| One substance, one slot | yes | aluminium, bakelite, brass |
159187| Shading is part of the model | yes | see Construction |
160188| Chamfer n-gon caps, then triangulate | yes | every cap |
@@ -173,13 +201,13 @@ were not available locally and are unverified.
173201| --- | --- | --- | --- |
174202| ` --skip-decimate ` | LOD1 ratio | drops the DECIMATE modifiers, LOD1 ratio goes to 1.0000 | 9 |
175203| ` --stray-vert ` | mesh hygiene | adds one loose vertex on the axis | 15 |
176- | ` --flush-joint ` | coplanar cross-shell pairs | drops the boiler's top plane onto the collector's floor plane; 9 pairs | 15 |
204+ | ` --flush-joint ` | coplanar cross-shell pairs | drops the boiler's top plane onto the collector's floor plane; 6 pairs | 15 |
177205| ` --lift-z ` | grounded zmin | lifts the whole mesh 20 mm | 16 |
178- | ` --short-handle ` | handle bite | starts the handle root 3 mm outside the bracket; −3.1 mm | 17 |
179- | ` --float-knob ` | knob bite | lifts the knob 4 mm; −2.0 mm | 18 |
206+ | ` --short-handle ` | handle bite | stops both handle roots 3 mm outside the fin; no root vertex inside it | 17 |
207+ | ` --float-knob ` | knob bite | lifts the knob 4 mm; −2.2 mm | 18 |
180208| ` --float-spout ` | spout bite | lifts the spout's base 4 mm off the wall, tip fixed; −2.5 mm | 18 |
181209| ` --float-valve ` | fastener seat | lifts the valve 3 mm off its flat; −1.4 mm | 18 |
182- | ` --lean-pot ` | plumb | shears the pot 4 mm over its height; 3.41 mm drift | 19 |
210+ | ` --lean-pot ` | plumb | shears the pot 4 mm over its height; 3.28 mm drift | 19 |
183211| ` --odd-facet ` | eight-fold spread | pushes one mid-ring flat 2.5 mm out; 1.97 mm spread | 19 |
184212
185213## Exit codes
@@ -209,7 +237,7 @@ collider ceiling), both on the render path only.
209237| 15 | Mesh hygiene (` --stray-vert ` , ` --flush-joint ` ) |
210238| 16 | Grounded zmin (` --lift-z ` ) |
211239| 17 | Shell count, collector seat, or handle bite (` --short-handle ` ) |
212- | 18 | Knob, lid, spout, bracket , hinge or fastener seat (` --float-knob ` , ` --float-spout ` , ` --float-valve ` ) |
240+ | 18 | Knob, lid, spout, fin , hinge or fastener seat (` --float-knob ` , ` --float-spout ` , ` --float-valve ` ) |
213241| 19 | Real-world size, plumb, or eight-fold spread (` --lean-pot ` , ` --odd-facet ` ) |
214242| 21 | Asset-quality gate (` examples/gallery_asset_quality.py ` , render path only) |
215243
@@ -237,9 +265,9 @@ Measured on 5.2.1 only. 4.5 and 5.1 are unverified locally.
237265
238266| Value | 5.2.1 |
239267| --- | --- |
240- | Base triangles | 1092 |
241- | LOD1 / LOD2 tris | 546 / 238 |
242- | Face counts (aluminium / bakelite / brass) | 190 / 244 / 180 |
243- | Outer AABB | 0.1665 × 0.0928 × 0.1522 |
244- | Collider tris | 170 |
245- | glTF bytes | 72148 |
268+ | Base triangles | 1300 |
269+ | LOD1 / LOD2 tris | 650 / 284 |
270+ | Face counts (aluminium / bakelite / brass) | 197 / 388 / 124 |
271+ | Outer AABB | 0.1327 × 0.0832 × 0.1600 |
272+ | Collider tris | 154 |
273+ | glTF bytes | 77860 |
0 commit comments