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:
+18
-1
@@ -222,7 +222,24 @@ class TestMesh(unittest.TestCase):
|
||||
for marker in ('src="http', "href=\"http", "@import"):
|
||||
self.assertNotIn(marker, page, "la pagina carica risorse esterne")
|
||||
# la mesh deve essere incorporata, non referenziata
|
||||
self.assertIn("const TRI = [[", page)
|
||||
self.assertIn("const V = [[", page)
|
||||
self.assertIn("], F = [[", page)
|
||||
|
||||
def test_topologia_spigoli(self):
|
||||
"""Gli spigoli servono a rendere leggibile la forma: senza facce
|
||||
adiacenti non si distinguono quelli vivi dalla tassellatura."""
|
||||
from creoparams.mesh import read_stl
|
||||
for part, stl in self.pairs:
|
||||
with self.subTest(file=os.path.basename(stl)):
|
||||
mesh = read_stl(stl)
|
||||
vertices, faces, edges = mesh.indexed()
|
||||
self.assertLess(len(vertices), len(mesh) * 3,
|
||||
"i vertici ripetuti non sono stati fusi")
|
||||
self.assertGreater(len(edges), len(faces))
|
||||
# ogni spigolo appartiene ad almeno una faccia valida
|
||||
for a, b, f0, f1 in edges:
|
||||
self.assertNotEqual(a, b)
|
||||
self.assertTrue(0 <= f0 < len(faces))
|
||||
|
||||
|
||||
def read_stl_cached(path):
|
||||
|
||||
Reference in New Issue
Block a user