====== 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
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