尝试创建SurfaceMesh,但存在连接问题

时间:2019-06-15 10:41:21

标签: c++ cgal

我试图创建一个SurfaceMesh传递给cgal参数化函数,但是我在连接方面遇到问题。我有一个顶点和索引列表,并且我正在使用以下代码来生成曲面网格:

SurfaceMesh mesh;

//add vertices
QVector<vertex_descriptor> vertex_descriptors = QVector<vertex_descriptor>(m_vertices.size());

for (int i = 0; i < m_vertices.size(); ++i) {
    _Vertex v = m_vertices[i];
    vertex_descriptors[i] = mesh.add_vertex(Point_3(v.getX(), v.getY(), v.getZ()));
}

QVector<face_descriptor> face_descriptors = QVector<face_descriptor>(m_indices.size() / 3);
//add surfaces
int j = 0;
for (int i = 0; i < m_indices.size(); ++i) {
    vertex_descriptor x = vertex_descriptors[m_indices[i++]];
    vertex_descriptor y = vertex_descriptors[m_indices[i++]];
    vertex_descriptor z = vertex_descriptors[m_indices[i]];
    face_descriptor tmp = mesh.add_face(x,y,z);
    face_descriptors[j++] = tmp;
}

网格看起来是有效的,但边界的半边似乎被弄乱了。为了找到问题,我尝试像这样遍历Halfedges:

for(vertex_descriptor v: mesh.vertices())
{
    qInfo() << "Check Vertex " << v;

    for(halfedge_descriptor hi : halfedges_around_target(v, mesh))
    {
        qInfo() << "check halfedge" << hi;
        if ( mesh.face(hi) == SurfaceMesh::null_face())
        {
           qInfo() << "BORDER FOUND" << hi;
        }
    }
}

这将返回以下重复序列:

Check Vertex  0
check halfedge 1
BORDER FOUND 1
check halfedge 4
Check Vertex  1
check halfedge 3
BORDER FOUND 3
check halfedge 0
Check Vertex  2
check halfedge 5
BORDER FOUND 5
check halfedge 2
Check Vertex  3
check halfedge 7
BORDER FOUND 7
check halfedge 10
Check Vertex  4
check halfedge 9
BORDER FOUND 9
check halfedge 6

如此看来,由mesh.add_face()创建的面显然已正确连接到现有的半边,并且彼此独立。网格将无法通过cgal进行参数设置。

我已经测试了几种不同的网格,甚至那些应该被封闭的网格也仍然对顶点入射半边之一返回true。

如何创建正确连接的SurfaceMesh?

1 个答案:

答案 0 :(得分:1)

问题是,直接从原始数据读取我的网格物体会导致它们有很多重复的顶点,从而又搞砸了连接性。

如果您致电

CGAL :: Polygon_mesh_processing :: stitch_borders(mesh);

和mesh.collect_garbage()(如果需要)可以解决连接问题。