2

プロジェクト用にスカイボックスを作成しましたが、希望どおりに見えます。ただし、修正方法がわからない問題がいくつかあり、このテーマに関するチュートリアルをいくつか読みましたが、役立つものを見つけることができませんでした. 最初の問題は、ボックスをカメラで常に移動させる方法がわからないことです。下の画像では、太陽系をズームイン/ズームアウトして常に背景に星を表示するだけでなく、ズームアウトしてボックス全体を見ることができることがわかります。

ここに画像の説明を入力

私が抱えているもう1つの問題は、ズームインしすぎると背景が消えることです。下の図は、私が何を意味するかを示しています ここに画像の説明を入力

カメラを適切に動作させることができれば、これを修正できることはわかっていますが、最初の問題に戻ります. カメラ情報へのアクセス方法がわかりません。

コードを固定数からカメラの位置によって変化する数に変更する必要があるglTranslatef()と思います。glScalef()これが私のコードです:

void Skybox::displaySkybox() 
{

Images::RGBImage test[6]; //6 pictures for 6 sides
test[0]=Images::readImageFile(fileName); //Top
//test[1]=Images::readImageFile(fileName);//Back
//test[2]=Images::readImageFile(fileName);//Bottom
//test[3]=Images::readImageFile(fileName);//Right
//test[4]=Images::readImageFile(fileName); //Left
//test[5]=Images::readImageFile(fileName);  //Front

glEnable(GL_TEXTURE_2D);    

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
test[0].glTexImage2D(GL_TEXTURE_2D,0,GL_RGB);

// Save Current Matrix
glPushMatrix();

// Second Move the render space to the correct position (Translate)
glTranslatef(0,0,0);

// First apply scale matrix
glScalef(10000,10000,10000);

 static const GLint faces[6][4] =
                {
                {5, 1, 2, 6}, // back
                {5, 4, 0, 1}, // bottom
                {0, 4, 7, 3}, // front
                {4, 5, 6, 7}, // right ( 'left' in crinity's labeling )
                {1, 0, 3, 2}, // left  ( 'right' in crinity's labeling )
                {2, 3, 7, 6}  // top*/
                };
GLfloat v[8][3];
GLint i;

v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1;  // min x
v[4][0] = v[5][0] = v[6][0] = v[7][0] =  1;  // max x
v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1;  // min y
v[2][1] = v[3][1] = v[6][1] = v[7][1] =  1;  // max y
v[0][2] = v[3][2] = v[4][2] = v[7][2] = -1;  // min z
v[1][2] = v[2][2] = v[5][2] = v[6][2] =  1;  // max z

for (i = 0; i < 7; i++) 
{
    //
    glBegin(GL_QUADS);

    glTexCoord2f(0,1);  glVertex3fv(&v[faces[i][0]][0]);
glTexCoord2f(1,1);  glVertex3fv(&v[faces[i][1]][0]);
glTexCoord2f(1,0);  glVertex3fv(&v[faces[i][2]][0]);
glTexCoord2f(0,0);  glVertex3fv(&v[faces[i][3]][0]);

    glEnd();
}
// Load Saved Matrix
glPopMatrix();

}

これらの変数にアクセスするにはどうすればよいですか? openGLには、それを処理する機能がすでにありますか?

4

2 に答える 2

10

コード内の glTranslatef() と glScalef() を固定の数値からカメラの位置によって変化する数値に変更する必要があると思います。

あなたは近いですが、もっと簡単な解決策があります:

  1. ボックスを移動する必要がないように、カメラを移動する前にまずスカイボックスを描画します。新しいフレームごとに深度バッファーをクリアすることを忘れないでください (理由はすぐにわかります)。

  2. 深度バッファへの書き込みを無効にします ( を呼び出しますglDepthMask(GL_FALSE))。これにより、レンダリングする他のすべてのオブジェクトがその上に描画され、常に他のすべての「背後」に表示されます。

  3. フレームの開始時に変換行列がリセットされたと仮定すると、カメラの回転のみを適用します。このようにして、カメラは常にボックス内の「中央」に配置されます。

  4. スカイボックスを描画します。深度バッファへの書き込みはオフになっているため、カメラのニア クリップ プレーンよりも大きい限り、深度バッファがどれほど小さくても問題ありません。

  5. 深度バッファへの書き込みを再度有効にします (呼び出しglDepthMask(GL_TRUE))

  6. シーンを通常どおりにレンダリングします。

于 2013-05-30T17:28:51.773 に答える
-2

以前にスカイボックスを使用したことはありませんが、カメラが常にボックスの中心にあることは理にかなっています。ボックスをカメラ座標の中心に移動することから始めますglTranslate(camera.x, camera.y, camera.z); 。次に、ボックスは無限に離れている必要があると思うので、頂点を INT_MAX または途方もなく大きなものに設定します。

v[0][0] = v[1][0] = v[2][0] = v[3][0] = -INT_MAX;  // min x
v[4][0] = v[5][0] = v[6][0] = v[7][0] =  INT_MAX;  // max x ...etc

次に、おそらく glScalef() の呼び出しを取り除きます。それを試してみてください

于 2013-05-30T17:24:19.340 に答える