Concept
For this project, I decided to go for the Generative Text option, because I felt that way I could get some experience both with manipulating text and implementing csv files as well. I really wanted to use particle systems to generate text and do some fun stuff with them so I went ahead and explored a little on how to implement a particle system in p5.js and use it to generate text.
Implementation
I started off by making a Particle class. This class essentially contains all the attributes that are related to the particles that are generated. For instance, it contains their velocity, acceleration, maximum speed, and whether they have left the canvas yet or not, or in other words, if they are alive. I thought it would be a great idea to use vectors for this scenario since velocity and acceleration basically are defined by a magnitude and direction (which in essence is a vector). So I went ahead and made unit vectors for both of them.
// creating the class for the particles class Particle { // the x and y positions where the particle would appear constructor(x, y) { this.pos = createVector(x, y); this.vel = createVector(random(-1, 1), random(-1, 1)); // to include all directions (360 deg) this.acc = createVector(random(-1, 1), random(-1, 1)); // to include all directions (360 deg) this.maxSpeed = 20; // limiting max speed of the particle this.prevPos = this.pos.copy(); // will use this as a starting point to create a line this.alive = true; // to check if the particle has left the canvas }
As for the methods, the update method would add acceleration to the velocity vector and increase the acceleration at the same time as well. The particles are displayed as lines by using the current and previous positions of the particles in every frame. This really makes the particles look as though they are flying off like shooting stars when the ENTER key is pressed.
// to make the particle move update() { this.vel.add(this.acc); // to make the particles move with increasing speed this.vel.limit(this.maxSpeed); // limiting them to a max speed this.pos.add(this.vel); // making them move by changing their position this.acc.mult(2); // increasing acc on every update so the lines become longer } // making lines to make particles appear show() { stroke(random(255), random(255), random(255)); // using previous pos and updated pos to make a line for the travelling particle line(this.pos.x, this.pos.y, this.prevPos.x, this.prevPos.y); // updating the prev position this.prevPos = this.pos.copy(); }
Another interesting method I used was the one that allowed the pixels to wrap around the text. I did this by looping over all the pixels in the canvas and checking if the pixel was white or 255. If it was then I would place a particle at that pixel. I didn’t display the text itself, it only appeared for a split second in one of the frames of the draw() function and during that time the particles would stick to that text. The nested for loops I used were as follows:
// the nested for loop traverses over the whole canvas and finds where the // white pixels of the text are located for (let x = 0; x < width; x += 2) { // number after += indicates density of particles for (let y = 0; y < height; y += 2) { // lesser number = more performance problems let index = (x + y * width) * 4; if (pixels[index] == 255) { // checking if the text is present at the current pixel let p = new Particle(x, y); // if yes then make a particle at that position particles.push(p); // and add it to the array } } }
Reflection
I really enjoyed working with text and particles during this assignment and I feel I learned a lot about particle movement, vectors, and pixels; all of which were new concepts for me. I did notice a strange bug however while I was working on this assignment and I wasn’t quite able to fix it. I was initially working on my monitor for this assignment and it was working just fine, but as soon as I opened the p5.js file on my laptop screen, the particles that made up the word were not aligned at their correct positions on the screen. I really tried to dig deep into this issue but I couldn’t understand why it was happening. Due to this, I had to fix the position of the random particle text on the center of the screen instead of using the mousePos to generate it. I would love to explore more on how I could resolve this bug as I have never encountered a bug like this before in p5.