2016-11-06 8 views
0

OpenGLを使用して画面上に100点を描きたい。これは、プログラムを実行するたびに画面上にランダムに100個のGL_POINTSがあることを意味します。現在のところ、画面に残っているポイントは1つだけで、その位置は以前に与えられています。しかし、私のランダムな点は短時間しか現れず、消えてしまいます。私はそれを動作させるために何が欠けていたのか分かりません。以下は私のコードです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つの星を描いています。あなたは1つのランダムな星を描いています(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(); 
} 

そしてあなたmyIdle()機能からstarnumstarXstarYstarZの値を変更するコードを削除します。

+0

1.私は星の呼び出しを使わず、代わりに 'glBegin'' glEnd'の中でループ全体を取得します... 2.ランダム星がすべてのフレームと同じになるようにシードを設定していますか(またはフリッカーが必要ですか? ?なぜ使用されていない場合、ポップマトリクスをプッシュするのですか? – Spektre

+0

私の主張は、最も正確で最も効率的な答えを書くことではありませんでした。これは、これを初めて知った人が、自分が書いたコードがどこに間違っているのかを理解する助けとなりました。このように、私の返信は既存のコードを可能な限り多く使用しました。ポスターが正しいと分かると、効率的になることを心配することができます。 – user1118321

+0

私はそれを批判として意味するのではなく、前進するためのさらなるヒントとして...申し訳ありませんが明確でない場合は – Spektre

0

@Retoが述べたように、表示機能が呼び出されるたびに100個の星をすべて描画する必要があります。これを行うには、最初にx、y、zランダム値を格納してからデータ配列にアクセスして星を描画するGLfloatデータ構造が必要です。これにより、すべてが画面上に残ります。ここでは、 '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(); 
} 
関連する問題