3D tryckt fotografera (1 / 1 steg)
Steg 1: Koden
Alla dessa 3D modeller genererades algoritmiskt från behandling med ModelBuilder bibliotek av Marius Watz. Detta bibliotek kan du spara 3D geometrier i STL filformat, STL-filer som bildar ett vattentätt mesh kan skrivas av en 3D-skrivare.
För att komma igång med denna kod själv, ladda ner den senaste versionen av ModelBuilder bibliotek, packa upp filen och kopiera mappen till bearbetnings "bibliotek" mapp. Om du har installerat föregångare till ModelBuilder biblioteket (kallas Unlekker bibliotek), måste du ta bort den. När detta är klart starta om bearbetning.
bild till 3d utskrivbar heightmap/lithophane
av Amanda Ghassaei
Maj 2013
/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 3 av licensen, eller
* (på ditt alternativ) någon senare version.
*/
bibliotek
import processing.opengl.*;
import unlekker.util.*;
import unlekker.modelbuilder.*;
import ec.util.*;
String namn = "your_file_name_here.jpg";//name av fil (med filnamnstillägget - detta också fungerar med png)
lagring för dimensioner
int widthRes;
int heightRes;
flyta widthDim = 5; //width dimension (i tum)
float widthScaled;
float heightScaled;
flyta zDim = 0.1;//max i höjdled (i tum)
flyta tjocklek = 0.02;//base tjocklek (i tum)
booleska Invertera = true; //if sant, sedan vita områden är lägre än svart, om inte sant vita områden är högre
PImage img; //storage för bild
float pixeldata []; //storage för pixel array
UVertexList v1, v2, v3, v4, //storage för verticies
UGeometry geo, //storage för stl geometri
void setup() {
IMG = loadImage (namn); //load bild
få måtten på bilden
widthRes = img.width;
heightRes = img.height;
storlek (widthRes, heightRes, P3D); //set dimensioner av produktionen
bild (img, 0,0); //display bild
loadPixels (); //poad pixlar till array
pixeldata = ny float [widthRes * heightRes]; //initialize lagring för pixeldata
för (heltal index = 0; index < widthRes * heightRes; index ++) {
int getPixelData = pixlar [index]; //get data från pixlar [] matris
pixeldata [index] = getPixelData & 255; //convert till gråskala byte (0-255)
}
initiera lagring för stl
Geo = nya UGeometry();
v1 = nya UVertexList();
v2 = nya UVertexList();
v3 = nya UVertexList();
v4 = nya UVertexList();
Rita stl
IF(Invert) {
Rita upp
för (int jag = 0; jag <(heightRes-1); i ++) {
v1.Reset();
v2.Reset();
för (int j = 0; j < widthRes; j ++) {
widthScaled = j/float (widthRes) * widthDim;
översta lagret
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);
}
dra sidor
v1.Reset();
v2.Reset();
v3.Reset();
v4.Reset();
för (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);
dra sidor
v1.Reset();
v2.Reset();
v3.Reset();
v4.Reset();
för (int jag = 0; jag < heightRes; i ++) {
heightScaled = jag / flyta (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);
}
annat {
Rita upp
för (int jag = 0; jag <(heightRes-1); i ++) {
v1.Reset();
v2.Reset();
för (int j = 0; j < widthRes; j ++) {
widthScaled = j/float (widthRes) * widthDim;
översta lagret
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);
}
dra sidor
v1.Reset();
v2.Reset();
v3.Reset();
v4.Reset();
för (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);
dra sidor
v1.Reset();
v2.Reset();
v3.Reset();
v4.Reset();
för (int jag = 0; jag < heightRes; i ++) {
heightScaled = jag / flyta (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);
}
Rita botten
v1.Reset();
v2.Reset();
lägga till fyra nedersta hörn
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);
ändra förlängning av filnamn
int dotPos = name.lastIndexOf(".");
om (dotPos > 0)
namn = name.substring (0, dotPos);
geo.writeSTL(this,name+".stl");
Exit();
println("finished");
}
Hämta den senaste versionen av bearbetning skiss från GitHub (ladda ner som en zip genom att klicka på knappen moln). Öppna mappen kallas Lithograph3DPrint. Kopiera alla gråskalebilder som du vill konvertera till denna mapp.
Om du vill köra skissen, ersätta del inom citationstecken i följande rad:
String namn = "your_file_name_here";
med namnet på din gråskala bild. Jag tror .gif, .jpg, .tga, och PNG-filer kommer alla att fungera bra, men jag har bara testat .jpg hittills. Springa skissen, efter en minut eller två bearbetning kommer att berätta att det är att skriva en STL-fil och så småningom det kommer att berätta att den är klar. Den resulterande filen kommer att placeras i den skiss mapp som heter "NAME_OF_ORIGINAL_FILE.stl" kan du öppna filen stl med en mängd olika CAD programvara och stl tittare, jag gillar MeshLab för enkel visning (det är gratis och öppen källkod).
Som standard kommer min skiss skala bilder till 8" bred, med en bas tjocklek på 0,02" och funktionen tjocklek upp till 0.1", kan du ändra dessa inställning genom att justera variabeln överst på skissen.