On June 5th, 2012, I spoke at Eyeo Festival 2012 in Minneapolis. For the talk, I created 12 new projects.
The theme present in all of the projects was the Cornell Box. I wanted to try something different from my usual way of doing things. Usually I focus on the content and neglect the environment so all of my work usually floats in an infinite black or white void. This time, I would create an environment in which to stage my experiments and go from there. This environment, or setting, should be simple. Something I know I could do well as opposed to something more complex like a full terrain engine which I might be able to pull off but it would be sloppy at best.
I created a room. A simple grey box with a full ceiling light panel. In this room, I can control the lighting, gravity, and playback speed of time (allowing me to speed up the simulations or even make time freeze). The camera in the room can be moved around to offer different views of the content which would come later. My goal was to make the room as fully featured as I required without it getting to overloaded with excess code. From there, I would begin building out some content all based on the themes of particle physics, cosmology and collective behavior.
The first project in the series is an artistic interpretation of the Big Bang. I wasn't sure how best to approach this project and there were a few false starts. I eventually decided to stop taking myself so seriously and to try something more abstracted from what my mind wanted to picture. I ended up going with the ultimate surprise party. You turn on the lights to the room and the center explodes with party balloons, confetti and streamers, to the audio of people yelling "YAY" and applauding the ultimate beginning of everything.
The question I was asked most often after my talk is how I got my balloons so shiny. One of the benefits of putting the content in a box is I can easily make a cube map that looks like the room and apply it to the objects in the room. This way, the balloons have a realistic environmental reflection that looks like ray tracing (though the reflection of other balloons is noticeably absent).
This was actually the first project I started working on in this series. I had recently been reading about how physicists are still uncertain why there was an imbalance of matter and antimatter when the universe was formed. Scientists believe that for every 1,000,000,000 particles of antimatter, there existed 1,000,000,001 particles of matter. And this extra 1 part per billion of matter is what makes up everything in the universe: every star, every planet, every life-form and every mote of dust (to borrow a favorite phrase from Sagan). Some believe the dark matter or dark energy might be the signs of the presence of antimatter but I think this is considered to be most likely incorrect. With this project, you put a quantity of matter and antimatter in the same room and see what happens. The results is somewhere between cute and violent.
This is a companion piece to Matter. In this version, the reaction is shown in macro-scale with one of each type of particle. Once you turn out the lights, the antimatter begins to reach out towards the matter. Whenever the antimatter 'tentacles' touch the dense spherical surface of the matter particle, there is a spark and tiny compression wave. If the core of the antimatter touches the matter, they annihilate each other and the simulation resets. I am drawn to visualizing these incredibly small particles because they cant really be described in terms of what they might look like. They are smaller than the wavelengths of light required to view them so any representation would be subjective. I prefer to think of my antimatter as being overly needy.
My first exposure to the aesthetic possibilites of physics was when I saw my first images from experiments conducted in bubble chambers. I loved those beautifully etched spirals. This project brings that experience into the Room. As particles shower through the space, they have a chance of experiencing a collision with another particle or (imaginary) particles of dust. Because I am impatient, I added the ability to put a bunch of moths into the space in order to facilitate collision events. When a particle hits a moth, it shatters into component particles which go spiraling off until they meet a wall or wink out of existence.
This is a variation of a project I made a couple years ago called Addition/Subtraction. It is an attempt to show how the presence of forces can warp the space around it. This warping is made visible by the trails of particles as they move through the space.
I am highly disturbed by the phenomenon of the ant death spiral, or ant mill. I have not witnessed one so I tried to make it happen through simulation. I created a system where ants move around in search for food while leaving behind pheromone trails to help them find their way home. The hope was that eventually a group of ants would get cut off from the main trail and form this death spiral. Due to the relatively small size of the room, and a lack of simulated flash floods or other disasters, no such death spirals appeared. However, it was a great exercise in trying to simulate the behavior of ants which I had not attempted before. Eventually, I got so annoyed with the behavior of these simulated ants, I decided to surprise them with a piece of Anti-Food. And we already know what happens when Food and Anti-food collide...
I recently decided to tackle how to introduce shockwaves into my work. I was used to thinking of an explosion as an incredibly short event. When the explosion happens, you spawn a bunch of smoke or fire or spark particles and that is it. With a shockwave, the explosion needs to stick around for a while. So I created a shockwave class which has a position, radius and intensity. As the radius increases the intensity decreases. As the shockwave expands, all objects check their distance to the shockwave center. If that distance is close to the radius of the shockwave, you push the object away from the shockwave center and the strength of that push is related to the intensity. Once the intensity becomes negligible, you remove the shockwave.
I have been working with flocking simulations for a while. This version is the next iteration in my tutorial on how to do particle flocking in Cinder. This version pushes the flocking logic to the GPU which allows you to get away with 4x as many particles in realtime. I also added some glowing bait spheres which attract the flocking particles forcing them into natural looking vortices. They also have to avoid the predators who are forever hunting.
This piece is a bit of a mystery for me. My experience with GPU-based physics calculations is still very much in its infancy. All I wanted from this project was do basic sphere-sphere collision and response but have all the math done on the graphics card. I thought I knew what I was doing but when I finally ran the project, I realized quickly that I had a bug. The particles would clump together then they would inexplicably form these tendrils that reached out into space and whirled and stretched and though I tried to figure out why it behaved this way, I eventually abandoned trying to find the bug because the behavior was so novel. It almost felt like I had accidentally created a life-form.
I created a reaction diffusion piece a couple years ago that used wind as a parameter. The result was something that looked like dune migration. I based this project on that original reaction diffusion calculation and turned it into a 3D terrain. The sphere in the scene helps to facilitate the creation of these dunes and its position also dictates which way the wind blows. The results are quite organic and look very much like dune patterns you would see in large deserts.
I was recently asked how I made the stars in the Planetary app I created with Bloom. This project is a tutorial that shows the steps for creating energetic balls of light. I break it down into 7 steps and use the result to show the scale of some stars in our galaxy.
I downloaded a database of 116,166 of the closest and brightest stars to our sun. After plotting these points in space, I created a system where I could look at any star from any other star. The initial inspiration was based on wondering what the night sky would look like from Gliese 581g, the first exoplanet thought to be a candidate for supporting Earth-like life.
One of the reasons I decided to make all these smaller pieces is because I had been working on a larger project that really started to get away from me. I was so busy adding in visual extras, the whole code base became quite confusing to me which made it much harder to fix the foundational issues regarding the physics and collision detection. These smaller projects were a way for me to better understand the individual pieces that I wanted to work together in the final project. Below is the work in progress video I showed at the conclusion of my talk at Eyeo. I plan on rebuilding it from scratch while paying special attention to the foundation so I can hopefully avoid similar issues as the project continues to grow.
Audio by Hilmar Örn Hilmarsson and Sigur Ros.
• All of these projects were made with the C++ framework Cinder which I work on with Andrew Bell, Hai Nguyen and Steven Schieberl.
• I have released the source code for all of these projects (except for Collider which needs a solid overhaul). Github.
• With a couple exceptions, these projects run at 60fps on my Macbook Pro.
• I used Screenium to capture videos of these demos running in realtime (except for Forces and Collider, which both are realtime projects but need optimization). Screenium is pretty great but there are still some dropped frames. I went with Screenium instead of rendering out a videos because most of these projects also have an audio component.
• I used FMOD for the audio. This was my first attempt at doing audio playback of sound effects I either created, or downloaded from Freesound.org. Special thanks to freesound users HerbertBoland, pushToBreak, totya, halion, and smokeyvw.