====== mesh 2 svg 2 paper ====== Meshlab : https://www.meshlab.net/ Rien tiré de meshlab pour transformer un mesh (stl, obj) en svg \\ Premier essai concluant avec https://www.svgai.org/convert/stl-to-svg, le fichier s'ouvre bien avec inkscape, l'épaisseur des traits est bien trop élevée mais ça s'arrange facilement. __Aucune face n'est cachée__ **Conseil de Laurent : utiliser «ln» de Michael Fogleman** : https://github.com/fogleman/ln C'est programmé en Go, jamais utilisé Pour la suite j'utilise l'objet teapot.obj extrait du [[https://www.cs.utah.edu/~natevm/newell_teaset/newell_teaset.zip|newell_teaset.zip]] {{:recherche:residence_polygones:teapot.obj.png?direct&800|}} ===== Conversion de formats 3D en ligne de commande ===== Avec OpenCTM ( https://sourceforge.net/projects/openctm/ ) sudo apt install openctm-tools Ensuite on peut utiliser **ctmconv** qui permet de convertir les formats suivants : * OpenCTM (.ctm), * Stanford triangle format (.ply), * Stereolitography (.stl), * 3D Studio (.3ds), * COLLADA 1.4/1.5 (.dae), * Wavefront geometry file (.obj), * LightWave object (.lwo), * Geomview object file format (.off), * VRML 2.0 - export only (.wrl). ===== Affichage d'objets STL ===== Avec GMSH : https://gmsh.info/ qui est aussi capable d'une multitude d'autres choses (en GUI ou CLI) {{:recherche:residence_polygones:gmsh.png?direct&600|}} ===== Installation de Go ===== # ************************************** # installation du langage Go sur Debian 12 @ tenko sudo apt update sudo apt install golang go version # go version go1.19.8 linux/amd64 go env GOPATH # ok : /home/emoc/go ==== Helloworld en Go ==== Créer un fichier vide helloworld.go nano helloworld.go Le fichier helloworld.go contient package main import "fmt" func main() { fmt.Println("HelloWorld, Golang!") } Puis go run hello.go **Comment compiler ce programme pour qu'il puisse être utilisé comme une commande ?** Il faut le transformer en module go mod init example/helloworld # donner un nom et chemin au module go mod tidy # récupérer les dépendances go build -o helloworld # créer le binaire «helloworld» mv ./helloworld ../bin/helloworld Maintenant on peut déclencher la commande avec ~/go/bin/helloworld ===== Utilisation de Simplify ===== Simplify est un logiciel en ligne de commande de Michael Fogleman qui permet de réduire le nombre de faces d'un objet 3D **au format .STL**. Simplify est programmé en Go https://github.com/fogleman/simplify # installer Go (voir ci-dessus) mkdir ~/go/bin go install github.com/fogleman/simplify/cmd/simplify@latest # réduction à 10% des faces de l'objet (652 faces -> 64 faces) ~/go/bin/simplify -f 0.1 parasect.stl parasect-0.1.stl Comparaison (objet original : [[https://models.spriters-resource.com/nintendo_64/pokemonstadium2/asset/287712/|parasect]]) {{:recherche:residence_polygones:parasect_comparaison_reduction_de_faces.png?direct&800|}} ===== Utilisation de ln ===== Pour transformer un objet 3D au format .OBJ en fichier .SVG git clone https://github.com/fogleman/ln.git cd ln go mod init ln/ln go mod tidy placer le fichier teapot.obj dans le dossier et créer le fichier teapot.go : package main import "github.com/fogleman/ln/ln" func main() { scene := ln.Scene{} mesh, err := ln.LoadOBJ("teapot.obj") if err != nil { panic(err) } mesh.UnitCube() scene.Add(ln.NewTransformedShape(mesh, ln.Rotate(ln.Vector{0, 1, 0}, 0.5))) // scene.Add(mesh) eye := ln.Vector{-0.5, 0.5, 2} center := ln.Vector{} up := ln.Vector{0, 1, 0} width := 1024.0 height := 1024.0 paths := scene.Render(eye, center, up, width, height, 35, 0.1, 100, 0.01) paths.WriteToPNG("teapot.png", width, height) paths.WriteToSVG("teapot.svg", width, height) } Puis go run teapot.go Ça marche! Le fichier svg est créé, en fonction du point de vue défini dans le script go, les faces qui doivent l'être sont cachées. **Transformer en exécutable.** \\ La commande est lancée depuis le répertoire courant dans lequel se trouve le fichier teapot.obj, les fichiers résultants (teapot.png et teapot.svg) sont créés dans le répertoire courant. go build -o teapot # construire le binaire mv teapot ../bin/teapot # déplacer dans le dossier ~/go/bin ~/go/bin/teapot # lancer la commande depuis le répertoire courant On obtient {{:recherche:residence_polygones:teapot_dans_inkscape.png?direct&800|}} Extrait du fichier svg ... etc. En manipulant, on dirait bien que les tracés sont doublés ===== obj2svg ===== Je cherche à créer une commande qui soit accessible de n'importe où qui permette de transformer un objet 3D au format .OBJ en image png et fichier SVG __du maillage__ Créer le dossier et le fichier mkdir test_obj2svg cd test_obj2svg touch obj2svg.go # puis l'éditer package main import ( "fmt" "flag" "github.com/fogleman/ln/ln" ) func main() { // Parsing des arguments flag.Parse() args := flag.Args() if len(args) != 1 { fmt.Println("Usage: obj2svg input.obj -> créera 2 fichiers input.obj.png et input.obj.svg") return } pngfilename := args[0] + ".png" svgfilename := args[0] + ".svg" fmt.Printf("pngfilename %s\n", pngfilename) fmt.Printf("svgfilename %s\n", svgfilename) scene := ln.Scene{} fmt.Printf("Loading %s\n", args[0]) mesh, err := ln.LoadOBJ(args[0]) if err != nil { panic(err) } mesh.UnitCube() scene.Add(ln.NewTransformedShape(mesh, ln.Rotate(ln.Vector{0, 1, 0}, 0.5))) // scene.Add(mesh) eye := ln.Vector{-0.5, 0.5, 2} center := ln.Vector{} up := ln.Vector{0, 1, 0} width := 1024.0 height := 1024.0 paths := scene.Render(eye, center, up, width, height, 35, 0.1, 100, 0.01) paths.WriteToPNG(pngfilename, width, height) paths.WriteToSVG(svgfilename, width, height) } Puis go mod init example/obj2svg # initialiser le module go mod tidy # charger les dépendances go run obj2svg.go teapot.obj # ok, tout fonctionne go build -o obj2svg # construire l'exécutable mv obj2svg ../bin/obj2svg # le placer dans le bon dossier # Maintenant on peut exécuter la commande suivante dans n'importe quel dossier ~/go/bin/obj2svg teapot.obj **TODO : permettre la rotation de la vue** ===== Autres trucs intéressants à essayer ===== **removeduplicatelines** : une extension inkscape qui enlève les segments dupliqués : https://cutlings.datafil.no/inkscape-extension-removeduplicatelines/ \\ **deduplicate** plugin vpype pour enlever les lignes en doublon dans un fichier svg https://github.com/LoicGoulefert/deduplicate **occult** plugin vpype pour masquer les faces cachées d'un fichier svg https://github.com/LoicGoulefert/occult **vpype** «vpype is an extensible CLI pipeline utility which aims to be the Swiss Army knife for creating, modifying and/or optimizing plotter-ready vector graphics» https://vpype.readthedocs.io/en/latest/install.html#linux