The Call of Nature
A generative animation that explores the human/nature/computation boundaries by creating an artistic impression of an underwater marine ecosystem. Its purpose is to intrigue and educate.
produced by: Chris Courage
Our lives have changed dramatically over the past 12 months and one aspect of that change has been travel. Whether that travel is local or international we have not been able to freely enjoy different environments, urban or natural, from our own. This project investigates the boundaries between human/nature/computation to find new ways of exploring environments digitally.
Concept and background research
More people than ever have been inspired to go outdoors (locally) and explore their urban and natural spaces which has had a positive effect. On the other hand, not everyone lives in close proximity to a safe area, park or green space and it is widely known that nature contributes to a healthy body and mind. The charity mind suggests “spending time in green space or bringing nature into your everyday life can benefit both your mental and physical wellbeing. For example, doing things like growing food or flowers, exercising outdoors or being around animals can have lots of positive effects (Mind, 2021).
As well as good health, we can learn a lot from different environments: improving our knowledge of the world. Therefore, it is detrimental to us that we are not able to freely explore the world as we once did.
What can immersive generative art do to answer the ‘Call of Nature’ during these times?
Generative art can transport us to places and visually stimulate our senses into believing we are in a different environment even though we maybe in our own homes. Virtual reality is considered as the most advanced form of human-computer interaction by neuroscientists. The feeling of “being there” can offer a dynamic and social world where by one can live and share experiences (Riva and Serino, 2020). The notion of generative environments as a tool to improve the mental health and educate humans is promising.
This project is an exploration of generative environments by experimenting with code. Replicating natural features and ecosystems of our natural world is one thing but making them exist in virtual reality with a sense of agency is another. The purpose is to develop generative environments and invoke change in human habits to improve life all round.
The project was based on a brief to create a projection-mapped generative art piece. We had to use the fundamental techniques of creative coding through Open Frameworks, a C++ derived library for creative coders.
The idea for the project was to create an animation of an underwater environment. Also, the animation had to contain fundamental programming: for loops, sin/noise, if-statements, vectors/arrays/deque, functions. These functions will control, manipulate and change the visual elements of the program during a 3-minute interval.
The multiple elements would ultimately be combined, choreographed and projected on to the surfaces of predetermined shapes.
The scene sketches were broken down into their individual elements. Like a recipe, each element required a method of defined instructions, such as the ones mentioned above, for it to be an instance on the screen. Each instance would have certain characteristics that would define its presence.
The elements required for this particular environment were:
Required characteristics each element would need:
Bubbles; random placement, floating motion and surface expansion/burst and singular/multiple instances.
Fish: random placement, fish swim movement and singular/multiple instances.
Coral: random placement, swaying movements as suspended in water and skeletal structure.
Reef structure: solid object, terrain like appearance.
Projection shapes - 3 rectangular boxes.
for loops, sin/noise, if-statements, vectors/arrays/deque, functions.
Underwater movement - Requires smooth sine wave-based movement.
Projection shapes – Consider bubble pops, fish turns at edges. Conditional statements
Create multiple instances – Multiple bubbles, fish and coral. Complex system programming
Object orientated programming
The animation was going to use multiple instances and the approach required is a concept of objects that contain data and code, OOP (object orientated programming). These objects have unique attributes and behaviours which are derived from sequences of logic and functions known as methods. The benefit of OOP for this project is scalability; allowing for multiple instances on the screen that have uniqueness. This uniqueness is what makes the animation realistic and believable. Every element on the screen was created in this way.
Basing the animation on this concept, OOP was developed by studying examples from Dan Buzzo, The coding train and Pereira’s example in the ofBook.
Once each element had been iteratively developed, tested and debugged the next stage would be to combine each program into one projection sketch. The projection program is a collection of sources to be projected using an addon known as Pimapper. The elements are converted to source programs for the projection. The challenge of timing the sources is possible using functions that operate from time such as modulo, sine and custom functions. One example of a custom function this project developed was to count the fishes laps. Once a certain condition was met some parameters changed, altering the animation and keeping the viewers’ attention.
The programming sketches were choreographed by a combination of time based and positional values. For example, the fish move across the screen and their direction and orientational properties are dependent on their position. In contrast, the decision of the fish to turn or not is based on time. They continuously turn for a set time then a different movement sequence is initiated.
With a variety of sources, it was possible to create seven scenes that would narrate the story of the marine ecosystems. Firstly, these scenes would be tested on an image and the projection surfaces mapped on the computer screen. Further development of animations was needed once the surfaces were mapped. This was due to the synthesis of projection surface and animation. An example of this was one source mapped across four surfaces
The final challenge was to physically project the animation onto three cubes. However, it was frustrating to once again remap the seven scenes onto the physical surfaces. A better solution was to map one surface onto the cube and clone.
Finally, it is worth mentioning that developing the animation was an iterative process and development continued throughout all the processes. As the projection develops so will the understanding and execution of the piece.
A future vision of this project is to have it interact with an audience in a live installation. As well as interactivity, the marine environment could be mapped to gps locations that creates a location specific animation.
A library of marine life, flora and fauna could be created and used in the animation to create a more realistic experience.
The animation started out as a simple idea that used basic 2d primitives and arbitrary shapes to create the marine objects. These worked well as they were easy to position and animate. Creating the fish shapes was done using a separate program to trace the outline of an illustration and this was an efficient way to create a realistic form of a fish.
Movement in the fish and coral was created by using sine and position, this gave realistic motion to the objects. Furthermore, sine was used to create the colour effect of the fish as they move. This worked to create an illusion of movement.
The box shapes worked in framing the animation and created interaction between the fish and the box edges as well as the bubbles bursting at the surface.
Some difficulties I experienced were: Stretching the resolution across multiple surfaces, this caused distortion and a zooming effect. The fish shape was made from points and this resulted in an uneven contour. The program became complex due to creating many instances of the objects because I was trying to create variety. Finally, having many different sources meant extra work needed to map them. Especially as some were mapped across multiple surfaces.
Overall, the animation was more than I had originally planned, this was due to learning and creating a complex programming system by using object-oriented programming. This meant I was able to create multiple instances of objects. Also, the process of developing literacy in more complex programming meant I was able to specifically search for functions and find results quicker than before.
For future assignments I acknowledge that I need to plan the project more thoroughly. Defining objects and their specifics by sketching or diagrams would help the programming workflow. When the programming system becomes complex it is easy to lose track.
I would also say that more research into similar programs/sketches would have helped me to develop solutions for some of the algorithmic thinking.
In conclusion, the animation was a success in creating a realistic impression of an underwater marine environment. The idea was to push my programming skills and create something I was not familiar with, character animation and programming. The program development helped initiate my understanding of complex program systems and how to construct an animation within a creative coding application such as openframe works.
Courage, C. (2020). openFrameworks forum [online]. Available from: https://forum.openframeworks.cc/t/constructors-and-objects/36785/15 [Accessed 14 December2020].
Dan Buzzo (2019). openFrameworks creative coding: Using classes in C++ [Film]. Available from: https://www.youtube.com/watch?v=zpRwKivA7GY&t=832s [Accessed 18 December 2020].
Pereira, R. (n.d.). ofBook - Ooops! = Object Oriented Programming + Classes [online]. Available from: https://openframeworks.cc/ofBook/chapters/OOPs!.html [Accessed 7 December 2020].
Riva, G. and Serino, S. (2020). Virtual Reality in the Assessment, Understanding and Treatment of Mental Health Disorders. Journal of Clinical Medicine. MDPI. Vol. 9 No. 11 [online]. https://doi.org/10.3390/jcm9113434.
Rouse, M. (2021). What is object-oriented programming (OOP)? [online]. Available from: https://searchapparchitecture.techtarget.com/definition/object-oriented-programming-OOP [Accessed 14 January 2021].
The Coding Train (2019). Coding Challenge #136.2: Perlin Noise GIF Loops [Film]. Available from: https://www.youtube.com/watch?v=c6K-wJQ77yQ&t=920s
W3schools (2021). C++ Classes and Objects [online]. Available from: https://www.w3schools.com/cpp/cpp_classes.asp [Accessed 19 December 2020].