Introduction
For this week, I initially planned to create marbles falling from a platform and landing on a magnetic field, where they would accumulate over time and collide with each other. At first, this idea seemed interesting to implement, but once I realized it was going to take more time than I originally planned, I had to scale down my ambition.
However, while trying to implement the original idea, I discovered an interesting behavior between three attractors. That’s when I decided to create the following sketch:
Note: You can interact by holding the left mouse button in the Canva.
The concept
As mentioned, the idea transitioned from a fun physics simulation with marbles and magnetic fields to a set of movers accumulating around randomly defined attractors.
There are 3 attractors in total, each with a random X and Y position determined by the width and range of the canvas. Additionally, the movers can collide with the borders of the scenario, and they also have friction as an extra feature.
Initially, the 3 attractors were fixed, as shown in the following full-screen sketch: Test #1 of Assignment #3. However, this setup was not dynamic enough, and the movers never collided with the borders of the screen. Therefore, it was necessary to make the attractors’ position constantly random.
As an additional note, the colors of each mover are defined by Perlin noise.
Highlight of the code I am proud of
One segment of code I am most proud of is the following:
This part of the code is found in the file sketch.js, inside the draw() function.
if (attractors[0].g > 0){ attractors[0].g -= 1; attractors[1].g += 1; } else if (attractors[1].g > 0){ attractors[1].g -= 1; attractors[2].g += 1; } else if (attractors[2].g > 0){ attractors[2].g -= 1; //Reset first value and the rest of positions of the attractors. } else { attractors[0].position.x = random(width); attractors[0].position.y = random(height); attractors[1].position.x = random(width); attractors[1].position.y = random(height); attractors[2].position.x = random(width); attractors[2].position.y = random(height); attractors[0].g = 70; attractors[2].g = 0; } }
What this process does is, depending on the movers’ positions, increase the universal gravitational constant (G) of the next attractor while decreasing that of the current one, creating a smooth transition between attractors. When the final attractor is reached and its gravitational constant is reduced to 0, the process restarts by randomly assigning new positions to each attractor and redefining their gravitational constants to prevent any issues.
Reflection and ideas for future improvements
I initially thought it would take me more time to grasp the concepts. While there are interesting patterns I would love to create in the future with the movers and attractors, for now, I am glad I am understanding the concepts presented in class, which allows me to experiment with them. That said, here are some improvements I would like to explore in the future:
-
-
- Experiment with parallel attractors and movers. In other words, have two sets of attractors and movers that can interact with each other, instead of a single group of movers interacting with two attractors at a time.
- Use the collisions and gravity more creatively to add complexity to the designs.
- Add more user interaction to manipulate the canvas, along with clear visual cues.
-
References
Most of the code that I used as a guide is from the following video (which is also provided in the weekly schedule): Mutual Attraction by The Coding Train