Недавно я начал использовать OpenMesh в проекте, где мне нужно улучшать сетки. Мне нужно использовать лицо split(FaceHandle _fh, Point _p)
операция вставки вершины в центр тяжести треугольника.
Но когда я использую этот метод и пытаюсь получить грани вновь созданной вершины с помощью VertexFaceIterator, я всегда получаю недопустимые грани с индексами вершин, такими как (87, 87, -1) или (12, 12, -1). Кажется, что 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;
}
}
Я понял проблему, с которой столкнулся. split
метод работает нормально, то, что я делал неправильно, было внутри // Do something for each face
комментарий. Для каждой грани я выполнял операции переворота ребер, но ссылки терялись, потому что переворот вызывает изменения на более поздних гранях, которые оцениваются. Решение состояло в том, чтобы за одну итерацию, после разделения грани, вставить каждое ребро, которое я хотел перевернуть в std::set
чтобы гарантировать, что они были уникальными. Затем в другой итерации выполняйте фактические отражения на отмеченных ребрах.
Других решений пока нет …