Ich versuche, den Edge-Kollaps in meiner Game-Engine zu implementieren, es gibt ein Problem, das von Assimp verursacht wird. Die Indizes, die von face.mNumIndices
analysiert werden, sind immer die Indexierung der Inkrementreihenfolge.Edge Collapse mit assimp
Wenn ich die Liste der Indizes überprüfe, sollte der Wert 0,1,2,3,4....,999...
sein. Aber ich weiß, das ist eine Art von mechanism, die von Assimp verwendet wird, und das Objekt wird in Ordnung gerendert. Aber es gibt ein anderes Problem bei Mesh Simplication, ich konnte die Half-Edge-Struktur für diese Indizes nicht erzeugen. Ich blieb ein paar Tage dran und habe keine Antwort. Soll ich Assimp aufgeben? Jede Beratung wird geschätzt.
Bearbeiten: Meine Scheitelpunkte sind zwischen den Gesichtern geteilt, Der Code, den ich verwendet, um die Daten hier zu erhalten.
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);
}
und das Ergebnis Eckpunkten this object und Indizes, die durch den Code erzeugte here
Vergleichen Sie das Ergebnis und OBJ-Datei. Für das Tree-Objekt hat die Obj-Datei 624 Scheitelpunkte, aber Assimp hat 927 Scheitelpunkte und Indizes von Obj sind 310 (Linien) * 3 = 930, aber die von Assimp gelesenen Indizes sind 927-Indizes. Ich dachte, Assimp verarbeitet die Daten dahinter und generiert die angegebenen Indizes und Vertices.
Wenn ich Indizes neu berechnen muss, bedeutet das, dass ich alle Scheitelpunkte für jeden Scheitelpunkt überprüfen muss, um herauszufinden, welche die gleichen sind, und konstruiere die Indizes ..? Konnte nicht herausfinden, wie man dieses Problem slove.
Steigende Indizes sind in Ordnung. Was ist die Frage? Denken Sie, dass mehrere Scheitelpunkte zu einem verschmolzen werden sollten, aber nicht? Das wäre problematisch, ohne Daten zu sehen. – keltar
@keltar, für die Verwendung von Edge-Collapse, konnte ich nicht das Gegenteil von Edge finden, weil es kein entgegengesetztes Indexpaar zu finden gibt, oder ich habe den Edge-Kollaps falsch verstanden? – Tokenyet
Wenn Sie Scheitelpunkte zwischen Gesichtern zusammenführen möchten, dann sind diese Indizes allein nicht kombinierbar. Es hängt wirklich davon ab, wie Sie entschieden haben, was Sie als "Vertex" zählen - einige Software denkt, dass es nur Position ist, während GL/D3D/assimp/etc. fügt alle Attribute zu einem einzelnen Eckpunkt zusammen, und wenn mindestens eine Zahl unterschiedlich ist, gibt es verschiedene Eckpunkte. Also werde ich noch einmal fragen: Sind Sie 100% sicher, dass Ihre Daten Scheitelpunkte haben, die zwischen Gesichtern geteilt werden (dazu gehören Position, Normal, Texturkoordinaten usw.)? Wenn ja, fügen Sie ein Datensample hinzu, das Ihr Problem veranschaulicht. – keltar