0

チェックボードの床に壁を追加して立方体を形成しようとしています。底は既にありますが、裏側や壁を描くのが困難です。

これが私のコードです:

class Checkerboard {
  int displayListId;
  int width;
  int depth;
public:
  Checkerboard(int width, int depth): width(width), depth(depth) {}
  double centerx() {return width / 2;}
  double centerz() {return depth / 2;}
  void create() {
    displayListId = glGenLists(1);
    glNewList(displayListId, GL_COMPILE);
    GLfloat lightPosition[] = {4, 3, 7, 1};
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
    glBegin(GL_QUADS);
    glNormal3d(0, 1, 0);
    for (int x = 0; x < width - 1; x++) {
      for (int z = 0; z < depth - 1; z++) {
        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
                     (x + z) % 2 == 0 ? RED : WHITE);
        glVertex3d(x, 0, z);
        glVertex3d(x+1, 0, z);
        glVertex3d(x+1, 0, z+1);
        glVertex3d(x, 0, z+1);
      }
    }
    glEnd();
    glEndList();
  }
  void draw() {
    glCallList(displayListId);
  }
}

;

次のコードを追加しようとしています。

glColor3f(1.0f,1.0f,0.0f);    // Color Yellow
    glVertex3d( 1.0f,-1.0f,-1.0f);    // Top Right Of The Quad (Back)
    glVertex3d(-1.0f,-1.0f,-1.0f);    // Top Left Of The Quad (Back)
    glVertex3d(-1.0f, 1.0f,-1.0f);    // Bottom Left Of The Quad (Back)
    glVertex3d( 1.0f, 1.0f,-1.0f);    // Bottom Right Of The Quad (Back)

誰かが私が間違っていることを指摘できますか?

4

2 に答える 2

1

追加しようとしている顔を効果的に描画しているのに、背面カリングのために見えない場合があります。glDisable(GL_CULL_FACE);四角形を描画する前に試すか、頂点の順序を変更してみてください。

注: 背面カリングを無効にする場合は、プログラムをデバッグするための一時的な回避策と考えてください。背面カリングは重要な最適化であり、ほとんどの状況で有効にする必要があります。

于 2013-03-06T22:56:51.360 に答える
0

コードを次のように変更します。

glColor3f(1.0f,1.0f,0.0f);    // Color Yellow
glVertex3d( 1.0f, 1.0f,-1.0f);    // Top Right Of The Quad (Back)
glVertex3d( -1.0f, 1.0f,-1.0f);    // Top Left Of The Quad (Back)
glVertex3d( -1.0f, -1.0f,-1.0f);    // Bottom Left Of The Quad (Back)
glVertex3d( 1.0f, -1.0f,-1.0f);    // Bottom Right Of The Quad (Back)

コメントは正しい巻き順 (CCW) でしたが、頂点はそうではありませんでした (時計回りでした)。カリングが有効になっている場合、OpenGL はデフォルトでそれらをカリングします (表示しません)。

于 2013-03-06T23:06:00.290 に答える