Неправильная вершина и нормальный доступ при загрузке 3D-модели с использованием ASSIMP и OpenGL - PullRequest
2 голосов
/ 02 ноября 2011

Я использую текстурированный образец загрузки 3d-модели, предоставленный в образце кода ASSIMP . Тем не менее, для некоторых моделей, он, кажется, не имеет доступа к вершине модели и нормально к ней. Вот скриншот неправильно загруженной модели:

enter image description here

Пока модель должна быть похожа на следующий скриншот:

enter image description here

На первом изображении крыша здания размещена в центре верхней части вида спереди. Пол отсутствует. Я предполагаю, что эта проблема вызвана неправильным доступом к позициям вершин и нормалей (CMIIW). Ниже приведен фрагмент, используемый для доступа как к позиции вершины, так и к нормальной:

        glBegin(face_mode);
        for(i = 0; i < face->mNumIndices; i++){
            int vertexIndex = face->mIndices[i];    // get group index for current index
            if(mesh->mColors[0] != NULL)
                Color4f(&mesh->mColors[0][vertexIndex]); 
            if(mesh->mNormals != NULL)
                if(mesh->HasTextureCoords(0)){  
                    glTexCoord2f(mesh->mTextureCoords[0][vertexIndex].x,  mesh->mTextureCoords[0][vertexIndex].y);                  
                }
                glNormal3fv(&mesh->mNormals[vertexIndex].x);
                glVertex3fv(&mesh->mVertices[vertexIndex].x);
        }
        glEnd();

Как мы можем правильно получить доступ к вершинам и нормам модели?

1 Ответ

2 голосов
/ 02 ноября 2011

Что происходит, так это то, что вершины с одинаковым положением являются «общими». Это проблематично, потому что (в терминах OpenGL) вершина представляет собой целую комбинацию [положение, нормаль, координаты текстуры, другие атрибуты…].

Где-то в экспортере или загрузчике эта информация теряется.

Вы можете исправить это в 3D-модели, разделив сетку по жестким краям, то есть выбрать непрерывные участки гладко освещенных поверхностей и превратить их в отдельные подсетки (например, в Blender с помощью функции «Split Mesh», горячая клавиша «Y»). ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...