2010-07-26 20 views
13

Ich habe eine Reihe von 3D-Punkten, die eine Oberfläche annähern. Jeder Punkt unterliegt jedoch einem Fehler. Darüber hinaus enthält die Menge an Punkten viel mehr Punkte, als tatsächlich benötigt wird, um die darunter liegende Oberfläche darzustellen.Algorithmus zur Vereinfachung der 3D-Oberfläche?

Was ich suche ist ein Algorithmus, um eine neue (viel kleinere) Reihe von Punkten zu erstellen, die eine vereinfachte, glattere Version der Oberfläche darstellen (bitte um eine bessere Definition als "vereinfacht, glatter"). Die zugrunde liegende Oberfläche ist keine mathematische, daher hoffe ich nicht, den Datensatz an eine mathematische Funktion anzupassen.

+0

Sie können eigentlich nicht beide glatte und einfachere Oberfläche bekommen. Es ist entweder das eine oder das andere. –

+0

@Mikulas Dite technisch kann er nicht (mehr Punkte, komplizierter). Aber wenn er Ausreißer entfernt, kann die Kurve optisch glatter und weniger kompliziert erscheinen. –

+0

Er könnte eine einfachere Oberfläche mit weniger Punkten erhalten, wenn die Oberfläche laut ist, wie bei einem hochauflösenden Laserscan eines Würfels. Das ist etwa so, als würde man nach einem Tiefpassfilter für 3D-Oberflächen fragen. – darron

Antwort

7

Statt mit ihm als Punktwolke zu tun, würde ich empfehlen, ein Netz mit Delaunay-Triangulation Triangulation: http://en.wikipedia.org/wiki/Delaunay_triangulation

Dann das Netz dezimieren. Sie können Dezimierungsalgorithmen erforschen, aber Sie können ziemlich gute schnelle und schmutzige Ergebnisse mit einem Algorithmus erhalten, der nur benachbarte tris mit ähnlichen Normalen zusammenführt.

+1

Ich erinnere mich daran, dass ich in der Schule gelernt habe, dass es Oberflächen gibt, für die keine Triangulation existiert (in 3D). Wenn das OP nicht besorgt ist, über eine solche Oberfläche zu stolpern, ist das in Ordnung. – ldog

+0

Es hängt wirklich von der Eigenschaft Ihrer Punktwolkendaten ab. Wenn es sich um ein Gitter aus Punkten wie eine Höhenkarte handelt, wird dieser Ansatz sehr einfach sein. Wenn es eine amorphe Punktwolke ist, dann funktioniert das vielleicht nicht für Sie. Es gibt ganze Anwendungen, die der Erzeugung von Oberflächen aus komplexen Punktwolkendaten gewidmet sind, so dass dies ein ziemlich schwieriges Problem ist, wenn es nicht eingeschränkt ist. – bshields

+0

Delauney ist nur sehr gut für 2.5D - aber für Heightfield-Daten ist es ein sehr guter Start vor dem erneuten Griding –

1

Ich denke, dass Sie nach Algorithmen für "Detaillierungsgrad" suchen.

Eine einfache zu implementieren ist, Ihr Volumen (Oberfläche) in eine Anzahl von Teilvolumina zu brechen. Wählen Sie aus den Punkten in jedem Teilvolumen einen repräsentativen Punkt aus (z. B. den, der dem Mittelpunkt am nächsten liegt oder dem Durchschnitt oder dem Durchschnitt usw. am nächsten ist). Verwende diese Punkte, um deine Oberfläche neu zu zeichnen.

Sie können die Anzahl der Teilvolumina optimieren, um Details im laufenden Betrieb zu erhöhen/zu verringern.

0

Wenn Sie Ihre Oberfläche nicht irgendwie parametrisieren, bin ich mir nicht sicher, wie Sie entscheiden können, welche Punkte ähnliche Informationen enthalten (und somit weggeworfen werden können).

Ich denke, Sie können eine Reihe von Punkten nach dem Zufallsprinzip wählen, um loszuwerden, aber das klingt nicht wie, was Sie tun möchten.

möglicherweise Punkte nahe beieinander (für einige Definition von "nahe") kann als ähnliche Informationen enthalten und so auf einzelne Vertreter für jede solche Gruppe reduziert werden.

könnten Sie weitere Details angeben?

1

Ich würde das nähern, indem ich nach Scheitelpunkten (Punkten) suche, die wenig zur Krümmung der Oberfläche beitragen. Finde alle Seiten, die von jedem Eckpunkt ausgehen, und nimm die Skalarprodukte von Paaren (?) Von ihnen. Die Punkte, die sehr flache "Hügel" darstellen, werden große Winkel einschließen (nahe 180 Grad) und kleine Punktprodukte aufweisen.

Die Scheitelpunkte mit den kleinsten Zahlen wären dann Kandidaten für die Entfernung. Die Ecken um sie herum bilden dann eine Ebene.

Oder so etwas.

1

Google für Hugues Hoppe und seine Arbeit "Oberflächenrekonstruktion".

Oberflächenrekonstruktion wird verwendet, um eine vermaschte Oberfläche für die Punktwolke zu finden; Dieses Verfahren liefert jedoch Lose von Dreiecken. Sie können dann eine Reduzierungstechnik anwenden, um die Anzahl der Polygone so zu reduzieren, dass der Fehler minimiert wird. Als Beispiel können Sie sich die Dezimierungsmethoden von OpenMesh ansehen.

OpenMesh

Hugues Hoppe

1

Es gibt mehrere verschiedene Techniken für die punktbasierten Oberflächenmodellvereinfachung, einschließlich:

  • clustering;
  • Teilchensimulation;
  • iterative Vereinfachung.

Siehe Umfrage:

M. Pauly, M. Gross und L. P. Kobbelt. Effiziente Vereinfachung von Punkt- gesampelten Oberflächen. In Proceedings der Konferenz über Visualisierung'02, Seiten 163-170, Washington, DC, 2002. IEEE.

+2

Willkommen bei Stackoverflow! Könnten Sie Ihrer Antwort weitere Details hinzufügen (z. B. Beschreibungen von Techniken hinzufügen)? Antworten auf stackoverflow müssen ausreichende Informationen haben, um die Antwort zu verstehen. Link-Only-Antworten werden [entmutigt] (http://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when--annanswer-not-an-answer) –

0

Es ist einfacher, eine Punktwolke ohne die Beschränkungen von Netzdreiecken und Indizes zu vereinfachen.

Glättung und Vereinfachung sind jedoch unterschiedliche Aufgaben. Um die Cloud zu vereinfachen, sollten Sie zuerst Rauschartefakte beseitigen, indem Sie ein Profil der Art des Rauschens, das Sie haben, Frequenz- und Richtcharakteristiken erstellen und ein Rauschprofil im Vergleich zur Typreduktion durchführen. gute normale Vektoren sind dafür hilfreich.

hier ist ein Dokument, etwa 5-6 Vereinfachungen mit Delauney, voronoi und k nächsten Nachbarn Mathematik:

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

Eine spätere Version von 2008: http://www.wseas.us/e-library/transactions/research/2008/30-705.pdf

hier ist ein kürzliches, C++ Version: https://github.com/tudelft3d/masbcpp/blob/master/src/simplify.cpp

Verwandte Themen