IceSL
IceSL est à la fois un modeleur 3D nécessitant l'écriture de scripts
et un puissant outil pour préparer des impressions 3D (Slicer)
Les dimensions sont exprimées en mm
Vous pouvez télécharger le logiciel ICI
La modélisation ne se fait pas comme traditionnellement par l'intermédiaire d'une interface graphique, mais par l'écriture d'un script décrivant les géométries à créer.
Les scripts sont basés sur le langage LUA, une documentation du langage LUA est disponible ici ou ici en français
Le but est de décrire le model 3D puis de demander son affichage grâce a la commande emit()
Par exemple pour afficher une sphère de 10 mm de rayon on écrit : emit(sphere(10))
Les primitives de base
Primitive | Version centrée | Alternatives |
---|---|---|
load(path) |
load_centered(path) |
|
sphere(r) |
||
cube(dx,dy,dz) |
ccube(dx,dy,dz) |
box(dx,dy,dz) |
cone(r0,r1,h) |
ccone(r0,r1,h) |
|
cylinder(r,h) |
ccylinder(r,h) |
|
|
||
|
Créer un cube:
largeur = 10
dcube = ccube( largeur ) emit( dcube )
Créer une sphere
irayon = 7 dsphere = sphere( irayon ) emit( dsphere )
Extrusion Linéaire :
linear_extrude(dir, points)
exemple :
triangle = { v(-10,0), v(0,10), v(10,0) } -- Variable contenant la liste des points dir = v(0,0,50) -- Vecteur de direction pour l'éxtrusion emit( linear_extrude(dir, triangle) ) -- Extrusion linéaire
Importer un tracé vectoriel SVG
svg_shapes = svg_ex('motif.svg',90) for i,contour in pairs(svg_shapes) do emit(linear_extrude(v(0,0,1),contour:outline()), i) end
Les transformations :
translate(dx,dy,dz)
rotate(angle,axis)
rotate(rx,ry,rz)
scale(sx, sy, sz)
mirror(normal)
Les operations Booléenne
union(s0,s1)
intersection(s0,s1)
difference(s0,s1)
Créer un Vase
hauteur = 10 diametreBas = 4 diametreHaut = 5 dcone = cone(diametreBas,diametreHaut,hauteur) dcone2 = scale(0.8, 0.8, 0.8) * translate(0,0,3) * dcone vase = difference(dcone ,dcone2) emit(vase)
Autre operations
merge{ s0,...,sn }
flip(m)
convex_hull(shape)
dilate(mesh, factor)
erode(mesh, factor)
Chargement d'un fichier STL ou OBJ
merge_vertices(load_centered('fichier.stl'))
Export en STL
dump(to_mesh(monObjet,0.2),'test.stl')
ou
dump(to_mesh_dual(shape,1.0),'test.stl')
Distribution sur un objet
distribute(shape, density)
rayon = 7 dsphere = sphere( rayon ) s = distribute(dsphere, 0.01) centroids = {} for i = 1,#s,1 do centroids[i] = translate(s[i][1]) * frame(s[i][2]) * sphere(s[i][3]) end r = union(dsphere,merge(centroids)) emit(r)
Tweaks (interface graphique permetant de modifier un parametre)
ui_scalar(nom, par défaut, min, max)
Crée une barre de reglage pour définir de façon interactive une valeur entre min et max.
nom: le nom de la barre coulissante
par défaut: valeur par défaut
min: valeur minimale
max: valeur maximale
r = ui_scalar("Radius",10,1,20) emit(sphere(r))
Distribution de formes (difference)
rayon = 7 dsphere = sphere( rayon ) --emit( dsphere ) s = distribute(dsphere, 0.01) centroids = {} for i = 1,#s,1 do centroids[i] = translate(s[i][1]) * frame(s[i][2]) * sphere(2.2*s[i][3]) end r = difference(dsphere,merge(centroids)) emit(r)
Distribution de forme sur une face d'un cube
c= ccube(50 ,50,7) s = distribute(c, -0.1) centroids = {} for i = 1,#s,1 do if (s[i][1].z > 0) then centroids[i] = translate(s[i][1]) * frame(s[i][2]) * sphere(s[i][3]/0.7) end end m = merge(centroids) emit(difference(c,m))
Boucle 
Nombre = math.floor(ui_scalar('Répetitions',1,2,150)) Longueur = ui_scalar('Longuer',1,20,100) maForme = translate(Longueur/2,0,0) * cube(Longueur,1,1) for i=1,Nombre-1 do maForme = union( maForme, rotate(0,0,i*360/Nombre) * translate(Longueur/2,0,0) * cube(Longueur,1,1)) end emit(maForme)
Fonctions Implicite
sphA = implicit(v(-30,-30,-30), v(30,30,30), [[ float perturb(vec3 p) { return 5*abs(noise(p/7+7)); } float distanceEstimator(vec3 p) { return 0.3*(max(sphere(p,25),-sphere(p,22)) + perturb(p)); } ]]) emit(sphA)