#c #cgal
#c #cgal
Вопрос:
Я использую CGAL 5.1 с типом ядра typedef CGAL::Simple_cartesian<float> Kernel;
и типом сетки поверхности typedef CGAL::Surface_mesh<Kernel::Point_3> Mesh;
Я загружаю сетку через Assimp, и все кажется нормальным. Но когда я запускаю edge_collapse, я получаю сбой утверждения CGAL_assertion(resulting_vertex_count == vertices(m_tm).size());
, и, конечно же, вычисление общего количества вершин за вычетом количества удаленных вершин показывает, что оно отключено на единицу, независимо от установленного мной соотношения.
Соответствующий код:
if(!CGAL::is_triangle_mesh(*node->mesh_info.mesh))
{
std::cerr << "Input geometry is not triangulated." << std::endl;
return;
}
if(!is_valid_polygon_mesh(*node->mesh_info.mesh))
{
std::cerr << "Input geometry is not valid." << std::endl;
return;
}
SMS::Count_ratio_stop_predicate<Mesh> stop(reduction);
SMS::edge_collapse(*node->mesh_info.mesh, stop);
Два теста прошли нормально, так есть ли что-то очевидное, чего мне не хватает? Я еще не пробовал другие алгоритмы и не устанавливал какие-либо дополнительные свойства. Я очистил сетку, используя инструменты Assimp для удаления вырожденных граней и ребер и объединения совпадающих вершин, но я не пробовал ни один из инструментов CGAL.
У меня есть свойство «v: uv» для каждой вершины, но свойство position равно значению по умолчанию.
Если кто-нибудь может дать мне проверку работоспособности, я был бы признателен!
Комментарии:
1. Не могли бы вы поделиться входной сеткой, чтобы мы могли попытаться воспроизвести проблему? Минимальный cpp тоже был бы хорош.
Ответ №1:
Пытаясь изолировать проблему для публикации здесь, я начал играть и обнаружил, что из-за того, что моя сетка шумная и неоднородная — это фотограмметрическое сканирование, — стандартная стратегия упрощения нарушала мои границы. Игнорирование утверждения только что привело к появлению морской звезды.
Итак, я последовал примеру в руководстве пользователя и пометил свои границы как несъемные, и теперь это намного лучше.