Paso 1: El código
Todos estos modelos 3D fueron generados algorítmicamente de procesamiento mediante la biblioteca de ModelBuilder por Marius Watz. Esta biblioteca le permite guardar geometrías 3D en el formato de archivo STL, archivos STL que forman una malla impermeable se pueden imprimir por una impresora 3D.
Para comenzar a utilizar este código usted mismo, descargue la última versión de la biblioteca de ModelBuilder, descomprimir el archivo y copiar la carpeta en la carpeta de "bibliotecas" de procesamiento. Si ha instalado al precursor a la biblioteca de ModelBuilder (llamada la biblioteca de Unlekker), necesita eliminar. Una vez hecho esto reiniciar proceso.
imagen en 3d para imprimir mapa/Litofania //by Amanda Ghassaei //May 2013 / / / * * este programa es software libre; Usted puede redistribuirlo y/o modificar * bajo los términos de la GNU General Public License publicada por * la Free Software Foundation; ya sea la versión 3 de la licencia, o * (a su opción) cualquier versión posterior. * / //libraries import processing.opengl.*; Import unlekker.util.*; Import unlekker.modelbuilder.*; Import ec.util.*; String nombre = "your_file_name_here.jpg";//name de archivo (con extensión - esto también funciona con archivos PNG) //storage para dimensiones int widthRes; int heightRes; Float widthDim = 5; //width dimensiones (en pulgadas) float widthScaled; Float heightScaled; flotador zDim = 0.1;//max desplazamiento vertical (en pulgadas) espesor de float = invertir booleano de espesor (en pulgadas) 0.02;//base = true; //if true, entonces las áreas blancas son más bajas que negro, si no verdadera áreas blancas son img PImage taller //storage para imagen float pixeldata [] //storage para pixel array UVertexList v1, v2, v3, v4, //storage de verticies UGeometry geo; //storage para stl geometría void setup() {img = loadImage (nombre); //load //get dimensiones en imagen de la imagen widthRes = img.width; heightRes = img.height; tamaño (widthRes heightRes, P3D); //set dimensiones de imagen de salida (img, 0,0), (imagen de loadPixels) //display; //poad píxeles en la matriz pixeldata = new float [widthRes * heightRes]; //initialize almacenamiento de datos de pixel para (int index = 0; índice < widthRes * heightRes; índice ++) {int getPixelData = pixeles [índice]; //get los datos de píxeles [] array pixeldata [index] = getPixelData & 255; //convert en escala byte (0-255)} //initialize almacenamiento para stl geo = nuevo UGeometry(); v1 = nuevo UVertexList(); V2 = nuevo UVertexList(); V3 = nuevo UVertexList(); V4 = nuevo UVertexList(); dibujar stl if(invert) {//draw tapa para (int i = 0; i <(heightRes-1); i ++) {v1.reset(); v2.reset(); para (int j = 0; j < widthRes; j ++) {widthScaled = j/float (widthRes) * widthDim; //top capa 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 lados v1.reset(); v2.Reset(); V3.Reset(); V4.Reset(); para (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); dibujar los lados v1.reset(); v2.Reset(); V3.Reset(); V4.Reset(); para (int i = 0; i < heightRes; i ++) {heightScaled = i / flotador (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); } otro {//draw tapa para (int i = 0; i <(heightRes-1); i ++) {v1.reset(); v2.reset(); para (int j = 0; j < widthRes; j ++) {widthScaled = j/float (widthRes) * widthDim; //top capa 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 lados v1.reset(); v2.reset(); v3.reset(); v4.reset(); para (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); dibujar los lados v1.reset(); v2.Reset(); V3.Reset(); V4.Reset(); para (int i = 0; i < heightRes; i ++) {heightScaled = i / flotador (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 inferior v1.reset(); v2.Reset(); Añadir fondo cuatro esquinas 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); cambiar extensión de nombre de archivo int dotPos = name.lastIndexOf("."); Si nombre (dotPos > 0) = name.substring (0, dotPos); geo.writeSTL(this,name+".stl"); Exit(); println("Finished"); }
Descargar la última versión del esbozo del proceso de GitHub (descargar en un zip haciendo clic en el botón de la nube). Abre la carpeta llamada Lithograph3DPrint. Copie cualquier imagen en escala de grises para convertir a esta carpeta.
Para ejecutar el sketch, reemplace la parte entre comillas en la siguiente línea:
String nombre = "your_file_name_here";
con el nombre de la imagen en escala de grises. Creo .gif, .jpg, .tga y .png archivos funcionará todo bien, pero hasta ahora sólo he probado .jpg. Ejecutar el boceto, después de un minuto o dos proceso le dirá que está escribiendo un archivo STL y finalmente le indicará que ha terminado. El archivo resultante se ubicará en la carpeta de sketch llamado "NAME_OF_ORIGINAL_FILE.stl" puede abrir el archivo stl con una variedad de CAD software y stl de espectadores, me gusta MeshLab para una visualización simple (es gratuito y de código abierto).
Por defecto mi bosquejo escalará imágenes a 8" de ancho, con un espesor base de espesor 0,02" y característica de hasta 0,1", usted puede cambiar estas establecer mediante el ajuste de la variable en la parte superior del bosquejo.