2015-01-11 8 views
0

В моем приложении я работаю с множеством треугольных сеток, и иногда мне нужно уменьшить количество треугольников в них (разбить несколько ребер). Для работы с сеткой я использую openmesh (openmesh.org), поскольку он является современным (C++), но главным образом потому, что он не перетаскивает огромное количество зависимостей с ним (зависит только от C++ std и любого современного компилятора может справиться с ним (мне нужно быть кроссплатформенным Linux/Windows/Mac OSX)).OpenMesh, прореживание, Lindstrom-Turk

Теперь мне нужно уменьшить (decimate в терминологии openmesh) некоторые сетки, но мне нужно сохранить границы. (рассматриваемые сетки были оригинальной сеткой (512x512), но в центре их были экструдированы/добавлены некоторые конвективные элементы, важно, чтобы после восстановления внешние края сетки по-прежнему образовывали прямоугольник)

Я не вижу никакого способа чтобы декомпрессировать их в openmesh и сохранить объем/схему, все модули декомпрессии OpenMesh :: Decimater :: Mod * используют квадрику в качестве своей базы.

В GTS (GNU Triangulated Surface Library) реализовано сокращение Lindstrom-Turk, которое идеально подходит для моих нужд (я сделал какой-то грязный wraper для проверки, если это то, что я хочу), и он работает, , но с GTS есть проблемы - это не многопоточное сохранение (я сокращаю много сеток по нескольким потокам), а с помощью GTS это невозможно, так как он использует глобальные переменные внутри библиотеки, чтобы отключить/включить некоторые вещи при уменьшении сетки: /) (и это также перетащить вся бойкий, как это зависимости)

Существует также CG и он также имеет Линдстр-Turk реализован, но это перетащить весь импульс и другие зависимости с самими собой:/

Есть ли какой-нибудь дециматорный модуль для openmesh, который выполняет прореживание с сохранением границы/объема? (Я искал, но не нашел ни одного: /)

+0

Обратите внимание, что с последней версией CGAL (4.5) вы можете напрямую применить алгоритм упрощения на OpenMesh HDS без необходимости конвертировать его в CGAL HDS. Единственными зависимостями, требуемыми CGAL, являются повышение и GMP. – sloriot

+0

«only» boost:] - вот почему я прошу ... Я пытаюсь избежать зависимости от перенапряжения ... – user2441788

+0

К любопытству, почему повышение в качестве зависимости является такой проблемой? – sloriot

ответ

1

Насколько я понимаю, с помощью «границ сетки» вы имеете в виду края сетки, которые образуют только одну грань сетки (например, внешние грани сетки 512x512 в вашем примере) , в отличие от более распространенного случая, когда каждый край сетки разделяется между двумя или более гранями сетки.

В OpenMesh на самом деле довольно простой способ сообщить модулю OpenMesh::Decimater, чтобы сохранить эти ребра как есть. Более того, он не зависит от типа используемого вами модуля прореживания. Фактическая структура данных ячейки (то есть OpenMesh::TriMesh_ArrayKernelT<>) имеет функцию, называемую «блокировка вершин». По сути, это способ сообщить OpenMesh не касаться определенного набора вершин независимо от того, что во время прореживания.

Вот фрагмент кода прямо из official documentation, изменили немного для C++ 11:

using Mesh = OpenMesh::TriMesh_ArrayKernelT<>; 

void protectMeshBoundariesFromDecimation(Mesh& mesh) { 
    mesh.request_vertex_status(); 

    for (const auto& halfEdgeHandle : mesh.halfedges()) { 
     if (mesh.is_boundary(halfEdgeHandle)) { 
     mesh.status(mesh.to_vertex_handle(halfEdgeHandle)).set_locked(true); 
     mesh.status(mesh.from_vertex_handle(halfEdgeHandle)).set_locked(true); 
     } 
    } 
} 

Если вы хотите, чтобы прочитать полную документацию по этому вопросу и по ссылке выше не работает больше, в дереве содержимого документов перейдите к OpenMesh -> Документация OpenMesh -> Документация инструментов OpenMesh -> Рамка дешифрования сетки.

По существу это петли по всем полуребрам (а не ребрам!) Вашей сетки и «блокирует» вершины, которые образуют полуребра, которые не имеют пары (без второго полуребра). Благодаря характеру структур данных с половинным фронтом, которые использует OpenMesh, это сложность для сетки n ребер.

Если вы не знакомы со спецификой структур данных с половинным краем, я бы посоветовал прочитать отличный вводный раздел в файлах OpenMesh "Using and understanding OpenMesh".

 Смежные вопросы

  • Нет связанных вопросов^_^