Перекрывающиеся прямоугольники и отсечение внизу в OpenGL

0

Я должен сделать некоторые 3D-фигуры, используя opengl (более старые версии). Я создал 3 прямоугольника GL_POLYGON, которые связаны друг с другом и имеют разные цвета.

Моя проблема в том, что когда фигура поворачивается, последний добавленный цвет (последний добавленный прямоугольник) всегда выше других. Например, голубой цвет выше розового и желтого, а розовый - над желтым. Я также заметил некоторое сокращение в нижней части рисунка, которое, как мне кажется, вызвано gluPerspective(). То, что я пытаюсь достичь, - это смотреть с z+ на центр и на фигуру, вращающуюся вокруг оси y+ (что, как мне кажется, мне удалось сделать), а также удалить перекрытие и отсечение.

Любые идеи, почему это происходит и как это исправить?

Код ниже:

#include <GL/glfw.h>

int main()
{
int     width, height;
int     frame = 0;
bool    running = true;

glfwInit();

if( !glfwOpenWindow( 700, 800, 0, 0, 0, 0, 0, 0, GLFW_WINDOW ) )
{
    glfwTerminate();
    return 0;
}

glfwSetWindowTitle("GLFW Application");

while(running)
{
    frame++;

    glfwGetWindowSize( &width, &height );
    height = height > 0 ? height : 1;

    glViewport( 0, 0, width, height );

    glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
    glClear( GL_COLOR_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective( 65.0f, (GLfloat)width/(GLfloat)height, 1.0f, 100.0f );


    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    gluLookAt(0.0f, 0.0f, 40.0f,
            0.0f, 0.0f, 0.0f,
            0.0f, 1.0f, 0.0f );


    glRotatef(frame, 0.0f, 1.0f, 0.0f);


    glColor3ub(255,255,0);
    glBegin( GL_POLYGON );
      glVertex3f(5.0f, 0.0f, 0.0f);
      glVertex3f(0.0f, 0.0f, 0.0f);
      glVertex3f(0.0f, 10.0f, 0.0f);
      glVertex3f(5.0f, 10.0f, 0.0f);
    glEnd();
     glColor3ub(255,0,255);
    glBegin( GL_POLYGON );
      glVertex3f(5.0f, 0.0f, -2.0f);
      glVertex3f(0.0f, 0.0f, -2.0f);
      glVertex3f(0.0f, 10.0f, -2.0f);
      glVertex3f(5.0f, 10.0f, -2.0f);
    glEnd();
    glColor3ub(0,255,255);
    glBegin( GL_POLYGON );
      glVertex3f(5.0f, 0.0f, 0.0f);
      glVertex3f(5.0f, 0.0f, -2.0f);
      glVertex3f(5.0f, 10.0f, -2.0f);
      glVertex3f(5.0f, 10.0f, 0.0f);
    glEnd();

    glfwSwapBuffers();

    running = !glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam( GLFW_OPENED);}

glfwTerminate();

return 0;
}
  • 0
    0/10 и немного погрузимся в документацию ...
  • 0
    @j-p Я попробовал документацию и просто не мог обернуть голову вокруг всего этого. Я бы не стал просить о помощи, не посмотрев сначала на вещи.
Показать ещё 2 комментария
Теги:
opengl

1 ответ

2
Лучший ответ

Я не вижу функции глубины в вашем коде, попробуйте искать depth buffer и GL_DEPTH_TEST, если не реализован, правила порядка рисования.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню