This tutorial involves a particle system in which each particle is attracted to one another by the force of gravity. I would try to explain the entire process to you. But I am not sure if that is necessary. Most of the source code is identical to the first tutorial. Only a few things have been changed. So I am basically just handing over the source code and hoping that you will experiment with it yourself. Here is the code that has changed the most:
inline int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); glTranslatef(0,0,-15); glBegin(GL_POINTS); int loop2; for (loop=0; loop<MAX_PARTICLES; loop++) // Loop Through All The Particles { GLfloat x=particle[loop].x; // Grab Our Particle X Position GLfloat y=particle[loop].y; // Grab Our Particle Y Position
for (loop2=0; loop2<MAX_PARTICLES; loop2++) // Loop Through All The Particles { if (loop2 != loop) { GLfloat x2=particle[loop2].x; // Grab Our Particle X Position GLfloat y2=particle[loop2].y; // Grab Our Particle Y Position Hypoten = Hypot(x-x2,y-y2); if (x < x2) angle = -acos(-(y-y2)/-Hypoten); else angle = acos((y-y2)/Hypoten);
dist = ABS(Reciprocal(Hypoten))/50;
particle[loop].r = dist*25; // Make particle brighter and yellower particle[loop].g = dist*25; // Make particle brighter and yellower particle[loop].xi -= sin(angle)*(dist);//slowdown; particle[loop].yi -= cos(angle)*(dist);//slowdown; } }
particle[loop].r -= .1f; particle[loop].g -= .1f; particle[loop].b -= .1f; if (particle[loop].r < default_r) particle[loop].r = default_r; if (particle[loop].g < default_g) particle[loop].g = default_g; if (particle[loop].b < default_b) particle[loop].b = default_b; // Set Color according to our defined rgb values specific to each particle glColor4f(particle[loop].r,particle[loop].g,particle[loop].b,1);
glVertex2f(x,y); // Draw pixel
particle[loop].xi-=x/slowdown/2; // Necessary to keep particles close particle[loop].yi-=y/slowdown/2; // Necessary to keep particles close particle[loop].x+=particle[loop].xi/slowdown; // Move On The X Axis By X Speed particle[loop].y+=particle[loop].yi/slowdown; // Move On The Y Axis By Y Speed } glEnd();
return TRUE; // Keep Going }
I do not claim that this is the best way to simulate gravity among particles. But I do think it is a cool effect. And I hope that you are as satisfied with it as I am.