мерцание при рендеринге трехмерного объекта (файл .obj) с использованием OpenGL - PullRequest
3 голосов
/ 20 октября 2011

При попытке визуализации трехмерного объекта с использованием OpenGL (и библиотеки GLFW) модель испытывает много мерцаний.Я читаю файл .obj, используя библиотеку, которую я написал сам.

Моя функция рендеринга написана ниже: К сожалению, чтобы понять, как вводятся грани и вершины, мне придетсяпредоставить весь мой код, который связан: Zip-код вместе с исполняемым файлом и примером .obj: Источник

Я использую файлы .obj из здесь для тестирования программы,В настоящее время программа не поддерживает нормалей и текстур, что не является проблемой, поскольку большинство моделей на сайте не имеют их.Кроме того (прямо сейчас) он читает только из «123.obj», поэтому файл не должен называться как-либо иначе.И он принимает только один пробел, не более того.

 float render()
    {
        glfwSetTime(0.0f);
        int win_width;
        int win_height;
        glfwGetWindowSize(&win_width, &win_height);
        float win_aspect = (float)win_width / (float)win_height;
        glViewport(0, 0, win_width, win_height);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(90, win_aspect, 0, 100.0);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(0, 0, 50.0, 0, 0, 0, 0.0, 1.0, 0.0);

        glEnable(GL_DEPTH);
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_NORMALIZE); 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glRotatef(angle , 0 , 1, 0);
        glColor3f(0.0f, 0.0f, 0.0f);
        int index = 0;
        for(int a = 0; a < faces.size(); a++)
        {
            if(faces[a].vertices.size() == 3)
            {
                glBegin(GL_TRIANGLES);
            }
            else
            {
                glBegin(GL_QUADS);
            }
            for(int b = 0; b < faces[a].vertices.size(); b++)
            {
                index = faces[a].vertices[b];
                glVertex3f(vertices[index].Dimensions[_x], vertices[index].Dimensions[_y], vertices[index].Dimensions[_z]);
            }
            glEnd();
        }
        glfwSwapBuffers();
        return (float)glfwGetTime();

1 Ответ

7 голосов
/ 20 октября 2011

Вот проблема

gluPerspective(90, win_aspect, 0, 100.0);

Вы не можете установить 0 в качестве ближайшего клипа, установить его на что-то большее, например, 0,1 или 1,0.

gluPerspective(90, win_aspect, 1.0, 100.0);

При ближнем клипе на 0 все ваши глубины отображаются на z = 1, и вы получаете z, сражаясь.

РЕДАКТИРОВАТЬ: если вам интересно, вот некоторая теория глубины перспективы:

Для заданного расстояния от камеры x ваше перспективное преобразование выдает определенное значение глубины z. В удаленном зажиме это значение будет максимумом 1, а в ближнем зажиме оно будет равно 0. Между этими значениями, однако, отношения не линейны, как вы можете ожидать. Кривая похожа на следующие диаграммы:

Диаграмма

Когда вы дойдете до крайности, установив близкий зажим на 0, ваша кривая сильно искажается, поэтому теперь все расстояния отображаются на z = 1.

Из-за всего этого вы также должны стараться держать соотношение далеко: около 10000: 1

.
...