Openscad
Sommaire
Préambule :
Openscad est un logiciel de modélisation libre (license GPL), qui est simple d'utilisation pour des formes relativements basiques, tout en permettant une tilisation avancée à l'aides des fonctions trigonométriques, des boucles, etc.
- finir intro
Principes du logiciel :
Openscad est créé de façon à assembler des formes simples en créant un script, grace à différentes commandes ; l'utilisation des sommes, produits et fonctions trigonométriques est possibles pour les déplacements ainsi que les tailles des éléments.
Installation d'Openscad :
- Ubuntu (12.04 et supérieurs) : sudo apt-get install openscad
- Mac, Windows, BSD : [[1]]
- Code Source : [[2]]
Utilisation du logiciel
Règles élementaires :
- Mettre un point-virgule ";" après chaque ligne d'instruction.
- Les commentaires sont à signalés par deux slashs "//"
Formes de base :
- pavé : cube([longueur,largeur,hauteur]);
(exemple : cube([1,2,3]); : x=1, y=2, z=3)
- cylindre : cylinder(r=rayon, h=hauteur);
(exemple : cylinder(r=1,h=2); : rayon de 1, hauteur de 2) Notes :
- le rayon est la moitié du diamètre ; la visserie est répertoriée selon son diamètre, en mm : une vis m2 a un diamètre de 2mm)
- la hauteur est le z : un cylindre va toujours vers les z croissant. Pour changer d'orientation, il faut utiliser rotate.
- sphère : sphere(r=rayon);
(exemple : sphere(r=1); : rayon de 1)
Déplacements :
- translation : translate([selon x, selon y, selon z]);
- rotation : rotate([autour de x, autour de y, autour de z]);
Remarque :
- les déplacements s'écrivent avant la forme : translate([...]) cylinder();
- on peut combiner rotations et translations
- les déplacements se notent avant la commande, selon l'ordre d'execution :
translate([...]) rotate([...]) cube([...]); =/= rotate([...]) translate([...]) cube([...]);
Formes plus complexes :
- Cube avec l'origine au centre : cube([longueur,largeur,hauteur],center=true);
- Cone : cylinder(r1 = rayon mini, r2 = rayon maxi, h= hauteur);
- Pentagones, octogones,... d'extrusion : cylinder(r=rayon centre angle , $fn= nombre de cotés);
Fonctions :
- hull
- difference
- union
Tutorial : créer une voiture
Partie 1 : creer une base
La voiture est basee sur 3 cubes de differentes tailles.
Le capot est un cube de 30x20x10 (x,y,z) et on le deplace de -7 en y (c est a dire que son coin bas droit sera en 0,-7,0) (c est comme ca que j ai fait la premiere fois, en adaptant sa taille par rapport au reste de la voiture) La commande pour creer ce cube est donc simplement cube([30,20,10]);
L habitacle est un cube de 30x30x20 et on le deplace de 10 en y La commande pour creer ce cube est translate([0,10,0]) cube([30,30,20]) ;
A vous de creer le coffre ; c est un cube de 30x5x10 et on le place a 37 en y
Partie 2 : enlever de la matiere
Il suffit de creer une fonction du type (l ordre d ennonciation ne change rien pour la matiere a enlever : on peut faire forme2 forme1 )
difference(){ base //(une seule); #forme1 ;//a enlever //peut depasser a l exterieur; #forme2 ;//a enlever //etc }
Par exemple, enlever les parebrises de la voiture : ce sont des cubes de 30x3x8
difference(){ translate([0,10,0]) cube([30,30,20]) ;//le cube de l habitacle //et oui, on peut faire des retours a la ligne rien que pour a-airer ou pour des commentaires plutot long comme celui ci #translate([0,9,10.5]) cube([30,3,8]); //parebriseav #translate([0,39,10.5]) cube([30,3,8]);//parbrisear }
A vous de completer en placant les 4 vitres (de 3x10x9) de facon a peu pres convenable (je ne dit pas que ma correction est la meilleure : a vous de voir ; perso, je les met au coordonnes 28,13,10.5 28,28,10.5 -1,28,10.5 et -1,13,10.5)
difference(){ translate([0,10,0]) cube([30,30,20]) ; #translate([0,9,10.5]) cube([30,3,8]); //parebriseav #translate([0,39,10.5]) cube([30,3,8]);//parbrisear #translate([28,13,10.5]) cube([3,10,9]);//fenetre //etc }
Partie 3 : le module
Je ne vous ais pas montre a quel point un code peut etre vite surcharge si une difference est entre 2 formes de base, je vous laisse l imagine. Pour cela, il a ete cree des fonctions appele module qui permet de re-appeler un morceau de code a differents endroits
Il y a plusieurs facons de s en servir : -on met toutes les formes de bases sous un module et on fait les differences sur ce module -on met les pieces a enlever sous forme de modules et on fait la difference des formes de bases -on fait les formes de bases sous formes de module, les differences aussi on a alors module nom_du_module_sans_espace(variable1, variable2,...){ piece 1 a enlever; piece 2 a enlever; etc }
nom_du_module_sans_espace(valeur de variable1, valeur de variable2,...);
Pour l espace des roues, on va utiliser dans le module (de difference) une difference de difference : ca peut faire un peu peur, mais j expliquerais bien le code
module espace_roues(){ //on introduit le module : ce qui est a l interieur est le negatif de ce qui sera enleve car on fera plus tard la difference de ce module
difference(){ //on lui dit de faire une difference : comme c est le negatif, ca sera de la matiere non-enlevee au final translate([-5,36,0]) rotate([90,0,90]) cylinder (h=44,r=5); //on commence par creer un cylindre qui est plus grand que la voiture #difference(){ //on va faire la difference de ce cylindre par une difference translate([5,36,0]) rotate([90,0,90]) cylinder (h=20,r=5); //on lui enlever l entre-roues #translate([-10,36,0]) rotate([90,0,90]) cylinder (h=50,r=1.2); //mais on lui ajoute l axe des roues } } difference(){//de meme pour les roues avant translate([-5,0,0])rotate([90,0,90]) cylinder (h=44,r=5);//place des roues #difference(){ translate([5,0,0]) rotate([90,0,90]) cylinder (h=20,r=5);//entreroues #translate([-10,0,0]) rotate([90,0,90]) cylinder (h=50,r=1.2);//axe des roues } }
}
On va faire une module de la base (ce n est pas tres utile dans ce cas, car ca fait juste gagner 2 lignes, mais dans des formes plus compliquees, ca peut rendre service).
module base(){ //capot translate([0,-7,0]) cube([30,20,10]); //habitacle difference(){ translate([0,10,0]) cube([30,30,20]) ; #translate([0,9,10.5]) cube([30,3,8]); //parebriseav #translate([0,39,10.5]) cube([30,3,8]);//parbrisear #translate([28,13,10.5]) cube([3,10,9]);//fenetre #translate([28,28,10.5]) cube([3,10,9]);//fenetre #translate([-1,28,10.5]) cube([3,10,9]);//fenetre #translate([-1,13,10.5]) cube([3,10,9]);//fenetre } //coffre translate([0,37,0]) cube([30,5,10]); }
Maintenant, a vous de faire le module des phares arrieres : -les phares arriere ont une hauteur de 3, un rayon de 2 : la commande pour creer le cylindre est cylinder(h=3,r=2); -on le fait pivoter de 90° selon x (rappel : tout tourne autour de l axe x dans ce cas) dans le sens trigonometrique (=anti-horaire) : rotate([90,0,0]) -on les mets respectivement a 27.5,43,7.3 et 2.5,43,7.3
De meme pour les phares avant sauf qu ils sont a 4,-2,5 et 26,-2,5 et qu ils ont un rayon de 3 pour une hauteur de 3
On va maintenant faire la difference du bati et des negatifs que vous avez fait difference(){
bati(); #phares_avant(); #phares_arriere(); #espace_roues();
}
Partie 4 : Solution de tout ce que vous avez fait jusqu a present :
module base(){
//capot translate([0,0,0]) cube([30,20,10]); //habitacle difference(){ translate([0,10,0]) cube([30,30,20]) ; #translate([0,9,10.5]) cube([30,3,8]); //parebriseav #translate([0,39,10.5]) cube([30,3,8]);//parbrisear #translate([28,13,10.5]) cube([3,10,9]);//fenetre #translate([28,28,10.5]) cube([3,10,9]);//fenetre #translate([-1,28,10.5]) cube([3,10,9]);//fenetre #translate([-1,13,10.5]) cube([3,10,9]);//fenetre } //coffre translate([0,37,0]) cube([30,5,10]);
} module espace_roues(){
difference(){ translate([-5,36,0]) rotate([90,0,90]) cylinder (h=44,r=5); #difference(){ translate([5,36,0]) rotate([90,0,90]) cylinder (h=20,r=5); #translate([-10,36,0]) rotate([90,0,90]) cylinder (h=50,r=1.2); } } difference(){ translate([-5,0,0])rotate([90,0,90]) cylinder (h=44,r=5); #difference(){ translate([5,0,0]) rotate([90,0,90]) cylinder (h=20,r=5); #translate([-10,0,0]) rotate([90,0,90]) cylinder (h=50,r=1.2); } }
} module phares_arriere(){
translate([27.5,43,7.3]) rotate([90,0,0]) cylinder(h=3,r=2); translate([2.5,43,7.3]) rotate([90,0,0]) cylinder(h=3,r=2);
} module phares_avant(){
translate([4,-5,5]) rotate([90,0,0]) cylinder(h=3,r=3);//phareav translate([26,-5,5]) rotate([90,0,0]) cylinder(h=3,r=3);
} difference(){
bati(); #espace_roues(); //on nappelle pas forcement dans l ordre des modules, mais c est plus simple pour retrouver #phares_avant(); //les negatifs sont maintenant developpes et deviennent deviennent des differences #phares_arriere();
}
Partie 5 : creer les roues
La fonction for permet de repeter plusieurs fois une operation notation : for(variable=[valeur1,valeur2,valeur3,etc]){ commande1 commande2 }
Le rayon des roues est de 4.5, on deplace chaque nouvelle roue de 12 suivant y, et sont en -15,y,0 L axe des roues fait 1 de rayon pour 9 de hauteur, on les place au meme endroit que les roues sauf a 4 de hauteur
for (y=[0,1,2,3]){ //pour z prenant les valeurs de 0 a 3 translate([-15,12*y,0]) cylinder (h=4.3,r=4.5);//on cree les roues ; le parametre y sert ici aussi a deplacer chaque nouvelle roue pour eviter que 2 roues se confondent translate([-15,12*y,4]) cylinder (h=9.5,r=1);//on cree les axes des roues }
Partie 6 : creer les plaques d immatriculation
Ici, on utilise deux cylindres d une hauteur de 1 et de rayon 1, et toute l aire entre les 2 est remplie par la fonction hull. Les 2 cylindres extremites ont pour cotes 12 et 18 , 0.7,2 N oubliez pas d effectuer une rotation de 90 suivant x
hull(){ commande1; commande2; }
hull(){ //plaque avant translate([12,-6.3,2]) rotate([90,0,0]) cylinder(h=1,r=1); translate([18,-6.3,2]) rotate([90,0,0]) cylinder(h=1,r=1); }
Faites la meme chose pour la plaque arriere (coordonnes 12 et 18, 42.3,2, meme taille)
CODE FINAL :
module base(){ //capot translate([0,-7,0]) cube([30,20,10]); //habitacle difference(){ translate([0,10,0]) cube([30,30,20]) ; #translate([0,9,10.5]) cube([30,3,8]); //parebriseav #translate([0,39,10.5]) cube([30,3,8]);//parbrisear #translate([28,13,10.5]) cube([3,10,9]);//fenetre #translate([28,28,10.5]) cube([3,10,9]);//fenetre #translate([-1,28,10.5]) cube([3,10,9]);//fenetre #translate([-1,13,10.5]) cube([3,10,9]);//fenetre } //coffre translate([0,37,0]) cube([30,5,10]); } module espace_roues(){ difference(){ translate([-5,36,0]) rotate([90,0,90]) cylinder (h=44,r=5); #difference(){ translate([5,36,0]) rotate([90,0,90]) cylinder (h=20,r=5); #translate([-10,36,0]) rotate([90,0,90]) cylinder (h=50,r=1.2); } } difference(){ translate([-5,0,0])rotate([90,0,90]) cylinder (h=44,r=5); #difference(){ translate([5,0,0]) rotate([90,0,90]) cylinder (h=20,r=5); #translate([-10,0,0]) rotate([90,0,90]) cylinder (h=50,r=1.2); } } } module phares_arriere(){ translate([27.5,43,7.3]) rotate([90,0,0]) cylinder(h=3,r=2); translate([2.5,43,7.3]) rotate([90,0,0]) cylinder(h=3,r=2); } module phares_avant(){ translate([4,-5,5]) rotate([90,0,0]) cylinder(h=3,r=3);//phareav translate([26,-5,5]) rotate([90,0,0]) cylinder(h=3,r=3); } difference(){ base(); #espace_roues(); //on nappelle pas forcement dans l ordre des modules, mais c est plus simple pour retrouver #phares_avant(); //les negatifs sont maintenant developpes et deviennent deviennent des differences #phares_arriere(); } //on cree maintenant les roues for (y=[0,1,2,3]){ //pour z prenant les valeurs de 0 a 3 translate([-15,12*y,0]) cylinder (h=4.3,r=4.5);//on cree les roues ; le parametre y sert ici aussi a deplacer chaque nouvelle roue pour eviter que 2 roues se confondent translate([-15,12*y,4]) cylinder (h=9.5,r=1);//on cree les axes des roues } //on fait les 2 plaques hull(){ //plaque avant translate([12,-6.3,2]) rotate([90,0,0]) cylinder(h=1,r=1); translate([18,-6.3,2]) rotate([90,0,0]) cylinder(h=1,r=1); } hull(){ //plaque arriere translate([12,42.3,2]) rotate([90,0,0]) cylinder(h=1,r=1); translate([18,42.3,2]) rotate([90,0,0]) cylinder(h=1,r=1); }
Remarques :
J aurais pu beaucoup plus utiliser la fonction for, mais le but n etait ici que de l introduire pour faire une chose de facile a comprendre J aurais pu ne pas mettre la fonction hull, mais je pense n introduire que for n aurait pas fait beaucoup
Manuel d'utilisation :
Vous y trouverz toutes les commandes avec des exemples et des images : (en anglais) [[3]]