2016-11-30 6 views
0

Я пытаюсь реализовать крах в моем игровом движке, есть проблема, вызванная Assimp. Индексы, которые обрабатываются от face.mNumIndices, всегда являются индексацией индекса приращения.Edge Collapse with assimp

Когда я проверяю список индексов, значение должно быть примерно 0,1,2,3,4....,999.... Но я знаю, что это какой-то mechanism, который используется Assimp, и объект визуализируется в порядке. Но есть еще одна проблема в Mesh Simplication, я не мог создать структуру полукруг для этих индексов. Я застрял на этом пару дней и не получил ответа. Должен ли я отказаться от Ассимпа? Любые рекомендации приветствуются.

Редактировать: Мои вершины разделяются между лицами, код, который я использовал для получения данных здесь.

BasicRenderModel* AssimpLoader::ProcessMeshBasicVersion(aiMesh * mesh, const aiScene * scene) 
{ 
    //std::vector<Vertex> vertices; 
    float *vertices = new float[mesh->mNumVertices * 3]; 
    int vertexLength = mesh->mNumVertices * 3; 
    float *normals = new float[mesh->mNumVertices * 3]; 
    int normalLength = mesh->mNumVertices * 3; 
    float *texCoords = new float[mesh->mNumVertices * 2]; 
    int texCoordLength = mesh->mNumVertices * 2; 
    std::vector<int> indicesList; 
    int *indices; 
    int indexLength; 

    //std::vector<Texture> textures; 
    std::map<TextureType, std::vector<Texture>> textures; 
    for (GLuint i = 0; i < mesh->mNumVertices; i++) 
    { 
     // Process vertex positions, normals and texture coordinates 
     vertices[i * 3] = mesh->mVertices[i].x; 
     vertices[i * 3 + 1] = mesh->mVertices[i].y; 
     vertices[i * 3 + 2] = mesh->mVertices[i].z; 
     normals[i * 3] = mesh->mNormals[i].x; 
     normals[i * 3 + 1] = mesh->mNormals[i].y; 
     normals[i * 3 + 2] = mesh->mNormals[i].z; 
     if (mesh->mTextureCoords[0]) // Does the mesh contain texture coordinates? 
     { 
      texCoords[i * 2] = mesh->mTextureCoords[0][i].x; 
      texCoords[i * 2 + 1] = mesh->mTextureCoords[0][i].y; 
     } 
     else 
      texCoords[i * 2] = texCoords[i * 2 + 1] = 0.0f; 
     Debug::Log("vertex: " + std::to_string(vertices[i * 3]) + "," + std::to_string(vertices[i * 3 + 1]) + "," + std::to_string(vertices[i * 3 + 2])); 
    } 
    // Process indices 
    for (GLuint i = 0; i < mesh->mNumFaces; i++) 
    { 
     aiFace face = mesh->mFaces[i]; 
     for (GLuint j = 0; j < face.mNumIndices; j++) 
      indicesList.push_back(face.mIndices[j]); 
    } 
    indices = new int[indicesList.size()]; 
    indexLength = indicesList.size(); 
    for (int i = 0; i < (int)indicesList.size(); i++) 
     indices[i] = indicesList[i]; 

    return this->loader.LoadRenderModel(vertices, vertexLength, indices, indexLength, texCoords, texCoordLength, normals, normalLength); 
} 

И результат вершина this object и индексов, сгенерированный код выше here

Сравните результат и OBJ файл. Для объекта дерева obj-файл имеет 624 вершины, но у Assimp есть 927 вершин, а индексы из obj - 310 (строки) * 3 = 930, но индексы, считанные от Assimp, являются 927 индексами. Я думал, что Ассимп обрабатывает данные позади и генерирует указанные индексы и вершины.

Если мне нужно пересчитать индексы, это означает, что мне нужно проверить все вершины для каждой вершины, чтобы найти то же самое и построить индексы ..? Не удалось выяснить, как решить эту проблему.

+0

Увеличение индексов в порядке. В чем вопрос? Вы думаете, что несколько вершин должны быть объединены в один, но они этого не делают? Это было бы проблематично, не видя данных. – keltar

+0

@keltar, для использования краев обрыва, я не мог найти противоположного края из-за отсутствия противоположной пары индексов, или я неправильно понял крах края? – Tokenyet

+0

Если вы хотите объединить вершины между гранями, то да, эти индексы сами по себе не сливаются. Это действительно зависит от того, как вы решили, что вы считаете «вершиной» - какое-то программное обеспечение считает, что это только позиция, в то время как GL/D3D/assimp/etc. собирает все атрибуты в одну вершину и, если хотя бы одно число отличается - существуют разные вершины. Поэтому я попрошу еще раз: вы на 100% уверены, что ваши данные имеют вершины, разделяемые между лицами (включая положение, нормальные, координаты текстур и т. Д.)? Если да, добавьте образец данных, который иллюстрирует вашу проблему. – keltar

ответ

0

Существует два важных момента, чтобы алгоритм работал с Assimp Importer.

  1. Модель должна быть разделяемой вершиной с гранями. Если модель отсутствует, ее необходимо сделать с некоторыми вариантами программного обеспечения 3D-модели. Объект дерева, который я предоставляю в разделе вопросов, мне нужно: удалить дубликаты (удалить дублированные вершины) в блендере и нормальный должен быть только один.

  2. Другое, что нужно отметить, что опция постпроцесса с априори. проверьте документацию Assimp, есть флаг под названием aiProcess_JoinIdenticalVertices, если это не разрешено, Assimp генерирует полностью уникальные индексы для уникальных вершин. Более подробную информацию можно получить по телефону here.