Skip to content

Commit d2d442d

Browse files
TMHSDigitalclaude
andcommitted
fix(examples): redesign degenerate-bevel-weld hardware and tone down the collapse seam
The collapse overlay was a thick neon-red tube with large orange spheres and read as a garish band. The seam is now a thin (0.018 -> 0.009 radius) red-orange ink line at emission 0.35, and the zero-area markers are small amber pins (0.038 -> 0.019). Both are still drawn from live mesh data (every face thinner than 1e-6, a pin per face under AREA_EPS). The cases gain steel draw latches (the orange anodized levers are now steel), swept wire bails over the hasps, and four L-shaped rubber corner guards on the front land. Render path only; checks unchanged. Evidence (live runs, local): - E:/Blender-Developer-Tools/.scratch/blender-5.2.1-windows-x64/blender.exe (Blender 5.2.1 LTS): check-only exit 0 ("collapse 12f/16v ships 32 degenerate tris in the GLB"); render framing fill x=0.784 y=0.689, margins l=0.081 r=0.134 b=0.111 t=0.200; aq_ok (materials n=6, edge90 0.015); render_defects thin_faces=16 zero_area_faces=12. - E:/Blender-Developer-Tools/.scratch/blender-4.5.11-windows-x64/blender.exe (Blender 4.5.11 LTS): check exit 0; --output render passes the same gates. - Contact sheet: candidate luma 0.190 / stage 0.207 / warmth -0.339 / sat 0.242 against armature-bend 0.243/0.192/-0.144/0.237, damped-track-aim 0.237/0.218/+0.105/0.178, and bmesh-gear 0.236/0.177/+0.303/0.250. Warmth is negative because the cobalt cases dominate the lower half, as in the previous hero. - Asset sheet (docs/gallery/asset-sheets/degenerate-bevel-weld.webp): the case, with latches, bails, guards, valve and plate, is not the least-designed object beside the hydrant, drone, well, wheelbarrow and shelf. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 3b63a5b commit d2d442d

8 files changed

Lines changed: 43 additions & 15 deletions

File tree

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1121,7 +1121,7 @@ turns cream.
11211121
</tr>
11221122
<tr>
11231123
<td width="46%" valign="middle">
1124-
<a href="examples/degenerate-bevel-weld/"><img src="examples/degenerate-bevel-weld/preview.webp" alt="Degenerate bevel weld: two blue hard-shell equipment cases — left with a flat end panel and clean chamfer bands, right with its rim rolled into a knife ridge traced by a glowing red seam and orange beads at the zero-area faces, proving the half-dimension bevel collapse ships degenerate triangles" /></a>
1124+
<a href="examples/degenerate-bevel-weld/"><img src="examples/degenerate-bevel-weld/preview.webp" alt="Degenerate bevel weld: two blue hard-shell equipment cases — left with a flat end panel and clean chamfer bands, right with its rim rolled into a knife ridge traced by a thin red-orange seam line and small amber pins at the zero-area faces, proving the half-dimension bevel collapse ships degenerate triangles" /></a>
11251125
</td>
11261126
<td valign="middle">
11271127

2.18 KB
Loading
-1.45 KB
Loading
9.58 KB
Loading

‎examples/degenerate-bevel-weld/README.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@ future Blender changes triangulation — re-measure and update deliberately).
4141

4242
**Render as proof:** two rugged hard-shell equipment cases whose shells
4343
*are* the check's two meshes — `beveled_box(DIMS, 0.10)` and
44-
`beveled_box(DIMS, 0.20)` — with every fitting (handle, latches, molded
44+
`beveled_box(DIMS, 0.20)` — with every fitting (handle, steel draw latches with wire bails, rubber corner guards, molded
4545
frame, purge valve, ID plate, feet) kept inside the flat front land that
4646
survives both offsets, so the bevel is the only difference. The cases turn
4747
their end panels to the camera: the left keeps a flat end framed by clean
4848
chamfer bands; on the right the end and top lands are gone and the band
49-
rolls into a knife ridge at mid-depth. That collapsed seam is traced in hot
50-
red from live mesh data (every edge of every face thinner than 1e-6), with
51-
an orange bead on each of the 12 zero-area faces the check counts — change
49+
rolls into a knife ridge at mid-depth. That collapsed seam is traced as a thin
50+
red-orange ink line (low emission, no neon halo) from live mesh data (every edge of every face thinner than 1e-6), with
51+
a small amber pin on each of the 12 zero-area faces the check counts — change
5252
the offset and the overlay moves or disappears. The clean case is the
5353
designed asset and passes the asset-quality floors (exit 11).
5454

‎examples/degenerate-bevel-weld/degenerate_bevel_weld.py‎

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,32 @@ def grip(bm):
344344
parts.append(_part(sc, f"{prefix}.LatchLever{'LR'[sx > 0]}",
345345
_block(f"{prefix}.LatchLever", (0.11, 0.035, 0.13), 0.014),
346346
mats["accent"], shell, (sx * 0.40, fy - 0.045, 0.15)))
347+
# wire draw-bail: a steel loop from the lever over the hasp
348+
def bail(bm, sx=sx):
349+
y = fy - 0.032
350+
_tube_path(bm, [(sx * 0.37, y, 0.195), (sx * 0.245, y, 0.215),
351+
(sx * 0.245, y, 0.125), (sx * 0.37, y, 0.105)],
352+
0.008, sides=8)
353+
parts.append(_part(sc, f"{prefix}.LatchBail{'LR'[sx > 0]}",
354+
_mesh_from_bm(f"{prefix}.LatchBail", bail),
355+
mats["steel"], shell))
356+
# rubber corner guards on the front land, capping the frame joints
357+
for sx in (-1, 1):
358+
for sz in (-1, 1):
359+
def guard(bm, sx=sx, sz=sz):
360+
for dims, off in (((0.13, 0.05, 0.05), (-sx * 0.04, 0.0)),
361+
((0.05, 0.05, 0.13), (0.0, -sz * 0.04))):
362+
res = bmesh.ops.create_cube(bm, size=1.0)
363+
for v in res["verts"]:
364+
v.co.x = v.co.x * dims[0] + sx * 0.565 + off[0]
365+
v.co.y = v.co.y * dims[1]
366+
v.co.z = v.co.z * dims[2] + sz * 0.275 + off[1]
367+
bmesh.ops.remove_doubles(bm, verts=list(bm.verts), dist=1e-6)
368+
bmesh.ops.bevel(bm, geom=list(bm.edges), offset=0.012, segments=2,
369+
profile=0.5, affect="EDGES", clamp_overlap=True)
370+
parts.append(_part(sc, f"{prefix}.CornerGuard{'LR'[sx > 0]}{'BT'[sz > 0]}",
371+
_mesh_from_bm(f"{prefix}.CornerGuard", guard),
372+
mats["rubber"], shell, (0.0, fy - 0.018, 0.0)))
347373
# molded reinforcement frame around the front land
348374
for nm, dims, pos in (("FrameTop", (1.17, 0.03, 0.035), (0.0, 0.28)),
349375
("FrameBottom", (1.17, 0.03, 0.035), (0.0, -0.28)),
@@ -408,16 +434,16 @@ def build_weld_overlay(sc, shell, mat_seam, mat_hot):
408434

409435
def seam(bm):
410436
for va, vb in segs:
411-
_tube_path(bm, [va, vb], 0.018, sides=10)
437+
_tube_path(bm, [va, vb], 0.009, sides=10)
412438
joints = {tuple(round(c, 5) for c in v) for s in segs for v in s}
413439
for j in joints:
414-
bmesh.ops.create_uvsphere(bm, u_segments=10, v_segments=6, radius=0.020,
440+
bmesh.ops.create_uvsphere(bm, u_segments=10, v_segments=6, radius=0.012,
415441
matrix=Matrix.Translation(j))
416442
seam_ob = _part(sc, "WeldSeam", _mesh_from_bm("WeldSeam", seam), mat_seam, shell)
417443

418444
def beads(bm):
419445
for p in counted:
420-
bmesh.ops.create_uvsphere(bm, u_segments=12, v_segments=8, radius=0.038,
446+
bmesh.ops.create_uvsphere(bm, u_segments=12, v_segments=8, radius=0.019,
421447
matrix=Matrix.Translation(p.center))
422448
bead_ob = _part(sc, "PinchBeads", _mesh_from_bm("PinchBeads", beads), mat_hot, shell)
423449
return [seam_ob, bead_ob]
@@ -439,8 +465,8 @@ def mats(tag):
439465
rough=0.55, metallic=0.0),
440466
"steel": make_material(f"{tag}.Steel", (0.62, 0.63, 0.66), rough=0.32,
441467
metallic=1.0),
442-
"accent": make_material(f"{tag}.LatchAnodized", (0.95, 0.52, 0.06),
443-
rough=0.35, metallic=0.6),
468+
"accent": make_material(f"{tag}.LatchSteel", (0.30, 0.31, 0.33),
469+
rough=0.26, metallic=1.0),
444470
"rubber": make_material(f"{tag}.Rubber", (0.025, 0.025, 0.028), rough=0.8,
445471
metallic=0.0),
446472
"plate": make_material(f"{tag}.IdPlate", (0.80, 0.78, 0.70), rough=0.3,
@@ -452,10 +478,12 @@ def mats(tag):
452478
(-0.95, 0.2, hz), CASE_YAW)
453479
degen, degen_parts = build_case(sc, "CaseDegen", DEGEN_OFFSET, mats("Degen"),
454480
(0.95, -0.2, hz), CASE_YAW)
455-
seam_mat = make_material("WeldSeam", (1.0, 0.06, 0.02), rough=0.4, metallic=0.0,
456-
emit=(1.0, 0.05, 0.02), estr=2.2)
457-
hot_mat = make_material("PinchHot", (1.0, 0.2, 0.05), rough=0.4, metallic=0.0,
458-
emit=(1.0, 0.16, 0.04), estr=3.0)
481+
# an inspector's ink line, not a neon tube: thin red-orange seam, and a
482+
# small warm pin on each zero-area face the check counts
483+
seam_mat = make_material("WeldSeam", (0.62, 0.07, 0.02), rough=0.5, metallic=0.0,
484+
emit=(1.0, 0.12, 0.03), estr=0.35)
485+
hot_mat = make_material("PinchHot", (0.95, 0.45, 0.10), rough=0.4, metallic=0.0,
486+
emit=(1.0, 0.45, 0.10), estr=0.6)
459487
overlay = build_weld_overlay(sc, degen, seam_mat, hot_mat)
460488

461489
floor, wall = build_studio(sc)
-1.06 KB
Loading

‎examples/gallery.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@
558558
"name": "degenerate-bevel-weld",
559559
"dir": "examples/degenerate-bevel-weld",
560560
"teaches": "Bevel offset >= half the min box dimension collapses the band into zero-area faces — and they ship: a stdlib GLB re-parse counts the degenerate triangles crossing the export boundary. Two rugged cases whose shells are the check's meshes: flat end panel versus a rolled knife ridge, the collapsed seam traced hot from live mesh data.",
561-
"alt": "Two blue hard-shell cases: the left with a flat end panel and clean chamfer bands, the right with its rim rolled into a ridge traced by a glowing red seam and orange collapse beads.",
561+
"alt": "Two blue hard-shell cases with steel draw latches and rubber corner guards: the left with a flat end panel and clean chamfer bands, the right with its rim rolled into a ridge traced by a thin red-orange seam line and small amber pins at the collapsed faces.",
562562
"witnessesFix": "At offset == min_dimension/2 the bevel band pinches to exactly 12 zero-area faces (4 edges x 3 segments); 32 degenerate triangles cross into the exported GLB, waiting for any merge-by-distance to weld them.",
563563
"hero": "docs/gallery/assets/degenerate-bevel-weld-hero.webp",
564564
"preview": "examples/degenerate-bevel-weld/preview.webp",

0 commit comments

Comments
 (0)