We recently returned from Hawaii where we spent a week exploring Hawai’i Volcanoes National Park. The Big Island of Hawaii is made up of 5 shield volcanoes and was born a relatively recent 300,000 years ago. Today, three of the volcanoes (Kileaua, Mauna Loa, Hualalai) are still active, one is dormant (Mauna Kea), and one is extinct (Kohala). Kileaua is one of the world’s most active volcanoes and has been erupting continuously since January 3, 1983. We visited its active vent to see the flow of red hot lava and we hiked many miles in the lava fields formed by its prior eruptions. As you might have predicted, we found the fluid-like lava rock fascinating and documented its shapes in hundreds of photographs (slideshow below and flickr set). We also started reading about how and why patterns form in lava flows.
Lava is the molten rock expelled by a volcano during an eruption. Lava flows can have very different properties based on their chemical composition, temperature, eruption rate, crystal content, and bubble content. The current lava flow in Hawaii is an effusive flow of basalt with low viscosity and high temperature. It flows quickly and smoothly, leaving glassy rippled rock in its wake. Geologists call this type of flow pahoehoe, a Hawaiian name that equates the lava forms to swirling water (“hoe” = to paddle). This is an apt name as the lava rock is festooned with incredible patterns of contorted wrinkles, ripples, and folds. What causes these forms?
Lava Flows and Folds
When lava flows, the outside layer quickly cools forming an exterior crust. In fact, many of the lava patterns we found were quite thin and hollow inside where the lava had subsequently evacuated after the structures were formed. This cooled layer is significantly more viscous than the lava below acting like a viscous sheet. Folds begin to form when the flow compresses due to the slowing of the flow front. This compression could be caused by hitting an obstruction or entering a narrow channel. These folds form in the span of seconds to minutes.
The folding of viscous or elastoviscous materials has been widely studied recently both in physical experiments with non-Newtonian fluids and numerical simulations. Pahoehoe lava forms exhibit relatively regular fold properties; their folds form perpendicular to the direction of flow with a consistent wavelength and amplitude. This property is shown very purely in examples of viscous sheets. Check out the videos below. One shows the buckling of pancake batter being poured into a pan (not kidding) and the other is a computer animation of similar from a paper presented at SIGGRAPH 2012.
Pahoehoe flows exhibit significantly more complex dynamics than these isolated examples, incorporating viscoplastic behavior, cooling, shallow flow, and more with the folding process. Lava flow is not strictly a viscous sheet; it is a fluid with a layer of high viscosity that smoothly transitions to a large volume of lower viscosity fluid. This means that the lava exhibits fluid behavior generating interesting swirls and movement. You can even get lava spirals when multiple flows meet. Additionally, as the lava cools and compresses, the viscous crust thickens. Thickening increases the wavelength of the folds that form creating a larger scale pattern. This change in scale can occur 2-4 times over the cooling process, leading to recursive folds with a complex braided appearance.
diagram from 'Formation of multiple fold generations on lava flow surfaces: influence of strain rate, cooling rate, and lava composition' (1998) by Gregg, TKP, Fink JH, Griffiths RW
This explanation comes from the research of Jonathan Fink who has published a number of papers exploring ropy pahoehoe since 1978. The first paper, “Ropy Pahoehoe: surface folding of a viscous fluid”, describes how he measured the profiles of lava flows using this sweet apparatus.
In later papers, he uses experiments where liquid polyethylene glycol wax is forced through a hole into a tank of cold water to recreate different phenomena exhibited by lava flows. By varying the rate of cooling and the flow rate, he was able to produce features we see in basaltic lava flows including transverse folds, pillows, rifts and levees.
diagram from 'A laboratory analogy study of the surface morphology of lava flows extruded from point and line sources' (1992)
Other Interesting Stuff We Noticed About Lava
The varying degrees of oxidation and chemical composition lead to different colors.
Lava is very porous. It’s riddled with tiny vesicles where it hardened around gas bubbles.
You can poke a walking stick into the active lava flow and create your own glassy hunk of fresh rock.
Lava can form very regular features like these tiny folds.
But, it also can make bizaare features that look more like draped fabric than rock.
Pahoehoe makes forms called “toes” as hot lava breaks out from the cooling front and “entrails” when it moves quickly down a slope.
Lava just keeps piling up
And will flow over anything
Batty et al, “Discrete Viscous Sheets”, 2012
Fink, “Surface folding and viscosity of rhyolite flows”, 1980
Fink and Fletcher, “Ropy pahoehoe: surface folding of a viscous fluid”, 1977
Fink and Griffiths, “A laboratory analog study of the surface morphology of lava flows extruded from point and line sources”, 1992
Gregg et al, “Formation of multiple fold generations on lava flow surfaces: Influence of strain rate, cooling rate, and lava composition”, 1998
Griffiths, “The dynamics of lava flows”, 2000
Skorobogatiy and Mahadevan, “Folding of viscous sheets and ﬁlaments”, 2000
I really, really like LEDs. I’ve spent countless hours building LED controllers, programming them, and incorporating them into my projects. So, naturally, I’ll jump at the opportunity to integrate LEDs into almost anything. Such an opportunity came up when Jesse and Jessica were invited to an innovation event by Nooka and were asked to bring a piece with them. We wanted our piece to be both representative of our normal work, but also a bit more dynamic and eye-catching. So we did the obvious thing: take one of our previously 3d printed pieces, and add some LEDs to it:
The implementation was rather simple. We used 3 Watt ultrabright LEDs with a MOSFET to control them (‘CTRL’ in the schematic) and a series resistor to regulate the current.
The control signal was created with a Leaflabs Maple microcontroller (we used this instead of an Arduino because it has 16-bit PWM outputs rather than Arduino’s 8-bit PWM, meaning that the lights fade much more smoothly), and we programmed about a half-dozen different patterns into the box. The final result:
One of my side projects has been to improve on the LED circuit we used for this project to make a cheap and durable yet multipurpose driver for lighting up our projects. The goal is for it to be powerful enough to drive ultrabright LEDs for lighting up display pieces, yet easily modified to light up smaller pieces (perhaps even jewelry!). My current design is a simple analog circuit that serves as a constant current source:
Why all of the additional parts over the first circuit? Superbright LEDs (like those that we used in The Cave) dissipate quite a bit of heat — and this dissipated heat can be enough to damage the LED itself and shorten its lifespan. Even worse, heating of the resistor lowers its resistance, allowing more current flow, creating a positive feedback loop where the circuit just gets hotter and hotter. Not good at all! The solution shown uses a pair of transistors to switch the LEDs on and off (Q1) and stabilize the current with negative feedback (Q2). The current is entirely determined by R2, so by swapping out one component the board can accomodate virtually any LED we’d like to drive. The best part is the low cost — while dedicated LED driver circuits can cost upwards of $3 per chip, this design costs less than $0.25.
The next iteration of the surface meshing algorithm from the previous post is surface remeshing. Surface meshing is the process of taking an existing mesh and generating a new mesh of the same surface. This can be useful in many scenarios — for example, we’re using a 3D modeling program to design a surface that we want to use in a simulation. Unfortunately, the mesh that the modeling software creates isn’t designed for simulation. It might have very big triangles, triangles with distorted shapes, way too many triangles, or other problems. You know, triangle problems. Surface meshing allows us to generate a new surface of roughly the same shape but with a uniform density of points and consistent elements.
The procedure is fairly straight forward:
Begin with an existing mesh.
Generate evenly spaced points on that surface. We do this by generating random points on the surface and discarding any that lie within a certain distance of a point that has already been added. We accelerate this process with a simple spatial partitioning data structure.
Run the Ball Pivot Algorithm on that set of points. The points have no connection to the original surface once they are generated.
You can play with an initial implementation here. Warning: this is very buggy and likely to crash, generate meshes with holes, or create fairly ugly meshes, depending on the settings.
Let’s start with the basic idea of triangulation in 2D. A triangulation of a set of points is just a set of triangles that covers all those points and don’t overlap.
Now not all triangulations are created equal. We want to make triangulations whose triangles are nicely shaped, as close to equilateral as possible. This leads to better numerical stability and convergence in simulations.
This leads to something called the Delaunay triangulation. This is a really neat triangulation defined such that circumcircle of any triangle in the triangulation does not contain any other points. The circumcircle is the smallest circle enclosing the triangle. One thing that’s not entirely obvious is that this triangulation always exists. And the thing that is great about this triangulation is that it maximizes the minimum angle of the triangles. This means it gives us the best shaped triangles we can get with the points we have.
The problem comes when we make the jump from 2D to 3D. We can generalize the idea of Delaunay triangulations to 3D, giving us tetrahedron instead of triangles and circumspheres instead of circumcircles. However, what we want is surface of triangles embedded in 3-space, not a 3 dimensional solid. One way to get around this is called alpha shapes. This is a subset of the 3D Delaunay triangulation but only including faces of a certain size. Alpha shapes can create good surface triangulations; however, it is necessary to compute the full 3D Delaunay, which is complex in computation and implementation as well as numerically unstable.
So in comes the Ball-Pivot algorithm. This algorithm is nice because it works in linear time for points of a constant density, and it is exceptionally cute conceptually. The idea is you have a ball of a certain radius sitting in a triangle. This ball rolls over the edge of the triangle and keeps rolling until it hits another point. Then, that edge and the point it hits make a new triangle which is added to the triangulation, and the ball rolls over a new edge. If you start with a good triangle, such that the ball contains no other points, then the new triangle the ball rolls onto won’t contain any other points either because any point would have been hit before hand. This maintains the Delaunay property! In fact, the ball pivot algorithm produces a subset of an alpha shape.
There are a few caveats. If the curvature and density of the surface points is too high, a larger ball won’t be able to fit in the necessary crevices, missing some points. If the ball is too small, it can fall through large triangles and leave holes. While these issues can worked around, the ball pivot algorithm works best for surfaces with a consistent density of points.
Feel free to look at the code inside, but it is not optimized and not pretty. This was thrown together in 2-3 days, so it definitely lacks polish.
People have been making lots of cool designs with the Radiolaria app since we launched last month. And, we’ve been having fun with it too! We are releasing three limited edition designs that we created with Radiolaria. We have 10 pieces in stock for each design. Do you like one of these but want something a little different? You can edit the design in the Radiolaria app, customizing to your liking. Change the size, materials, add a twist, or make a more dramatic change; our design is just the start.
This week I revamped the automatic post-processing of puzzle files. Previously, there was a lot of manual work that had to be done to the file before they were ready to be laser cut. Now, I’ve reduced a lot of that labor and also made it so that the puzzle pieces will be generated with much more consistent details and nubs.
There are a number of problems that have to be found and fixed by hand. Many of these issues occur around whimsies. Some pieces are generated too small to be a usable piece. Other times pieces get merged during the simulation. This occurs when two pieces which have the same phase grow into each other during the simulation. This can occur because the simulation employs an optimization of only having 5 phases rather than each piece being its own phase. Some areas are just too thin.
Fixing occurs in two stages. The first part occurs in pixels space before the boundaries have been extracted. This part hasn’t changed. The second stage works in vector space, once everything is represented as polylines. To get from the first stage to the second stage we used a modified marching squares algorithm.
What makes the fixing tricky is that conditions that define what needs to be fixed and how are highly non-local. I cannot simply say nothing can be under X thickness. The more material a connection holds, the thicker it needs to be. Thin areas between two merged pieces need to be split, not thickened. Even thickness is a bit tricky to calculate. Additionally, there can be conflicts where thickening one area makes another too thin.
To explain the fixing procedure in detail, I’ll start at the beginning with the creation of the vector representation. The pixel representation is turned into vectors with a generalized marching squares algorithm that allows for an arbitrary number of states. During this process each point only knows which points it is connected to. There is no notion of pieces having any continuity.
To compute the thickness of each point, I find the distance to the nearest non-degenerate point. I don’t bother to be concerned with distance to a line segment because the curves are so dense. By non-degenerate point, I mean that points that are directly next to another should not be considered for thickness computation. So for each point I compute a local neighborhood that extends out a certain distance using a depth first search of the neighbors. The points in this neighborhood are considered degenerate.
Minimum thickness computation
To compute how thick a connection needs to be, we need to know how much material it supports. This is estimated by the linear distance along the piece from one end of the connection to the other, rather than trying to compute the actual area. We could compute this distance with a breathe first search, but that would be expensive O(n^2).
Instead, we note that two nearest points must lie within the same piece. This way if we extract each puzzle piece and label each point in the piece with the distance along it starting at an arbitrary point, we can do a simple calculation to get the distance between any two points. It is constant time.
Extracting the pieces themselves isn’t entirely trivial. This equates to finding all minimum cycles in a graph. However, we have a clue that makes this a bit easier. Each point knows the colors of the pixels that is was generated in between, and we can tag them with this information. Because of this if you trace along an arbitrary point’s neighbors that all have the same color, you get a piece. This creates a simple linear time procedure for extracting all pieces.
The thin regions are thickened by simply moving a point away from the nearest point, such that it is the minimum distance calculated from the material supported. All points in the local neighborhood of moved point are then marked.
It should be noted that special consideration needs to be paid to boundary pieces, which need to treat the edge of the puzzle slightly differently.
All points that have been marked by the thickening process are then smoothed with a Laplacian smoothing procedure. This alleviates any strange geometry that might arise from movement.
These processes of marking, thickening, and smoothing are repeated in a relaxation procedure that resolving conflicting situations when thickening one area overly thins another.
Small and merged pieces
All of these procedures only deal with thin regions. So far, there are no automatic fixes for small and merged pieces. Instead these are marked on export for manual fixing. Merged pieces are heuristically identified simply by their size, which can lead to false positives, but that is easily distinguished by a manual operator. With the pieces already extracted, marking small are large pieces is trivial.
Here are the resulting files. The two marked “extract and mark” are identical and show the output of marking the pieces before they are fixed. Click on them for a larger view.
A while ago there was a pretty great XKCD which gave semi-technical descriptions of the Saturn V rocket using only the 1,000 (or “ten hundred”) most commonly written English words: Up-Goer Five
see the rest at xkcd.com
Jessica and Nathan challenged me to describe what we do at Nervous System using a similarly restricted vocabulary. I feel like I’ve had some practice lately trying to tell people what, exactly, we do here. They don’t realize that asking me about my new job is a trap… twenty minutes later their eyes are glazing over as I keep trying to make them understand how exciting generative design is. So this was good for me. You know, keeping it simple:
The name of our business is “THE BODY PARTS THAT WORK TOGETHER TO LET YOU THINK AND CONTROL EVERYTHING ELSE IN YOUR BODY.”
We use numbers and computers to make computer-world things that look like things you can find in the real world. We make things for your body, your house and your mind. Some of the things we make are quite small, and some are bigger than your head!
The things we make in the computer world would be very hard to draw or form with your hands — at the very least, it would take you a long time. But computers are faster than people, so we ask them to grow things for us. Our numbers tell them how to grow the things, and we make them grow within the lines we set.
Once the computer-world things are ready, we ask our business friends (and not-so-friends, sometimes) to turn the computer-world things into real-world things. We buy the real-world things from our business friends, and then other people buy them from us for more money. Some people buy our things in a real store, other people buy them at our computer-world store on the world-wide-computer-street. People from all over the world buy our fun things, so we keep making more.
If you want to make sure I didn’t cheat, or if you maybe just want to write something of your own using only the “ten hundred most used words,” here’s a link to The Up-Goer Five Text Editor by Theo Sanderson.
You’re obsessed with 3d-printing. We’re obsessed with 3d-printing. Let’s get together. Come talk about 3d-printing technologies, applications, materials, software and future developments! Feel free to bring things including: stuff you’ve made with a 3d-printer, a 3d-printer you’ve made, juicy 3d-printing gossip, and snacks (3d-printed snacks will receive special appreciation).
The event is part of the Boston 3d-printing meetup series organized by our friends at Figulo (an amazing Boston-based ceramic 3d-printing company). It starts at 6:30pm and will run until 8pm at 561 Windsor St, Suite A206 (same building as Taza Chocolate) in Somerville, MA. Parking is available.
We’re starting a new tradition at Nervous System of sharing the work we do each week. Although the timing may be suspect, this is not a new years resolution, just something we happened to think of while on holiday. Here’s a summary of week 1.
Jesse has begun working on a new design system based on models of differential growth. Currently, it’s just at the phase of initial implementation and conceptualization.
Nathan added a search box on our website with autocomplete, so you can more easily find what you are looking for. Or you can look for everything that comes in black and is 3D-printed.
Jessica is playing with our old barnacle sketch in new ways. She’s looking into making some neat organic animations and colored 3D prints.
Aaron has created a new email address for organizing all the supplies and manufacturers we work with.
The Holidays can get pretty hectic so we’ve put together some important information about last chance shipping dates and extensions to our return policy. In order to get your Nervous System purchase by December 24th, please order by these dates.
US Orders for arrival by December 24th
First-Class Mail: December 18th Priority Mail: December 19st Express Mail: December 20nd
International Orders for arrival by December 24th
Priority Mail International: December 10th Express Mail International: December 15th. First Class International: Can take up to 6 weeks – please DO NOT select first class international if you would like to receive your item in time for the Christmas Holiday.
We are extending our return policy to accommodate holiday orders, please read carefully: Any orders placed between November 23rd and December 31st are eligible for return until January 18th. Please note that as always we will only accept items unworn, unused and in original packaging. For speedy return/exchange processing PLEASE include the original packing slip/invoice or receipt with any packages sent back to us.
Additionally, we will not begin processing returns until January 3rd. Any questions regarding ordering, order status, shipping or returns/exchanges should be sent to firstname.lastname@example.org. Orders that fall outside of these dates must adhere to our standard two week return policy.