OpenFab A Programmable Pipline for Multi-Material Fabrication Kiril Vidimce Presented By: Mira Shalah Szu-Po Wang Jonathan Ragan-Kelley Wojciech Matusik Computational Fabrication Group M I T 1
State of The Art of Multi-Material Fabrication 2
Multi-Material 3D Printers Object 260 Connex1Object 350 Connex3Object
Large Build Volume 4
Multi-Material 3D Printers 5
Large Material Library 6
7
High-Resolution: 600 DPI 8
Current Industry Use 9
One Material Per Part 10
Why One Material Per Part? Traditional constraints of manufacturing. Poor specification methods. Lack of scalable software architectures. Expensive hardware and materials Limited material library No material design tools 11
Related Work Multiple materials are supported by statistically assigning a single material to each mesh Various companies have created proprietary formats to support their specific equipment Current open-source effort (e.g. RepRap, target FDM printing processes. The recent AMF standard allows description of object composition and color. Colors and materials can be specified with little proceduralism, using simple expressions from voxel coordinates to material choices. These have limited power and no architecture has been proposed to efficiently implement it. 12
Functionally Graded Material (FGM) Functionally graded materials are heterogeneous materials whose material composition varies over the volume of a given object. Prior work describes the difficulty of modelling FGM objects, and proposes a variety of volumetric representations based of tetrahedra and voxels [Jackson 2000]. MIT’s three-dimensional printing group describes a system that defines the material composition by a composition function [Liu et al. 2004; Zhou et al. 2004]. 13
Improve Specification Methods Functional Specification Spec2Fab Direct Specification OpenFab 14
Software Architecture Challenges Large high-resolution prints comprise trillions of voxels. Giga voxels/inch 3, Tera voxels/foot 3 Continuous gradation between materials Reusable material definitions Resolution and printer independence 15
OpenFab First Programmable and Scalable Fabrication Pipeline 16
OpenFab Inspired by rendering pipelines Fixed stages and programmable stages Procedural surface and material definitions Resolution independence Streaming architecture Decouples material definition from geometry 17
Outline OpenFab programming model OpenFL and fablets Architecture Results 18
The OpenFab programming Model 19
The OpenFab Programming Model input tessellate surface stage voxelize volume stage dither output textures materials 20
Input input tessellate surface stage voxelize volume stage dither output textures materials 21
Fixed-Function Stages input tessellate surface stage voxelize volume stage dither output textures materials 22
Programmable Stages input tessellate surface stage voxelize volume stage dither output textures materials 23
External Resources input tessellate surface stage voxelize volume stage dither output textures materials 24
Output input tessellate surface stage voxelize volume stage dither output textures materials 25
input tessellate surface stage voxelize volume stage dither output Fab world, a scene graph-like description: Shapes (boundary representation) Shape priorities Fablets Resources Textures Materials 26
tessellate surface stage voxelize volume stage dither output input 27
tessellate surface stage voxelize volume stage dither output input 28
surface stage voxelize volume stage dither output input tessellate 29
surface stage voxelize volume stage dither output input tessellate 30
surface stage voxelize volume stage dither output input tessellate 31
surface stage voxelize volume stage dither output input tessellate 1 voxel 50% A 25% B 25% C 32
surface stage voxelize volume stage dither output input tessellate 4 voxels BC A A 33
surface stage voxelize volume stage dither output input tessellate 34
OpenFL and Fablets 35
Programmable Stages input tessellate surface stage voxelize volume stage dither output textures materials fablets 36
OpenFL: Domain Specific Language C/C++-like programming language Built-in vector, matrix, texture, material types Modest OO features Pointwise (kernel) programming model Includes a standard library of math functions Global queries Flexible toolset that supports many common material specification tasks. 37
OpenFL: Domain Specific Language When defining materials volumetrically, it is useful to be able to determine the distance of a given voxel to the nearest point on the surface. For example, when printing a textured object, we cannot simply assign colors to the outer layer of the surface. In order to achieve a particular color, reflectance, and scattering behavior, the printer needs to deposit a certain amount of layered material to achieve the desired appearance properties. 38
fablet MyFablet Material red, blue, { return double3(0,0,0); // no displacement } double3 voxelCenter) { MaterialComposition mc; const double layerThickness = 1; double dist = distance(); if (dist <= layerThickness) { mc.Set(red, 1); } else if (dist <= layerThickness * 2) { mc.Set(blue, 1); } else { mc.Set(Yellow,1); } return mc; } Volume Fablets: Global Quesries 39
40 front face back face result The Magic Postcard
fablet MagicPostcard { float2 border; float textureDepth, maxThickness; ImageTexture2D fg, bg; Material white, black; } const int CARD_FRONT = 0, CARD_BACK = 1; { SurfaceAttributes attr; float2 uv, int face; out float2 uvOut, out int faceOut; }) { // pass through attributes uvOut = uv; faceOut = face; if (face == CARD_BACK) { // back face float L = bg.Sample1(uv[0], uv[1], 0); float thickness; if (uv[0] 1 – border[0] || uv[1] 1 – border[1]) { thickness = maxThickness; } else { // material approximation: transmission // has quadratic falloff with thickness thickness = sqrt(1 – L) * maxThickness; } 41
return attr.n * thickness; } else { // no displacement on the front and sides return 0; } { VolumeAttributes float2 int face }) { MaterialComposition mc; if (face == CARD_FRONT && // front face abs(distance(attr.voxelCenter)) <= textureDepth) { // surface texture float L = fg.Sample1(uv[0], uv[1], 0); mc.Set(white, L); mc.Set(black, 1 – L); } else { // background/border mc.Set(white, 1); } return mc; } 42
Why DSL? Full control over programming model Analysis opportunities Optimizations Retargetting Sand-boxing 43
The OpenFab Architecture 44
Scalable Architecture Fast start-up Streaming Fixed memory 45
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 46
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 47
done quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab Build coarse octree On query, build second-level octree Evaluate surface stage of fablet Cache result in the LRU cache 48
done quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab Depth Buffer Object Volume Support 49
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 50
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 51
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 52
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 53
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 54
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 55
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 56
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 57
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 58
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 59
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 60
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 61
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 62
infer bounds coarse acceleration structures Precalculate support structures foreach slab find objects in slab quit priority sort foreach object tesselate object surface fablet stage voxelize object volume fablet stage dither output done 63
Results 64
3D Prints 65
Material Decoupling 66
Material Decoupling 67
Material Decoupling 68
Procedural Surfaces 69
Procedural Volumes 70
Shape Priorities 71
Performance 12 inches6 inches3 inches Models 9.32 secs / 6.63 secs / 249 mins (14.2B voxels) 4.44 secs / 1.75 secs / 33 mins (1.8B voxels) 3.18 secs / 0.48 secs / 5 mins (0.22B voxels) butterfly 7.80 secs / 6.99 secs / 417 mins (7.5B voxels) 2.70 secs / 1.89 secs / 56 mins (0.94B voxels) 1.26 secs / 0.46 secs / 7 mins (0.12B voxels) rhino (center) secs / secs / 187 mins (9.6B voxels) 2.99 secs / 1.25 secs / 25 mins (1.2B voxels) 2.44 secs / 0.70 secs / 4 mins (0.15B voxels) marble table 72 (time to first slice delivery / computation time per slice / total time) Total number of synthesized voxels
Conclusion First programmable pipeline for fabrication New programming model Domain specific language Scalable architecture 73
External Resources: links to the images used in the presentation 74 Slide 1: Slide 2: Object ion/Objet260%20Connex/objet260_connex_closed.ashx Object series/~/media/Image%20Gallery/objet350_connex_3d_printer.png Object ion/Objet1000/objet1000_closed_v03_low.ashx Slide 5:
Cont. 75 Slides 6,7: Slide 8: part-ever/ part-ever/ Slides 12: Slides 10, 26-33: openfab.mit.edu/pdf/OpenFabSIGGRAPH2013Slides.pdf Slides 34, 40-42, 49, 66-71: