Spigoli e illuminazione obliqua nella vista 3D

La prima versione era poco leggibile: l'ombreggiatura usava solo
l'inclinazione frontale, quindi le facce complanari di un pezzo piatto
uscivano tutte dello stesso grigio e la forma non si distingueva.

Due correzioni:

- luce direzionale obliqua invece che frontale, con una rampa di
  luminosita' piu' ampia, cosi' le facce orientate diversamente si
  separano davvero;
- soprattutto, gli spigoli. Sopra alle superfici si disegnano ora gli
  spigoli vivi (due facce che formano un angolo netto) e la silhouette
  (faccia visibile contro faccia nascosta). Sono le linee che rendono
  riconoscibile un pezzo meccanico, le stesse che traccerebbe un
  disegnatore.

Per distinguere uno spigolo vivo da una suddivisione interna della
tassellatura servono le facce adiacenti, che un STL non fornisce perche'
ripete i vertici a ogni triangolo. Mesh.indexed() li fonde e ricostruisce
la topologia: sul pezzo di prova 912 ripetizioni diventano 144 vertici
reali, 304 facce e 456 spigoli, senza bordi liberi. La mesh risulta
chiusa e la caratteristica di Eulero indica cinque fori passanti, come il
pezzo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-06 16:09:27 +02:00
co-authored by Claude Opus 5
parent 0410266334
commit 6a874e85f6
4 changed files with 197 additions and 85 deletions
+8
View File
@@ -117,6 +117,14 @@ Produce una **pagina HTML autonoma**: la apri con un doppio clic e ruoti il
pezzo col mouse, ingrandisci con la rotella, sposti col tasto destro. Nessuna
libreria esterna, nessuna connessione, funziona anche da una cartella di rete.
Un pezzo meccanico solo ombreggiato risulta illeggibile, perché le facce
complanari hanno tutte lo stesso colore. Sopra alle superfici vengono quindi
disegnati **gli spigoli vivi** (dove due facce formano un angolo netto) e la
**silhouette** (dove una faccia visibile incontra una nascosta) — le stesse
linee che traccerebbe un disegnatore. Per distinguerli servono le facce
adiacenti a ogni spigolo, che `Mesh.indexed()` ricava fondendo i vertici
ripetuti dell'STL (sul pezzo di prova: 912 ripetizioni → 144 vertici reali).
La forma **non** viene dal `.prt`: viene da una **mesh STL esportata da Creo**,
cercata automaticamente accanto al modello (`9258400207.prt.11`
`9258400207.stl`). Se manca, il programma lo dice invece di fallire.