OpenMesh Face Split

Недавно я начал использовать 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;
}
}

1

Решение

Я понял проблему, с которой столкнулся. split метод работает нормально, то, что я делал неправильно, было внутри // Do something for each face комментарий. Для каждой грани я выполнял операции переворота ребер, но ссылки терялись, потому что переворот вызывает изменения на более поздних гранях, которые оцениваются. Решение состояло в том, чтобы за одну итерацию, после разделения грани, вставить каждое ребро, которое я хотел перевернуть в std::set чтобы гарантировать, что они были уникальными. Затем в другой итерации выполняйте фактические отражения на отмеченных ребрах.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]