Etape 1: Le Code
Tous ces modèles 3D ont été générés par algorithme de traitement à l’aide de la bibliothèque ModelBuilder par Marius Watz. Cette bibliothèque vous permet d’enregistrer des géométries 3D dans le format de fichier STL, fichiers STL qui forment un maillage étanche peuvent être imprimés par une imprimante 3D.
Pour commencer en utilisant ce code vous-même, téléchargez la dernière version de la bibliothèque ModelBuilder, décompressez le fichier et copiez le dossier dans le dossier « bibliothèques » de traitement. Si vous avez installé le prédécesseur à la bibliothèque de ModelBuilder (appelée la bibliothèque de Unlekker), vous aurez besoin de le supprimer. Une fois ceci fait redémarrer le traitement.
image 3d imprimable altitude/lithophanie //by Amanda Ghassaei //May 2013 / / / * * ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier * elle aux termes de la GNU General Public License telle que publiée par * la Free Software Foundation ; soit la version 3 de la licence, ou * (à votre choix) toute version ultérieure. * / //libraries import processing.opengl.* ; Import unlekker.util.* ; Import unlekker.modelbuilder.* ; Import ec.util.* ; String nom = "your_file_name_here.jpg";//name de fichier (avec extension - cela a également des œuvres avec png) //storage pour dimensions int widthRes ; int heightRes ; float widthDim = 5; //width Dimensions (en pouces) flotteur widthScaled ; float heightScaled ; float zDim = épaisseur de flotteur pour le déplacement vertical (en pouces) 0.1;//max = inverti booléenne de l’épaisseur (en pouces) 0.02;//base = true ; //if true, alors les zones blanches sont plus faibles que noir, sinon véritables zones blanches sont taller Byte img ; //storage pour flotteur de l’image [pixeldata]; //storage pour pixel array UVertexList v1, v2, v3, v4 ; //storage pour verticies UGeometry geo //storage pour stl géométrie void setup() {img = loadImage (nom); //load image //get dimensions de l’image widthRes = img.width ; heightRes = img.height ; taille (widthRes heightRes, P3D); //set dimensions de l’image de sortie (img, 0,0); //display image loadPixels (); //poad pixels en tableau pixeldata = nouveau float [widthRes * heightRes]; //initialize de stockage pour les données de pixel pour (int index = 0; index < widthRes * heightRes ; index ++) {int getPixelData = pixels [index]; //get les données de pixels [] tableau pixeldata [index] = getPixelData & 255 ; //convert en niveaux de gris octet (0-255)} //initialize stockage pour stl geo = new UGeometry() ; v1 = new UVertexList() ; v2 = new UVertexList() ; v3 = new UVertexList() ; v4 = new UVertexList() ; dessiner stl if(invert) {//draw dessus pour (int i = 0; j’ai <(heightRes-1); i ++) {v1.reset() ; v2.reset() ; pour (int j = 0; j < widthRes; j ++) {widthScaled = j/float (widthRes) * widthDim ; //top couche v1.add(widthScaled,i/float(widthRes)*widthDim,(255-pixeldata[widthRes*i+j])*zDim/255+thickness) ; v2.add(widthScaled,(i+1)/float(widthRes)*widthDim,(255-pixeldata[widthRes*(i+1)+j])*zDim/255+thickness);} geo.quadStrip (v1 v2) ; } //draw faces v1.reset() ; v2.Reset() ; v3.Reset() ; v4.Reset() ; pour (int j = 0; j < widthRes; j ++) {widthScaled = j/float (widthRes) * widthDim ; v1.add(widthScaled,0,(255-pixeldata[j])*zDim/255+thickness) ; v2.add(widthScaled,0,0) ; v3.add(widthScaled,(heightRes-1)/float(widthRes)*widthDim,(255-pixeldata[widthRes*(heightRes-1)+j])*zDim/255+thickness) ; v4.add(widthScaled,(heightRes-1)/float(widthRes)*widthDim,0);} geo.quadStrip(v2,v1) ; geo.quadStrip(v3,v4) ; tracer les côtés v1.reset() ; v2.Reset() ; v3.Reset() ; v4.Reset() ; pour (int i = 0; i < heightRes; i ++) {heightScaled = i / float (widthRes) * widthDim ; v1.add(0,heightScaled,(255-pixeldata[widthRes*i])*zDim/255+thickness) ; v2.add(0,heightScaled,0) ; v3.add((widthRes-1)/float(widthRes)*widthDim,heightScaled,(255-pixeldata[widthRes*(i+1)-1])*zDim/255+thickness) ; v4.add((widthRes-1)/float(widthRes)*widthDim,heightScaled,0);} geo.quadStrip(v1,v2) ; geo.quadStrip(v4,v3) ; } else {//draw top pour (int j’ai = 0; j’ai <(heightRes-1); i ++) {v1.reset() ; v2.reset() ; pour (int j = 0; j < widthRes; j ++) {widthScaled = j/float (widthRes) * widthDim ; //top couche v1.add(widthScaled,i/float(widthRes)*widthDim,(pixeldata[widthRes*i+j])*zDim/255+thickness) ; v2.add(widthScaled,(i+1)/float(widthRes)*widthDim,(pixeldata[widthRes*(i+1)+j])*zDim/255+thickness);} geo.quadStrip(v1,v2);} //draw côtés v1.reset() ; v2.reset() ; v3.reset() ; v4.reset() ; pour (int j = 0; j < widthRes; j ++) {widthScaled = j/float (widthRes) * widthDim ; v1.add (widthScaled , 0,(pixeldata[j])*zDim/255+thickness) ; v2.Add(widthScaled,0,0) ; v3.Add(widthScaled,(heightRes-1)/float(widthRes)*widthDim,(pixeldata[widthRes*(heightRes-1)+j])*zDim/255+Thickness) ; v4.Add(widthScaled,(heightRes-1)/float(widthRes)*widthDim,0) ; } geo.quadStrip(v2,v1) ; geo.quadStrip(v3,v4) ; tracer les côtés v1.reset() ; v2.Reset() ; v3.Reset() ; v4.Reset() ; pour (int i = 0; i < heightRes; i ++) {heightScaled = i / float (widthRes) * widthDim ; v1.add(0,heightScaled,(pixeldata[widthRes*i])*zDim/255+thickness) ; v2.add(0,heightScaled,0) ; v3.add((widthRes-1)/float(widthRes)*widthDim,heightScaled,(pixeldata[widthRes*(i+1)-1])*zDim/255+thickness) ; v4.add((widthRes-1)/float(widthRes)*widthDim,heightScaled,0);} geo.quadStrip(v1,v2) ; geo.quadStrip(v4,v3) ; } //draw bas v1.reset() ; v2.Reset() ; Ajouter quatre coins v1.add(0,0,0) ; v1.Add(0,(heightRes-1)/float(widthRes)*widthDim,0) ; v2.Add((widthRes-1)/float(widthRes)*widthDim,0,0) ; v2.Add((widthRes-1)/float(widthRes)*widthDim,(heightRes-1)/float(widthRes)*widthDim,0) ; geo.quadStrip(v1,v2) ; changer l’extension de nom de fichier int dotPos = name.lastIndexOf(".") ; Si le nom de (dotPos > 0) = name.substring (0, dotPos) ; geo.writeSTL(this,name+".stl") ; Exit() ; println("finished") ; }
Télécharger la dernière version de l’esquisse de la transformation de GitHub (télécharger un zip en cliquant sur le bouton de nuage). Ouvrez le dossier appelé Lithograph3DPrint. Copier des images de niveaux de gris, que vous voulez convertir dans ce dossier.
Pour exécuter l’esquisse, remplacez la partie entre guillemets dans la ligne suivante :
String nom = « your_file_name_here » ;
avec le nom de votre image de niveaux de gris. Je crois .gif, .jpg, .tga et fichiers .png tous fonctionneront très bien, mais je n’ai testé que .jpg jusqu'à présent. Exécuter l’esquisse, après une minute ou deux traitement vous dira que c’est écrit un fichier STL et finalement, il vous dira que c’est fini. Le fichier qui en résulte se situera dans dossier de l’esquisse nommé « NAME_OF_ORIGINAL_FILE.stl », vous pouvez ouvrir le fichier stl avec une variété de logiciels et stl CAO, j’aime MeshLab pour visualisation simple (c’est gratuit et open source).
Par défaut, mon esquisse dimensionnera images à 8" de large, avec une épaisseur de base de 0.02" et fonction épaisseur de jusqu'à 0,1", vous pouvez modifier ces paramètres en réglant la variable dans la partie supérieure de l’esquisse.