Я пытаюсь использовать 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.
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. Поскольку формат гибкий, нормальный для лица также может быть указан аналогичным образом. Все зависит от того, что было экспортировано инструментом, использованным для создания этого файла.
Других решений пока нет …