2011-03-10 174 views
3

我试图使用OpenGL模拟粒子系统,但我不能得到它的工作,这是我到目前为止有:OpenGL的粒子系统

#include <GL/glut.h> 
int main (int argc, char **argv){ 

    // data allocation, various non opengl stuff 
    ............ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 
    glutInitWindowPosition(100,100); 
    glutInitWindowSize(size, size); 
    glPointSize (4); 
    glutCreateWindow("test gl"); 
    ............ 
    // initial state, not opengl 
    ............ 
    glViewport(0,0,size,size); 
    glutDisplayFunc(display); 
    glutIdleFunc(compute); 
    glutMainLoop(); 


} 

void compute (void) { 

// change state not opengl 

    glutPostRedisplay(); 

} 

void display (void) { 

    glClear(GL_COLOR_BUFFER_BIT); 
    glBegin(GL_POINTS); 

    for(i = 0; i<nparticles; i++) { 

    // two types of particles 
    if (TYPE(particle[i]) == 1) glColor3f(1,0,0); 
     else glColor3f(0,0,1); 

    glVertex2f(X(particle[i]),Y(particle[i])); 

    } 

    glEnd(); 
    glFlush(); 
    glutSwapBuffers(); 

} 

我一对夫妇后得到一个黑色窗口秒(该窗口之前只有标题栏)。我哪里出错了?

LE: x和每个粒子的y坐标是时间间隔(0,大小)

+0

你可以发布你的整个代码?我们不知道particle []数组是什么。我可以猜测,粒子不在默认投影内。 – levis501 2011-03-10 04:25:00

+0

这没关系,其余的代码都经过测试并且工作正常,代码是几千行代码,我看不出这会有什么帮助。聚焦于X(粒子[i])是粒子的x坐标和Y(粒子[i])y坐标的部分,这是与opengl部分唯一相关的部分。 – w00t 2011-03-10 04:28:40

+1

你是否在任何地方打电话给glOrtho? – 2011-03-10 07:04:36

回答

2

尽量使在代码这些更改内:

  • 移动在主功能文件结尾
  • glPoinSize调用属于显示功能
  • 然后你应该提供一个函数来处理窗口glutReshapeFunc(reshape)的大小调整,像这样的
void reshape(int w, int h) 
    { 
     glViewport(0, 0, (GLsizei) w, (GLsizei) h); 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h); 
    }
  • glFlush从glutSwapBuffers函数调用,所以你不需要它有
  • 插入此代码(glutCreateWindow呼叫后)设置初始位置为投影
glClearColor(0.2, 0.0, 0.0, 0.0);  
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, 10, 0.0, 10, -1.0, 1.0);