Introduction: 3D Printed Photos Using Two Materials
Welcome to my Instructable about making photos with 3d printers! There are other Instructables about using 3D printers to make lithopanes, but this one is a little different in that we will make full grayscale images, with no backlighting necessary. This is accomplished by printing a thin layer of one material over another material with opposite intensity (black-over-white or white-over-black). By changing the thickness of the top layer, we are controlling its transparency, and so can create any blend of black and white we need.
In step 1 I’ll talk about the development of this process. If you want to jump making, the code and its instructions are in step 2.
What you'll need:
- an image
- a little bit of programming chops, or bravery for trying new things
- a fancy printer capable of printing two materials at high resolution. I use an Objet500, with vero white and tango black
Step 1: The Nitty Gritty
Have you noticed that shallow water is transparent, while deeper water is opaque? The thicker a transparent substrate is, the more light is attenuated. The resins printed by 3d printers, like the Objet Connex 500, are actually transparent in thin layers. We can create a gradient by regulating the thickness of a material of one color and layering it over a second material of another color.
Attenuation of light through a material is not linear. This makes things a little tricky, because there isn’t a one-to-one relationship between depth and grayscale. In other words, if we get white at 0” thickness and black at 1” thickness, that doesn’t mean we will get neutral gray at 0.5”. Luckily some smart people figured out the relationship, which is governed by this equation:
which looks like this:
'I' is the light intensity that varies with the materials depth, 'z'. 'I0' is the initial intensity, which we will assume is 1, or total. 'A' is the attenuation coefficient for that material. Notice that small changes in shallow depth are linked to bigger changes in intensity, but at greater depths, changes have less impact on intensity. When a substrate starts to get opaque, it happens quickly.
What we need to figure out is what depth is needed to achieve a given intensity. The missing piece is the value A, which is dependent on the material for the top coat of resin. So, first thing we need to do is find an A for our resin which results in an output print that matches the input photo. The form we care about solves for the depth z:
To find the best value of A, I did a bunch of tests at different values. I tried both black over white, and white over black. Black over white produces a sepia toned image, while white over black is more bluish.
I evaluated the result by looking for the best continuous grayscale. I liked the prints from several values of A. Some would make an image more dark and gloomy. But, for black over white, the value I found to produce the most accurate reproduction was A=120 (this was true for both Objet's Tango plus and Vero Blacks). Full black happens at a depth of about .04”. Although the white over black produces decent test results, I found that when printing actual photos, the whites were washed out. I think this is because the white is more transparent, and so must be printed with a greater depth to reach full white. This gives it more time to scatter light, meaning we lose detail.
One more thing worth mentioning – the layer thickness of the Objet printer is .032”. At shallow depths of black, where small changes in depth can have big changes in intensity, the layer thickness limits the grayscale resolution. Lighter tones will not smoothly transition into one another.
Step 2: Making It
Attached is the Octave code to print these images. Octave is a high level program primarily used for numerical computations, and works similarly to Matlab. It's available here: https://www.gnu.org/software/octave/. In addition to this, you will need the 'stlwrite' function, availalbe here: http://www.mathworks.com/matlabcentral/fileexchang...
Edit the 'script photo3dPrint.m' to input your file name, the directory path, and desired width of the print (in inches). You can also fiddle with the attenuation coefficients and the max depth. The output will be two interlocking STLs, one right on top of the other. If using an Objet printer, open these two files as an assembly in the Objet software, to ensure they are in correct registration with each other. Select the appropriate material for each.
A few more things to keep in mind. The Connex 500 has an amazing x-y resolution of 600 dpi. However, larger STLs can take several minutes to load. I'm not sure of the limit. The largest file I've tried so far was 1500 pixels wide. My code will also take a few minutes to run for larger files.
Step 3: 3D Version
It's possible to do this with 3D models using displacement maps. However, this is a complicated process, that involved several different programs, so for now I'm just going to leave these here as a tease.