Я пытаюсь реализовать крах в моем игровом движке, есть проблема, вызванная 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 индексами. Я думал, что Ассимп обрабатывает данные позади и генерирует указанные индексы и вершины.
Если мне нужно пересчитать индексы, это означает, что мне нужно проверить все вершины для каждой вершины, чтобы найти то же самое и построить индексы ..? Не удалось выяснить, как решить эту проблему.
Увеличение индексов в порядке. В чем вопрос? Вы думаете, что несколько вершин должны быть объединены в один, но они этого не делают? Это было бы проблематично, не видя данных. – keltar
@keltar, для использования краев обрыва, я не мог найти противоположного края из-за отсутствия противоположной пары индексов, или я неправильно понял крах края? – Tokenyet
Если вы хотите объединить вершины между гранями, то да, эти индексы сами по себе не сливаются. Это действительно зависит от того, как вы решили, что вы считаете «вершиной» - какое-то программное обеспечение считает, что это только позиция, в то время как GL/D3D/assimp/etc. собирает все атрибуты в одну вершину и, если хотя бы одно число отличается - существуют разные вершины. Поэтому я попрошу еще раз: вы на 100% уверены, что ваши данные имеют вершины, разделяемые между лицами (включая положение, нормальные, координаты текстур и т. Д.)? Если да, добавьте образец данных, который иллюстрирует вашу проблему. – keltar