0

このコードでは、立方体を描画しようとしています。すべての面の頂点を反時計回りに描画しようとしています。
問題は、立方体を回転させない場合、赤い面だけが描画され、代わりに5度回転させると、立方体の一部だけが表示されることです。

#import <OpenGL/OpenGL.h>
#import <GLUT/GLUT.h>

int width=500, height=500, depth=500;

void init()
{
    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(200, 200,-200, 200, 200, 0, 0, 1, 0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,width,0,height);
    gluPerspective(90, 1, -100, 100);
    glViewport(0, 0, width, height);
}

void drawCube()
{
    int vertices[8][3]= { {100,100,0} , {300,100,0}, {300,300,0}, {100,300,0}, {100,100,300} , {300,100,300}, {300,300,300}, {100,300,300} };
    glBegin(GL_QUADS);

    glColor4f(1, 0, 0, 0);
    glVertex3iv(vertices[0]);
    glVertex3iv(vertices[1]);
    glVertex3iv(vertices[2]);
    glVertex3iv(vertices[3]);

    glVertex3iv(vertices[4]);
    glVertex3iv(vertices[5]);
    glVertex3iv(vertices[6]);
    glVertex3iv(vertices[7]);

    glColor4f(0, 1, 0, 0);
    glVertex3iv(vertices[1]);
    glVertex3iv(vertices[5]);
    glVertex3iv(vertices[6]);
    glVertex3iv(vertices[4]);

    glVertex3iv(vertices[0]);
    glVertex3iv(vertices[4]);
    glVertex3iv(vertices[7]);
    glVertex3iv(vertices[3]);

    glColor4f(0, 0, 1, 0);
    glVertex3iv(vertices[3]);
    glVertex3iv(vertices[2]);
    glVertex3iv(vertices[6]);
    glVertex3iv(vertices[7]);

    glVertex3iv(vertices[0]);
    glVertex3iv(vertices[1]);
    glVertex3iv(vertices[5]);
    glVertex3iv(vertices[4]);

    glEnd();
}


void display()
{
    glClearColor(0.0, 0.0, 0.0, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(200,200,150);
    glRotatef(5, 0, 1, 0);
    glTranslatef(-200,-200,-150);
    drawCube();
    glutSwapBuffers();
}

void idle(void)
{
}

int main(int argc, char * argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(width, height);
    glutCreateWindow("Test");
    glutDisplayFunc(display);
    glutIdleFunc(idle);
    init();
    glutMainLoop();
    return 0;
}

これは私が見るものです:

窓

しかし、回転した立方体が見えるはずなので、右側のもう一方の面の部分が見えるはずです。頂点を反時計回りの順序で描画するのが間違っているのではないかと思います。

PS:私の大学では、OpenGLの最新バージョンを研究する可能性がなく、GLUTを使用する必要があるため、コードは古くなっています。

4

1 に答える 1

1

カップルの問題:

  1. 射影行列の設定は意味がありません。

    最初に、正投影または透視投影のどちらが必要かを決定する必要があります。

    正投影が必要な場合は、gluOrtho2d を使用します。透視投影が必要な場合は、gluPerspective を使用します。両方を使用すると、あなたが望むものではない奇妙な変換が生成されます。

  2. gluPerspective は、負の近平面を持つことはできません。ニア プレーンは 0 より大きくする必要があります。おそらく のような小さいもの1で、ファー プレーンはカメラからバック クリップ プレーンをどれだけ離すかを定義します。何百ものユニットを使用しているようなので、バックプレーンをお勧めするかもしれません1000

  3. gluLookAt を呼び出していますが、 を呼び出してビュー マトリックスを消去していglLoadIdentityますdisplay()。ビュー マトリックスが必要な場合は、プログラムした後に消去しないでください。

于 2012-11-13T17:46:30.753 に答える