Информация о мусоре для лица из файла .ply

Я пытаюсь использовать ASSIMP извлечь информацию о вершине / нормали / грани из файла сгиба и затем отобразить ее, используя OpenGL. Ниже приведен код:

void PLYParser::importFile(std::string sFilePath)
{
const aiScene* scene = aiImportFile (sFilePath.c_str(), aiProcess_Triangulate); // TRIANGLES!

if (!scene)
{
std::cerr << "ERROR: reading mesh %s\n" << sFilePath << std::endl;
return;
}

printf ("  %i animations\n", scene->mNumAnimations);
printf ("  %i cameras\n", scene->mNumCameras);
printf ("  %i lights\n", scene->mNumLights);
printf ("  %i materials\n", scene->mNumMaterials);
printf ("  %i meshes\n", scene->mNumMeshes);
printf ("  %i textures\n", scene->mNumTextures);

for (unsigned int m_i = 0; m_i < scene->mNumMeshes; m_i++)
{
const aiMesh* mesh = scene->mMeshes[m_i];
printf ("    %i vertices in mesh\n", mesh->mNumVertices);
g_point_count = mesh->mNumVertices;
for (unsigned int v_i = 0; v_i < mesh->mNumVertices; v_i++)
{
if (mesh->HasPositions ())
{
const aiVector3D* vp = &(mesh->mVertices[v_i]);
printf ("      vp %i (%f,%f,%f)\n", v_i, vp->x, vp->y, vp->z);
}
if (mesh->HasNormals ())
{
const aiVector3D* vn = &(mesh->mNormals[v_i]);
printf ("      vn %i (%f,%f,%f)\n", v_i, vn->x, vn->y, vn->z);
}
if (mesh->HasTextureCoords (0))
{
const aiVector3D* vt = &(mesh->mTextureCoords[0][v_i]);
printf ("      vt %i (%f,%f)\n", v_i, vt->x, vt->y);
}
if (mesh->HasTangentsAndBitangents ())
{
// NB: could store/print tangents here
}

if( mesh->HasFaces() )
{
const struct aiFace * vf = &(mesh->mFaces[m_i]);
if (vf->mNumIndices == 3)
{
printf ("      vf (%f,%f,%f)\n", vf->mIndices[0],vf->mIndices[1], vf->mIndices[2]);
}
}
}
}

std::cout << "Parsing over" << std::endl ;
}

Значения вершин печатаются нормально, но информация, связанная с лицами, является своего рода мусором, что-то вроде этого:

vp 5107 (0.003326,0.079200,0.001920)
vf (0.000000,-0.000000,26815622223676999148426976713858144581866377154979840994523259353566101584147672957460702289212360863380556296293016572911077072166495943380764853993996288.000000)

Q1. Я делаю что-то не так в коде, связанном с лицом?

Q2. Кроме того, похоже, что ни в одном из файлов ply, которые я анализирую, нет нормальной связанной информации. Я должен вручную рассчитать нормальное для всего. У сгиба нет нормальной информации вообще?

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


Изменить 1:

for (unsigned int m_i = 0; m_i < scene->mNumMeshes; m_i++)
{
const aiMesh* mesh = scene->mMeshes[m_i];
printf ("    %i vertices in mesh\n", mesh->mNumVertices);
g_point_count = mesh->mNumVertices;

for (unsigned int v_i = 0; v_i < mesh->mNumFaces; v_i++)
{
if (mesh->HasFaces())
{
for (unsigned int f_i = 0; f_i < mesh->mNumFaces; f_i++)
{
const struct aiFace* vf = mesh->mFaces + f_i;

if (vf->mNumIndices == 3)
{
printf("      vf (%u,%u,%u)\n", vf->mIndices[0], vf->mIndices[1], vf->mIndices[2]);
}
}
}
}
}

Получаю альтернативные числа в качестве выходных данных, меняя код на выше —

  vf (0,1,2)
vf (3,4,5)
vf (6,7,8)
vf (9,10,11)
vf (12,13,14)
vf (15,16,17)
..
..
and so on.

0

Решение

A1.

Первая проблема:

printf ("      vf (%f,%f,%f)\n", vf->mIndices[0], vf->mIndices[1], vf->mIndices[2]);

Тип vf->mIndices является unsigned int*поэтому спецификатор формата %f это неправильно, это должно быть %u, Попробуйте это вместо этого:

printf ("      vf (%u,%u,%u)\n", vf->mIndices[0], vf->mIndices[1], vf->mIndices[2]);

Второй выпуск:

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

for (unsigned int v_i = 0; v_i < mesh->mNumVertices; v_i++)
{
// ...
}

if (mesh->HasFaces())
{
for (unsigned int f_i = 0; f_i < mesh->mNumFaces; f_i++)
{
const struct aiFace* vf = mesh->mFaces + f_i;

if (vf->mNumIndices == 3)
{
printf("      vf (%u,%u,%u)\n", vf->mIndices[0], vf->mIndices[1], vf->mIndices[2]);
}
}
}

A2.

Для каждой вершины может быть указана нормальная информация (3 дополнительных float свойства на элемент вершины с именем nx, ny а также nz) в файле PLY. Поскольку формат гибкий, нормальный для лица также может быть указан аналогичным образом. Все зависит от того, что было экспортировано инструментом, использованным для создания этого файла.

1

Другие решения

Других решений пока нет …