0

私はOpenGLを初めて使用します。私は立方体の描画に成功し、コードを改善しようとしましたが、これを思いつきましたが、これは立方体の最初の面のみを描画します。

glPushMatrix();
glColor3d(1,0,0);
glRotatef(45,0,1,0);
glTranslatef(0,0,3);

for(int i=0;i<6;i++){
   glBegin(GL_QUADS);
   glVertex3f(0,0,0);
   glVertex3f(3,0,0);
   glVertex3f(3,3,0);
   glVertex3f(0,3,0);
   glEnd();
   if(i<4)
    glRotatef(90,0,1,0);
   if(i=4)
    glRotatef(90,1,0,0);
   if(i=5)
    glRotatef(180,1,0,0);
}

glRotatef(90,1,0,0);

glPopMatrix();

反復はまったく機能していないようです!OpenGLの動作方法について基本的なことを見逃していますか?

4

2 に答える 2

1

最初の答えは次のとおりです。OpenGLの古風なバージョンを使用しています。現在、頂点を1つずつ送信するのではなく、次のようにします。

  • いくつかの頂点を持つメモリバッファを作成します
  • そのバッファをGPUメモリのバッファ(VBO)に送信します
  • glDrawArraysまたはを使用して、そこから直接レンダリングしますglDrawElements

いつか試してみてください、劇的に速く動作します:-)


そして、あなたの例の何が問題になっていますか-あなたはおそらくこれを意味しましたか...?

if (i == 4)

if (i == 5)

コンパイラの警告を有効にして、それをキャッチできるようにしてください。(ちなみに、私もそれを見ませんでした-私のコンパイラは見ました:-))

于 2012-06-23T10:49:04.990 に答える
1

アプローチの問題は、回転が終了したら、z軸上で平行移動し、四角形を描画してから、元のポイントに平行移動する必要があることです。

あなたが試みていることに対する一般的なアプローチは次のとおりです。

glPushMatrix();

<initial-setup>

for i = 0 to 5
    translate on z-axis +(width/2) units
    draw the quad
    translate on z-azis -(width/2) units
    if i<=3
        rotate 90 about y-axis
    elif i == 4
        rotate 90 about x-axis
    else
        rotate 180 about x-axis
glPopMatrix();

そして、@ kosが正しく指摘したように、次のステートメントを次のステートメントに置き換えif(i=4)if (i==4)同様にします。

于 2012-06-23T10:49:33.223 に答える