Flow is a projection mapping piece, inspired by the motion of water and the idea of complex movement. The dynamic patterns in this piece is inviting to the audience through its calming visuals. It draws people in and asks them to enter a meditative trance and focus solely on itself. Another key aspect of the piece is the notion of complexity. If the piece was comprised of a single particle, the visuals may be considered far from remarkable. However having multiple entities, all following simple paths, creates diverse and unique patterns. One of the properties relating to the complexity built within Flow is each time it is run it will be unique, this is due to how it has been programmed. While the overall image will be the same, attentive viewers would be able to notice the dynamic aspects of this piece. Notably the way in which the particles move, and how quickly the sides fill up. The piece consists three acts. Firstly the setup, the particles appear on the surface, pulsating in static positions, this calls attention to the physical object which draws the audience in. The second act is the main “dance” of particles. Each pool has its own rules which the particles abide by, creating three unique “dances” occurring simultaneously. Finally the cool down draws all the particles to the centre of the pool and forces them to sink down into the darkness. This is the finale to the piece and it can smoothly transition back to the beginning.
Image 1: physical artefact to be mapped
Image 2: using ofxPiMapper to map the artefact
While the piece may seem simple the underlying code required some logistical thinking and technical discovery. Behind the scenes flow fields are used to dynamically influence the particles’ movements. Flow fields are a grid of vectors that can be used to determine an object’s movement by influencing its steering trajectory. These flow fields are initialised using sin and cosine to create circular movements in the particle systems, further enforcing the idea of flowing pools of particles. The flow field is re-initialised every 5-15 seconds, depending on which colour it is. The re-initialisation means the particles follow new paths and a new shape is formed on the surface of the cube. The sides required a simpler approach. These particles fall down the sides and when they reach the bottom they start to accumulate. The result is a pool filling up the side as the piece advances. To save spawning and controlling 1000’s of droplet particles the system only initialises 20 or so particles which are recycled when they leave the buffer. When they do leave the buffer they add to a variable which controls the height of the rising pool. This creates the illusion of the droplets filling up the pool while keeping the computational processes to a minimum.
Many technical considerations had to be made for the piece to function properly on the physical artefact. The first was the size and shape of the flow fields. If the fields were too big then the effect would not be noticeable and if they were too small then you would only fill a portion of the surface. Also the values to initialise had to be carefully selected, as some values caused particles to become stuck in certain areas. Another key consideration was the height of the cubes, this only impacted the sides. The initial sketches were designed for a single cube height (40cm), so when I stacked three cubes I had to compensate for that in the code.
My main reference for this work was Dan Shiffman’s work on physic engines and steering behaviours, see references for links. Most of the physics engine was based on his Processing sketches that cover flow fields and particle systems. A lot of Shiffman’s work, on this topic, can be credited to Craig Reynolds research in simulating steering behaviours. While both Reynold’s and Shiffman laid down the foundations of this project, I have added my own alterations to make their code more suitable for this project.
The Coding Train, 6.4: Steering Behaviors: Flow Field Following - The Nature of Code, https://youtu.be/XXEK3UEDDIg
The Coding Train, 6.3: Steering Behaviors: Arrive - The Nature of Code, https://youtu.be/2CL1maXeQCI
Craig Reynolds, Steering Behaviors For Autonomous Characters, http://www.red3d.com/cwr/steer/