我最近开始在一个需要细化网格的项目中使用 OpenMesh。我需要使用面 split(FaceHandle _fh, Point _p)
操作在三角形的质心处插入一个顶点。
但是,当我使用此方法并尝试使用 VertexFaceIterator 获取新创建的顶点的面时,我总是会得到顶点索引为 (87, 87, -1) 或 (12, 12, -1) 的无效面。似乎 OpenMesh 在 split 后没有更新网格拓扑。
我的代码看起来像这样。 faceStartIt
为我提供了这些奇怪的索引。
typedef OpenMesh::TriMesh_ArrayKernelT<> TriMesh;
TriMesh::FaceIter triangleIt = mesh.faces_begin();
for( ; triangleIt != mesh.faces_end(); )
{
TriMesh::Point centroid = mesh.calc_face_centroid( *triangleIt );
if( hasToSplit( centroid ) )
{
TriMesh::VertexHandle centroidHandle = mesh.split( *triangleIt, centroid );
TriMesh::VertexFaceIter faceStartIt = mesh.vf_begin( centroidHandle );
TriMesh::VertexFaceIter faceEndIt = mesh.vf_end( centroidHandle );
TriMesh::VertexFaceIter faceIt = faceStartIt; //faceIt++;
for( ; faceIt != faceEndIt; ++faceIt )
{
// Do something for each face
}
}
else
{
++triangleIt;
}
}
最佳答案
我发现了我遇到的问题。 split
方法工作正常,我做错的是在 //Do something for each face
注释中。对于每张脸,我都在进行边缘翻转操作,但引用丢失了,因为翻转会导致后来评估的脸发生变化。解决方案是在一次迭代中,在分割一个面之后,将我想要翻转的每条边插入 std::set
以保证它们是唯一的。然后在另一次迭代中在标记的边缘上进行实际翻转。
关于c++ - OpenMesh 面分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41008298/