CGAL: Как я могу получить доступ к цветам вершин после загрузки файла .off? - PullRequest
0 голосов
/ 02 мая 2019

Загрузка файлов .off проста:

typedef CGAL::Simple_cartesian<double>  Kernel;
typedef CGAL::Surface_mesh<Kernel::Point_3> SurfaceMesh;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;

...

SurfaceMesh surface;
Polyhedron poly;
std::fstream inputOffFile( "myFile.off" );
inputOffFile >> poly;
CGAL::copy_face_graph( poly, surface);

Затем я могу перебрать координаты вершины по:

std::vector<float> verts;
for( SurfaceMesh::Vertex_index vi : surface.vertices() )
{
    Point pt = surface.point( vi );
    verts.push_back( pt.x() );
    verts.push_back( pt.y() );
    verts.push_back( pt.z() );
}

Но как я могу получить доступ к цветам вершин, которые тоже были сохранены в файле .off?

РЕДАКТИРОВАТЬ: Вероятно, CGAL :: copy_face_graph не копирует свойство цвета, поэтому я думаю, что мне нужен другой подход?

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Вам необходимо использовать карты свойств вашего SurfaceMesh. Если и только если в файле OFF есть цвета (то есть первая индикация - это COFF, а не OFF в первой строке), и есть цвета для каждой вершины, а не только для грани, то ваш SurfaceMesh будет иметь внутреннюю карту свойств с именем "v: цвет". Вы можете получить к нему доступ, позвонив по номеру

SurfaceMesh::Property_map<SurfaceMesh::Vertex_index, CGAL::Color> vcolors =
      surface.property_map<SurfaceMesh::Vertex_index, CGAL::Color >("v:color").first;

for( SurfaceMesh::Vertex_index vi : surface.vertices() )
{
    CGAL::Color ci = vcolors[vi];
}

Если на лице есть цвета, вы можете получить к ним аналогичный доступ, но с помощью поиска карты свойств, называемой "f: color". Вы можете проверить наличие карты с помощью surface.property_map <......> (...). Second.

0 голосов
/ 06 мая 2019

ОК, вот полное решение, включая доступ к вершинам грани (по необходимости, если вы хотите визуализировать сетку через OpenGL). Работа с SurfaceMesh - это ключ.

...
std::vector<Point> verts;
std::vector<Color> cols;

SurfaceMesh::Property_map<SurfaceMesh::Vertex_index, CGAL::Color> vcolors =
    m_pSurface->property_map<SurfaceMesh::Vertex_index, CGAL::Color >( "v:color" ).first;

bool colorExists = m_pSurface->property_map<SurfaceMesh::Vertex_index, CGAL::Color>( "v:color" ).second;

if( !colorExists ) 
    Error(); 

for( SurfaceMesh::Vertex_index vi : m_pSurface->vertices() )
{
    cols.push_back( vcolors[ vi ] );
    verts.push_back( m_pSurface->point( vi ) );
}

for( SurfaceMesh::Face_index face_index : m_pSurface->faces() )
{
    CGAL::Vertex_around_face_circulator<SurfaceMesh> vcirc( m_pSurface->halfedge( face_index ), *m_pSurface ), done( vcirc );

    signed char count = 0;

    do
    {
        count++;
        uint32_t vertexI = *vcirc++;

        const Point &pt = verts[ vertexI ];
        const Color &col = cols[ vertexI ];

        ...

    } while( vcirc != done );

}

Большое спасибо за полезные комментарии!

...