CGAL:从表面网格获取面部数据

问题描述 投票:1回答:2

我正在尝试使用从CGAL :: Surface_mesh检索的数据填充我自己的结构。

您可以通过以下方式将面添加到曲面网格中。

CGAL::SM_Face_index face = SM_Surface_Mesh.add_face(SM_Vertex_Index, SM_Vertex_Index, SM_Vertex_Index);

..但是如何在给定SM_Face_Index的情况下检索该面部?我试过筛选文档,但无济于事。

InteropMesh * outputMesh = new InteropMesh();
uint32_t num = mesh1.number_of_vertices();

outputMesh->vertexCount = num;

outputMesh->vertices = new InteropVector3[num];

for (Mesh::Vertex_index vd : mesh1.vertices()) 
{
    uint32_t index = vd; //via size_t

    Point data = mesh1.point(vd);
    outputMesh->vertices[index].x = (float)data.x();
    outputMesh->vertices[index].y = (float)data.y();
    outputMesh->vertices[index].z = (float)data.z();
}

outputMesh->indices = new uint32_t[mesh1.number_of_faces() * 3];

for (CGAL::SM_Face_index fd : mesh1.faces())
{
    //? How do I get the three vertex indices?
}
c++ cgal
2个回答
2
投票

Surface_mesh数据结构不仅可以表示三角形网格。这意味着每个面可能有超过3个顶点。获得面后,您可以在其边界上导航并获取源顶点和目标顶点。

例如,您可以这样做:

Surface_mesh::Halfedge_index hf = sm.halfedge(fi);
for(Surface_mesh::Halfedge_index hi : halfedges_around_face(hf, sm))
{
  Surface_mesh::Vertex_index vi = target(hi, sm);
}

你也可以手工完成:

Surface_mesh::Halfedge_index hstart = sm.halfedge(fi), hi=hstart;
do{
  Surface_mesh::Vertex_index vi = target(hi, sm);
  hi=sm.next(hi);
}
while(hi!=hstart)

3
投票

获取顶点和面部索引的简单方法可以这样做;

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Surface_mesh<K::Point_3> Mesh;

Mesh sm;

// sm created here or as a result of some CGAL function

std::vector<float> verts;
std::vector<uint32_t> indices;

//Get vertices ...
for (Mesh::Vertex_index vi : sm.vertices()) {
    K::Point_3 pt = sm.point(vi);
    verts.push_back((float)pt.x());
    verts.push_back((float)pt.y());
    verts.push_back((float)pt.z());
}

//Get face indices ...
for (Mesh::Face_index face_index : sm.faces()) {
    CGAL::Vertex_around_face_circulator<Mesh> vcirc(sm.halfedge(face_index), sm), done(vcirc);
    do indices.push_back(*vcirc++); while (vcirc != done);
}

这个例子假设三角形输出(即每3个指数描述一个三角形),尽管面部可以有更多的指数,正如安德指出的那样。

如果有超过3个索引,则应添加另一个函数来检查面部索引计数并将面拆分为三角形。

© www.soinside.com 2019 - 2024. All rights reserved.