2016-11-06 242 views
0

我想用openGL在屏幕上绘制100个点。这意味着每次运行程序时,屏幕上都会随机显示100个GL_POINTS。目前屏幕上只剩下一个点,并且它的位置是以前给出的。但是,我的随机点只出现一段时间,然后消失。我不知道我错过了什么才能使它工作。以下是我的代码openGL中的随机点生成

#include <stdlib.h> 
#include <GL/freeglut.h> 
#include <math.h> 

GLfloat cameraPosition[] = { 0.0, 0.2, 1.0 }; 

/* Random Star position */ 
GLfloat starX, starY, starZ; 
GLint starNum = 0; 

void myIdle(void){ 
    starNum += 1; 

    /* Generate random number between 1 and 4. */ 
    starX = 1.0 + static_cast <float> (rand())/(static_cast <float> (RAND_MAX/3.0)); 
    starY = 1.0 + static_cast <float> (rand())/(static_cast <float> (RAND_MAX/3.0)); 
    starZ = 1.0 + static_cast <float> (rand())/(static_cast <float> (RAND_MAX/3.0)); 

    /* Now force OpenGL to redraw the change */ 
    glutPostRedisplay(); 
} 

// Draw a single point 
void stars(GLfloat x, GLfloat y, GLfloat z){ 
    glBegin(GL_POINTS); 
    glColor3f(1.0, 0.0, 0.0); 
    glVertex3f(x, y, z); 
    glEnd(); 
} 

// Draw random points. 
void myDisplay(void){ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_LINE_SMOOTH); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glLoadIdentity(); 
    gluLookAt(cameraPosition[0], cameraPosition[1], cameraPosition[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 

    /* They show up on the screen randomly but they disappear after starNum greater than 100 */ 
    if (starNum < 100){ 
     glPushMatrix(); 
     stars(starX, starY, starZ); 
     glPopMatrix(); 
    } 

    /* This point will remain on the screen. */ 
    glPushMatrix(); 
    stars(2.0, 2.0, 2.0); 
    glPopMatrix(); 

    /* swap the drawing buffers */ 
    glutSwapBuffers(); 
} 

void initializeGL(void){ 
    glEnable(GL_DEPTH_TEST); 
    glClearColor(0, 0, 0, 1.0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glPointSize(2.0); 
    glOrtho(-4.0, 4.0, -4.0, 4.0, 0.1, 10.0); 
    glMatrixMode(GL_MODELVIEW); 
} 

void main(int argc, char** argv){ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowSize(1800, 1000); 
    glutInitWindowPosition(100, 150); 
    glutCreateWindow("Random points"); 

    /* Register display function */ 
    glutDisplayFunc(myDisplay); 

    /* Register the animation function */ 
    glutIdleFunc(myIdle); 

    initializeGL(); 
    glutMainLoop(); 
} 

任何想法我错过了什么?

+3

你期望什么?如果'starNum <100',你正在画星星,并想知道为什么当这种情况不再被满足时他们消失了?我不明白你的意外。 –

+0

我想在屏幕上画出100点,并且它们的位置是随机的。基本上,我希望所有的星星都留在屏幕上。 – zihaow

+4

OpenGL不是场景图形API。每次调用显示功能时,都需要绘制所有星星。 –

回答

1

建立在@Reto_Koradi在他的评论中说过的话,每次你的显示函数被调用时,你正在绘制2颗星。你正在画一个随机星(只要starnum小于100),然后你在位置(2,2,2)画一颗星。你看到的恒星是(2,2,2)处的恒星。

什么你可能想要做的是这样的:

// Draw random points. 
void myDisplay(void){ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_LINE_SMOOTH); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glLoadIdentity(); 
    gluLookAt(cameraPosition[0], cameraPosition[1], cameraPosition[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 

    /* They show up on the screen randomly but they disappear after starNum greater than 100 */ 
    for (starnum = 0; starnum < 100; starnum++) { 
     glPushMatrix(); 

     starX = 1.0 + static_cast <float> (rand())/(static_cast <float> (RAND_MAX/3.0)); 
     starY = 1.0 + static_cast <float> (rand())/(static_cast <float> (RAND_MAX/3.0)); 
     starZ = 1.0 + static_cast <float> (rand())/(static_cast <float> (RAND_MAX/3.0)); 

     stars(starX, starY, starZ); 
     glPopMatrix(); 
    } 

    /* This point will remain on the screen. */ 
    glPushMatrix(); 
    stars(2.0, 2.0, 2.0); 
    glPopMatrix(); 

    /* swap the drawing buffers */ 
    glutSwapBuffers(); 
} 

,然后删除该改变的starnumstarXstarYstarZmyIdle()函数值的代码。

+0

1.我不会使用星号调用来取代'glBegin'' glEnd'中的整个循环... 2.您在哪里设置种子,以便随机星星是相同的所有帧(或者需要闪烁)? ? 3.为什么推动弹出矩阵,如果它不使用? – Spektre

+0

我的观点并不是写出最正确,最有效的答案。这是为了帮助新来的人了解他们写的代码出错了。因此,我的回复尽可能多地使用了现有的代码。一旦海报知道它的正确,那么他们可能会担心使其效率。 – user1118321

+0

我不是故意把它当作批评,而是作为前进的附加提示......对不起,如果那不明确 – Spektre

0

正如@Reet Koradi所说,我需要在每次调用显示函数时画出所有100颗星。为此,我需要一个GLfloat数据结构,它在开始时存储x,y,z随机值,然后访问数据数组以绘制星星,这将使它们全部保留在屏幕上。这里是没有'myIdle'功能的解决方案,一切都在'myDisplay'函数中完成。

/* Data structure for generating stars at random location */ 
typedef GLfloat star2[100]; 
star2 randomX = {}; 
star2 randomY = {}; 
star2 randomZ = {}; 

// Draw random points. 
void myDisplay(void){ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_LINE_SMOOTH); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glLoadIdentity(); 
    gluLookAt(cameraPosition[0], cameraPosition[1], cameraPosition[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 

    /* Generate random number of stars */ 
    if (starNum < 100){ 
     /* This will store 100 stars' location to a data array. */ 
     for (starNum = 0; starNum < 100; starNum++) { 


     starX = -4.0 + static_cast <float> (rand())/(static_cast <float> (RAND_MAX/8.0)); 
     starY = -4.0 + static_cast <float> (rand())/(static_cast <float> (RAND_MAX/8.0)); 
     starZ = -4.0 + static_cast <float> (rand())/(static_cast <float> (RAND_MAX/8.0)); 

     randomX[starNum] = { starX }; 
     randomY[starNum] = { starY }; 
     randomZ[starNum] = { starZ }; 
     } 
    } 
    else{ 
     /* This will draw 100 stars on the screen */ 
     for (int i = 0; i < starNum; i++){ 
      glPushMatrix(); 
      stars(randomX[i],randomY[i], randomZ[i]); 
      glPopMatrix(); 
     } 
    } 

    /* swap the drawing buffers */ 
    glutSwapBuffers(); 
}