MischaOrnament.frink

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 20217 days, 23 hours, 19 minutes ago.