2015-10-16 74 views
-3

所以我有这个代码使用看起来是粒子效应产生烟花,但我不明白代码中发生了什么。有人可以向我解释它,特别是初始化函数和拉平爆炸函数。如果你可以用超级的笔记注释它。openGL粒子效应的解释

/* fireworks.c - simulate fireworks with particle systems */ 

#include <GL/glut.h> 
#include <math.h> 
#include <stdlib.h> 
#include <stdio.h> 

#ifdef WIN32 
//to correct ASCI deviations in Microsoft VC++ 6.0 

#define M_PI (3.1415926535897932384626433832795) 

double drand48() 
{ return (rand()%10000)/10000.0; } 

//end of corrections 
#endif 


#define MAX_POINTS 5000 
int numPoints; 
GLfloat curx, cury; 
GLfloat x[MAX_POINTS], y[MAX_POINTS]; 
GLfloat xacc[MAX_POINTS], yacc[MAX_POINTS]; 
GLfloat red, green, blue; 
int step; int length; 

void initialize() 
{ int j; double temp, temp2; 

numPoints = drand48()*(MAX_POINTS-1); 
curx = -0.5 + drand48(); 
cury = 0.0 + drand48(); 

red = 0.5 + 0.5*drand48(); 
green = 0.5 + 0.5*drand48(); 
blue = 0.5 + 0.5*drand48(); 
glPointSize(1.5); 
step = 0; 
length = 700 + 300*drand48(); 


/* initialize the blast */ 
for (j=0 ; j<numPoints ; j++) { 
x[j] = curx; 
y[j] = cury; 
temp = drand48(); 
temp2 = drand48()*2.0*M_PI; 
xacc[j] = (cos(temp2) * temp)/length; 
yacc[j] = (sin(temp2) * temp)/length; 
} 

} 

void draw_blast(void) 
{ int i; 
double glow = (length - step)/(double)length; 
glColor3f(red*glow, green*glow, blue*glow); 
glBegin(GL_POINTS); 
for (i=0;i<numPoints;i++) { 
x[i] += xacc[i]; 
y[i] += yacc[i]; 
glVertex2f(x[i], y[i]); 
} 
glEnd(); 
glFlush(); 
glutSwapBuffers(); 
} 

void display(void) 
{ int i; 
glClear(GL_COLOR_BUFFER_BIT); 
if (step < 0.9*length) { 
for (i=0; i<numPoints; i++) 
yacc[i] -= 0.02/length; // gravity 
draw_blast(); 
} 
step ++; 
if (step > length) initialize(); 
} 

void idle(void) 
{ 
glutPostRedisplay(); 
} 

void keyboard(unsigned char key, int x, int y) 
{ 
switch (key) { 
case 27: exit(0); break; 
} 
} 

void reshape (int w, int h) 
{ 
glViewport(0, 0, (GLsizei) w, (GLsizei) h); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
if (w <= h) 
glOrtho(-1.0, 1.0, 
-1.0*(GLfloat)h/(GLfloat)w, 1.0*(GLfloat)h/(GLfloat)w, 
-1.0, 1.0); 
else 
glOrtho(-1.0*(GLfloat)w/(GLfloat)h, 1.0*(GLfloat)w/(GLfloat)h, 
-1.0, 1.0, 
-1.0, 1.0); 
glMatrixMode(GL_MODELVIEW); 
} 

int main(int argc, char** argv) 
{ 
glutInit(&argc, argv); 
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 
glutInitWindowSize (800, 800); 
glutInitWindowPosition(0, 0); 
glutCreateWindow ("Fireworks"); 

glClearColor (0.0, 0.0, 0.0, 0.0); 
initialize(); 

glutDisplayFunc(display); 
glutReshapeFunc(reshape); 
glutIdleFunc(idle); 
glutKeyboardFunc(keyboard); 
glutMainLoop(); 

return 0; 
} 
+2

SO问题应该有一个特定的问题,最好有一个可重复的例子。你有没有尝试使用Google搜索功能名称。 –

回答

1

是的,它是一个粒子系统。但是 - 不是一个特别有效的。

让我们通过它一步一步:

GLfloat x[MAX_POINTS], y[MAX_POINTS]; 
GLfloat xacc[MAX_POINTS], yacc[MAX_POINTS]; 

xy保持粒子的位置。 xaccyacc保持他们的速度。

initialize

numPoints = drand48()*(MAX_POINTS-1); 

这设置颗粒的随机数...

curx = -0.5 + drand48(); 
cury = 0.0 + drand48(); 
red = 0.5 + 0.5*drand48(); 
green = 0.5 + 0.5*drand48(); 
blue = 0.5 + 0.5*drand48(); 
glPointSize(1.5); 
step = 0; 
length = 700 + 300*drand48(); 

...与随机中心位置,颜色和半径(length)。

for (j=0 ; j<numPoints ; j++) { 

这开始每个粒子的初始化。

x[j] = curx; 
y[j] = cury; 

将粒子的位置设置为中心位置。

temp = drand48(); 
temp2 = drand48()*2.0*M_PI; 
xacc[j] = (cos(temp2) * temp)/length; 
yacc[j] = (sin(temp2) * temp)/length; 

设置粒子(temp2),以及基于该系统的半径(temp/length)无规速度的随机方向。

drawBlast()

double glow = (length - step)/(double)length; 
glColor3f(red*glow, green*glow, blue*glow); 

慢慢变淡的粒子的颜色为黑色。

x[i] += xacc[i]; 
y[i] += yacc[i]; 

使粒子前进的速度。这假设一个固定的帧速率。

glVertex2f(x[i], y[i]); 

将粒子绘制为点。

display()

yacc[i] -= 0.02/length; // gravity 

加快每个粒子向下。即模拟颗粒落下。

+0

谢谢,这有助于很多! – CuriousGuy