我试图创建一个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?
答案 0 :(得分:1)
问题是,直接从原始数据读取我的网格物体会导致它们有很多重复的顶点,从而又搞砸了连接性。
如果您致电
CGAL :: Polygon_mesh_processing :: stitch_borders(mesh);
和mesh.collect_garbage()(如果需要)可以解决连接问题。