c++ - CGAL:加载 .off 文件后如何访问顶点颜色?

标签 c++ visual-studio 3d cgal

加载 .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 不会复制颜色属性,所以我想我需要不同的方法?

最佳答案

您需要使用 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 检查 map 是否存在。

关于c++ - CGAL:加载 .off 文件后如何访问顶点颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55955579/

相关文章:

c++ - 传递对指针的引用

c++ - 在有足够空间的情况下加载到 Array 会导致 Stack Smashing?

c++ - 定点硬件光线追踪产品补偿

c# - vs 2008企业版调试线程--c#

c++ - fatal error : "No Target Architecture" in Visual Studio

c# - 不再在 docker 中使用 dotnet watch 的理由是什么

python - openGL(pyglet) 3d 场景无法在 AMD 显卡上正确渲染

javascript - 如果发生碰撞,如何使用光线转换防止变换控制移动对象?

c++ - 为什么在这种情况下成员变量改变了,而对象的地址却保持不变?

java - 3D 投影不起作用