Сбой программы при создании VertexPointer из более чем 400 тыс. вершин в VCG

Я новичок в VCG и столкнулся с проблемой создания VertexPointer размером 400K+ Vertex. Фактический вопрос был задан здесь в комментарии решения .

Я попытался сделать массив VertexPointer

MyMesh::VertexPointer vi[400000];

Программа вылетает без ошибки в приведенной выше строке кода.

Это декларация MyMesh

class MyFace;
class MyVertex;

struct MyUsedTypes : public vcg::UsedTypes< vcg::Use<MyVertex>::AsVertexType,
vcg::Use<MyFace>::AsFaceType>{};

class MyVertex  : public vcg::Vertex< MyUsedTypes, vcg::vertex::Coord3f,  vcg::vertex::Normal3f, vcg::vertex::VFAdj, vcg::vertex::BitFlags, vcg::vertex::Mark>{};
class MyFace    : public vcg::Face  < MyUsedTypes, vcg::face::VertexRef,   vcg::face::Normal3f, vcg::face::FFAdj, vcg::face::Mark, vcg::face::VFAdj,  vcg::face::BitFlags > {};
class MyMesh    : public vcg::tri::TriMesh< std::vector<MyVertex>, std::vector<MyFace> > {};

Я хотел спросить, можно ли как-нибудь вставить вершины и нормали в сетку типа MyMesh. Пожалуйста помоги. Спасибо.


person Teh Sunn Liu    schedule 13.01.2017    source источник
comment
Правильный инструмент для решения этой проблемы — ваш отладчик. Но вы, вероятно, получаете переполнение стека.   -  person rustyx    schedule 13.01.2017
comment
Спасибо за ответ. На самом деле я хотел спросить, есть ли правильный способ вставки вершин и нормалей в меш типа MyMesh. Я просто отредактирую вопрос   -  person Teh Sunn Liu    schedule 13.01.2017
comment
Так решение сработало? Если это так, пожалуйста, проголосуйте за ответ!   -  person Deepfreeze    schedule 18.01.2017


Ответы (1)


Это должно помочь вам начать. В основном вам нужно использовать распределители. Хороший способ узнать, как работает VCG, — просмотреть примеры и функции загрузки/сохранения, которые vcg имеет для разных форматов файлов.

void MeshConversion::convertPclToVcg (const PclMesh& meshIn, VcgMesh& meshOut)
{
    // VCG mesh clearing
    meshOut.Clear();

    // Create temporary cloud in to have handy struct object
    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud1 (new pcl::PointCloud<pcl::PointXYZRGBA> ());
    pcl::fromPCLPointCloud2(meshIn.cloud,*cloud1);
    // Now convert the vertices to VCG VcgMesh
    int vertCount = cloud1->width*cloud1->height;
    vcg::tri::Allocator<VcgMesh>::AddVertices(meshOut, vertCount);
    for(int i=0;i<vertCount;++i)
    {
        meshOut.vert[i].P()=vcg::Point3f(cloud1->points[i].x,cloud1->points[i].y,cloud1->points[i].z);
        meshOut.vert[i].C()=vcg::Color4b(cloud1->points[i].r,cloud1->points[i].g,cloud1->points[i].b,cloud1->points[i].a);
    }
    // Now convert the polygon indices to VCG VcgMesh => make VCG faces..
    int triCount = meshIn.polygons.size();
    if(triCount==1)
    {
        if(meshIn.polygons[0].vertices[0]==0 && meshIn.polygons[0].vertices[1]==0 && meshIn.polygons[0].vertices[2]==0)
            triCount=0;
    }
    vcg::tri::Allocator<VcgMesh>::AddFaces(meshOut, triCount);
    for(int i=0;i<triCount;++i)
    {
        meshOut.face[i].V(0)=&meshOut.vert[meshIn.polygons[i].vertices[0]];
        meshOut.face[i].V(1)=&meshOut.vert[meshIn.polygons[i].vertices[1]];
        meshOut.face[i].V(2)=&meshOut.vert[meshIn.polygons[i].vertices[2]];
    }

    vcg::tri::UpdateBounding<VcgMesh>::Box(meshOut);
    vcg::tri::UpdateNormal<VcgMesh>::PerFace(meshOut);
    vcg::tri::UpdateNormal<VcgMesh>::PerVertexNormalizedPerFace(meshOut);
}
person Deepfreeze    schedule 13.01.2017
comment
Да. Этот метод прекрасно работает. Спасибо за Ваш ответ - person Teh Sunn Liu; 19.01.2017