Download or view MischaOrnament.frink in plain text format
/** This makes a special mysterious Christmas tree ornament. It looks like
a featureless sphere but if you put a light inside, it displays an image!
*/
// Resolution of the model in voxels/inch
res = 254/inch
// Outer radius of main sphere
r = 1 inch
// Deepest depth to emboss
deepestEmboss = 2 mm
// Thinnest depth of outer shell (should be a multiple of nozzle width)
thinnest = .4 mm
// Inner diameter of hole to feed light through
innerCylinderDiam = 10 mm
// Thickness of cylinder walls
cylinderThickness = 1.2 mm
// Load an image. This one is blurred to give depth.
// It can be obtained remotely by the following:
// img = new image["https://frinklang.org/frinksamp/MischaBrightFaceBlackbgblur.png"]
//img = new image["file:MischaBrightFaceBlackbgblur.png"]
img = new image["file:MischaOnTableBlur.png"]
// Radius of inner sphere
r1 = r - thinnest - deepestEmboss
// The main outer sphere
outerSphere= callJava["frink.graphics.VoxelArray", "makeSphere", [r res]]
// Inner sphere used for embossing
sphere1 = callJava["frink.graphics.VoxelArray", "makeSphere", [r1 res]]
// 2-pixel cube tool for embossing
pixelTool = newJava["frink.graphics.VoxelArray", [0,2,0,2,0,2,true]]
// Create an embossed pattern from the image.
emboss = sphere1.sphericalEmboss[img, 0,0,0, 180 deg, 2 radian, 0, .7 pi radian, 10, 255, 0, 0, 0, -deepestEmboss res, pixelTool, 0, 0, 0]
// Inner sphere plus embossing to be removed from outer sphere.
scombined = sphere1.union[emboss]
scombined.projectX[undef].show["X"]
scombined.projectY[undef].show["Y"]
scombined.projectZ[undef].show["Z"]
// Outer cylinder of ornament hanger
outerCylinder = callJava["frink.graphics.VoxelArray", "makeCylinder", [0, 0, (r + .3 cm) res, 0, 0, (r - .3 cm) res, (innerCylinderDiam/2 + cylinderThickness) res]]
// Union of outer sphere and outer cylinder.
outerObj = outerSphere.union[outerCylinder]
// Remove the inner sphere and embossing from the outer sphere.
outerObj.remove[scombined]
// Now remove a cylinder for the light to feed in
innerCylinder = callJava["frink.graphics.VoxelArray", "makeCylinder", [0, 0, (r + .3 cm) res, 0, 0, (r - .3 cm) res, (innerCylinderDiam/2) res]]
// Cut the mounting/light hole through into the object.
outerObj.remove[innerCylinder]
v = outerObj
v.projectX[undef].show["X"]
v.projectY[undef].show["Y"]
v.projectZ[undef].show["Z"]
filename = "MischaOrnamentBright.obj"
print["Writing $filename..."]
w = new Writer[filename]
w.println[v.toObjFormat["v", 1/(res mm)]]
w.close[]
println["done."]
Download or view MischaOrnament.frink in plain text format
This is a program written in the programming language Frink.
For more information, view the Frink
Documentation or see More Sample Frink Programs.
Alan Eliasen was born 20139 days, 7 hours, 46 minutes ago.