1
我最近开始在一个项目中使用OpenMesh,我必须对网格进行细化。我需要使用脸部split(FaceHandle _fh, Point _p)
操作在三角形的质心处插入一个顶点。 但是,当我使用这种方法并尝试使用VertexFaceIterator抓取新创建的顶点的面时,我总是会获得具有诸如(87,87,-1)或(12,12,-1)等顶点索引的无效面。看起来好像OpenMesh在分割之后没有更新网格拓扑。OpenMesh面部分割
我的代码看起来像这样。 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;
}
}
显示实际的输入和输出。此外,'TriMesh'对象确保您对'mesh'所做的更改不会使'triangleIt'无效? – paddy
是的。如果你不使用'garbage_collection()'方法,那么所有迭代器在任何操作之后都应该是有效的。 至于输入和输出,'split'方法返回一个有效的VertexHandle和一个新创建的索引,而'vf_begin'返回一个指向具有这些奇怪索引的面的迭代器。 (87,87,-1)和(12,12,-1)是它返回的实际例子。 不知道这是你输入输出的意思。 – murf
我复制了你的代码(大部分),并为它提供了一个网格示例,但我无法重现你的bug(即所有的手柄都是vaild)。你可以显示你的代码用于输出新面的顶点句柄ID吗? – jsb