2010-07-26 5 views
13

У меня есть набор трехмерных точек, которые аппроксимируют поверхность. Однако каждая точка подвержена некоторой ошибке. Кроме того, набор точек содержит намного больше очков, чем на самом деле необходимо для представления подстилающей поверхности.Алгоритм упрощения 3d-поверхности?

Что я ищу - это алгоритм для создания нового (гораздо меньшего) набора точек, представляющего упрощенную, более плавную версию поверхности (прощение за то, что оно не имеет более четкого определения, чем «упрощенное, более плавное»). Подстилающая поверхность не является математической, поэтому я не надеюсь подогнать набор данных к некоторой математической функции.

+0

Вы не можете получить более гладкую и простую поверхность. Это либо одно, либо другое. –

+0

@ Микулас Dite технически он не может (больше очков, сложнее). Но визуально, если он удаляет выбросы, кривая может казаться более гладкой и менее сложной. –

+0

Он мог получить более простую поверхность с меньшим количеством точек, если поверхность шумная, как лазерное сканирование с высоким разрешением куба. Это похоже на запрос фильтра низких частот для 3D-поверхностей. – darron

ответ

7

Вместо того, чтобы справиться с ним, как облако точек, я бы порекомендовал триангуляции сетку с помощью триангуляции Делоне: http://en.wikipedia.org/wiki/Delaunay_triangulation

Затем проредить сетку. Вы можете исследовать алгоритмы прореживания, но вы можете получить довольно хорошие быстрые и грязные результаты с помощью алгоритма, который просто объединяет соседние трис, имеющие похожие нормали.

+1

Я помню, как учился в школе, что есть поверхности, для которых нет триангуляции (в 3D.) Если OP не беспокоится о том, чтобы наткнуться на такую ​​поверхность, это прекрасно. – ldog

+0

Это действительно зависит от свойства ваших данных облака точек. Если это сетка точек, например карта высоты, то такой подход будет очень прост. Если это более аморфное облако очков, то это может не сработать для вас. Существуют целые приложения, предназначенные для создания поверхностей из сложных данных облачных точек, поэтому это довольно сложная проблема, если не ограничена. – bshields

+0

Delauney действительно хорош для 2.5D - но для данных высоты поля это очень хороший способ начать работу перед повторной сеткой –

1

Я думаю, что вы ищете алгоритмы «Уровень детализации».

Простой вариант - разбить объем (поверхность) на некоторое количество подтомов. Из точек в каждом субтомнике выберите репрезентативную точку (например, ближайшую к центру или ближайшую к среднему или среднюю и т. Д.). используйте эти точки, чтобы перерисовать свою поверхность.

Вы можете настроить количество подтомов для увеличения/уменьшения деталей на лету.

0

Если вы не параметризуете свою поверхность каким-то образом, я не уверен, как вы можете решить, какие точки несут подобную информацию (и, таким образом, могут быть выброшены).

Я думаю, вы можете выбрать кучу точек наугад, чтобы избавиться, но это не похоже на то, что вы хотите сделать.

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

Вы могли бы дать более подробную информацию?

1

Я подошел бы к этому, ища вершины (точки), которые мало влияют на кривизну поверхности. Найдите все стороны, выходящие из каждой вершины, и возьмем точечные произведения их пар (?). Точки, представляющие очень мелкие «холмы», будут вызывать огромные углы (около 180 градусов) и иметь мелкие точечные произведения.

Эти вершины с наименьшими числами затем будут кандидатами на удаление. Вершины вокруг них затем образуют плоскость.

Или что-то в этом роде.

1

Google для Hugues Hoppe и его работы по «восстановлению поверхности».

Реконструкция поверхности используется для нахождения сетчатой ​​поверхности, соответствующей точечному облаку; однако этот метод дает лотов треугольников. Затем вы можете применить меш к методу сокращения, чтобы уменьшить количество полигонов, чтобы минимизировать ошибку. В качестве примера вы можете посмотреть методы декомпрессии OpenMesh.

OpenMesh

Hugues Hoppe

1

Там существует несколько различных методов для точки на основе поверхностной модели упрощения, в том числе:

  • кластеризации;
  • моделирование частиц;
  • итерационное упрощение.

Смотрите опрос:

М. Pauly, М. Гросс, Л. П. Kobbelt. Эффективное упрощение точечных поверхностей. В Трудах конференции по визуализации'02, стр. 163-170, Вашингтон, О.К., 2002. IEEE.

+2

Добро пожаловать в Stackoverflow! Могли бы вы добавить дополнительные сведения к своему ответу (например, добавить описания методов)? Ответы на stackoverflow должны иметь достаточную информацию для понимания ответа. Ответы только на связь [обескуражены] (http://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when-is-an-answer-not-an-answer) –

0

Проще упростить облако точек без ограничений треугольников и индексов сетки.

сглаживание и упрощение - это разные задачи. Чтобы упростить облако, вы должны сначала избавиться от артефактов шума, сделав профиль такого шума, который у вас есть, его частотные и направленные характеристики и сделайте профиль шума по сравнению с уменьшением типа. хорошие нормальные векторы - это helfpul.

вот документ 5-6 упрощения с использованием Делона Вороного, а к ближайшим соседям по математике:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.10.9640&rep=rep1&type=pdf

Более поздняя версия с 2008 года: http://www.wseas.us/e-library/transactions/research/2008/30-705.pdf

Вот недавно с ++ версия: https://github.com/tudelft3d/masbcpp/blob/master/src/simplify.cpp

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