0

そこで、SDLとOpenGLを使用してC++で3Dスターを作成することにしました。x、y、zの値を保持するPointクラスを作成しました。ポイントの配列を作成し、ランダムな座標で塗りつぶします。これはうまくいくようですが、glTranslatef(0,0,0.1f)などを実行すると、星が近づかず、消えてしまいます。

//OpenGL Initialization Code
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0f,640.0/480.0,0.3f,500.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);

//Random point generation
for(int i = 0; i < 200000; i++)
{
   float randomX = (float)rand()/((float)RAND_MAX/100.0f) - 50.0f;
   float randomY = (float)rand()/((float)RAND_MAX/20) - 10.0f;
   float randomZ = (float)rand()/((float)RAND_MAX/20) - 20.0f;
   points[i] = Point(randomX, randomY,randomZ);
}

//Render
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_POINTS);
for(int i = 0; i < 200000; i++)
{
   glVertex3f(points[i]._x, points[i]._y, points[i]._z);
}
glEnd();
glTranslatef(0,0,0.1f);
SDL_GL_SwapBuffers();
SDL_Flip(screen);

私は何が間違っているのですか?

4

3 に答える 3

2

そのコードはあなたのレンダリング関数ですか?

そうである場合は、ポイント生成を別の場所に移動して、一度だけ生成されるようにする必要があります。

そうでない場合は、初期化コードをレンダリング関数の先頭に移動する必要があります。マトリックスはフレームごとにクリアする必要があります。

それが機能しない場合:

深度テストを一時的に無効にしてみてください。それらが消えず、線が表示される場合は、ビュー錐台を調整する必要があります。gluLookAtを使用してみてください

また、それらを負のz軸に変換してみてください。私の記憶が正しければ、openglでは、zが減少するにつれて、オブジェクトと空間の座標が遠くなります。(0は-1よりも近い)

于 2012-08-16T00:47:59.387 に答える
0

なぜ消えてしまうのかわかりませんが、サンプルコードでは不活性である必要があります。MODELVIEWマトリックスの上部に新しい単位行列をロードし、レンダリング後にそれを変換します。glTranslateをglBeginの直前に移動してみてください。

于 2012-08-16T00:33:26.477 に答える
0

OpenGL初期化コードをSDLSetVideoModeを初期化したコードの後に​​移動しましたが、現在は正常に機能しています。

于 2012-08-16T00:51:52.303 に答える