PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 'Effizientes' Darstellen von Punktwolken


Hypothraxer
2010-07-27, 19:27:26
Ich habe des öfteren mit Punktwolken (sprich: x y z textfiles) zu tun und würde gerne ab und zu das Ding betrachten wollen, ohne es zu vermaschen. Momentan benutz ich dazu Geomagic aber das bedingt halt, dass ich jedesmal den Rechner wechsle (ich sitze vor einem Linux-Rechner und Geomagic gibt's nur für Windows).

Gibt es C++ libraries, die das importieren von x/y/z-files unterstützen? Irrlicht und Ogre scheinen nur mit Meshes umgehen zu können. Ich schätze mit OpenGL könnte ich mir selber was basteln, ob es dann aber einigermassen performant wird, wage ich zu bezweifeln (ich habe des öfteren 30 Millionen Punkte und mehr...).

schleiftier
2010-07-27, 20:10:20
Direkt einen Tipp habe ich leider nicht, wir haben uns unser Tool zum Anzeigen von Punktwolken selbst geschrieben (mit OpenGL/Qt). Allerdings haben wir bisher auch keine 30 Millionen Punkte verarbeitet...

Darf ich fragen, wo die Punktwolken herkommen? Ich arbeite an einem Projekt, dass sich u.a. mit Punktwolken aus einem Laserscanner befasst und habe selber das Problem, die Punktwolken verarbeiten zu müssen. Womit vermaschst du die Wolken?

Danke,
Frederic

Nighthawk13
2010-07-28, 10:44:49
Ogre kann Point sprites rendern, wäre ne Möglichkeit:
http://89.151.96.106/forums/viewtopic.php?f=5&t=48957&start=0

samm
2010-07-28, 13:16:26
Wenn eure Daten aus ply-Files kommen, und ihr sie z.B. für Ogre aufbereiten müsst, kuckt mal hier http://www.equalizergraphics.com/cgi-bin/viewvc.cgi/trunk/src/examples/eqPly/ die files ply.h / plyfile.cpp (Lese- / Schreibfunktionalität für ASCII und binäre ply-Files) an. Im verlinkten Verzeichnis befindet sich sicher auch ein Anwendungsbeispiel für das Einlesen. Mit dem ganzen dort vorhandenen könnt ihr die Daten auch rendern afaik, aber ich weiss nicht, ob es sich für diese Datenmengen eignet.

Neomi
2010-07-28, 14:19:46
Mit Libraries oder anderen fertigen Lösungen kann ich nicht dienen. Für den Fall, daß du selbst was dafür passendes programmieren willst (bzw. mußt, falls du keine passende vorhandene Lösung findest), gäbe es diverse Möglichkeiten für eine performante Darstellung. Dazu gibt es aber ein paar Rahmenbedingungen zu klären.

1. Muß nur die Darstellung selbst sehr performant sein, ist also eine gewisse Phase der Datenaufbereitung erlaubt? Oder müssen die Punkte zügig eingeladen und so schnell wie möglich auf den Schirm gebracht werden?

2. Muß die gesamte Menge an Punkten auf den Schirm (komplexe Objekte) oder immer nur ein kleiner Ausschnitt mit evtl. begrenzter Sichtweite (Punktwolke für Gebiete mit der Kamera mitten drin)?

Wenn eine Aufbereitungsphase möglich ist und nur ein Ausschnitt angezeigt werden muß, dann sollte eine spatiale Beschleunigerstruktur her (z.B. Octree oder AABB-Tree), mit der du Unmengen an Punkten außerhalb des Sichtkegels und der Sichtweite mit wenig Aufwand rauscullen kannst.

Wenn alle Punkte auf den Schirm müssen und eine Aufbereitungsphase möglich ist, dann ließen sich die Punkte nach Dichte vorsortieren. Dazu sammelst du beispielsweise solange Punkte, wie du noch welche findest, die mindestens einen Meter von allen bisher gesammelten entfernt sind. Findest du keine mehr, verringerst du die Mindestdistanz und sammelst weiter. Und das dann so lange, bis keine Punkte mehr übrig sind, die dann aktuelle Mindestdistanz liegt maximal beim kleinsten Abstand zweier Punkte im gesamten Set. Mit so sortierten Punkten kannst du dann inkrementell zeichnen. Solange die Kamera bewegt wird, zeichnest du immer nur die ersten Punkte (geringe Dichte), damit man einen Überblick hat. Steht die Kamera, dann löschst du den Buffer vom Frame davor nicht, sondern zeichnest in jedem Frame die nächsten Punkte einfach dazu.

Die Variante mit der Punktdichte läßt sich auch mit einer Beschleunigerstruktur zum rauscullen nicht sichtbarer Punktsubsets kombinieren, dann hättest du pro Zelle ein Subset an nach Dichte vorsortierten Punkten. Du könntest dann weiter entfernte Zellen mit geringerer Dichte zeichnen und/oder ebenfalls inkrementell.

Hypothraxer
2010-07-28, 20:36:52
Ich probier mal sequentiell zu antworten:

@schleiftier

Die Dinger stammen aus unterschiedlichen Quellen. Meistens entweder von Laserscannern oder aus photogrammetrischen Projekten (sprich: Bildern).

Vermaschen tu ich es in letzter Zeit nur noch mit Geomagic Studio. Wir haben zwar auch eine Polyworks Lizenz, die aber schon etwas älter ist. Rapidform würde auch gehen, habe ich aber noch nie benutzt.
Das automatische Vermaschen ist allerdings alles andere als befriedigend. Vor allem wenn du viel Rauschen und grobe Ausreisser und/oder Löcher in der Datenaufnahme hast, nehmen die Vermaschungen teilweise unschöne Züge an (ineinander gefaltete Polygone und so Spässe). Handarbeit ist meist vorher und nachher angesagt (die Daumenregel 1:18 ist dir evt. bekannt. Die Zeit, die zum Editieren von Laserpunktwolken brauchst, ist 18x so lang wie die Aufnahmezeit selbst).

@ Nighthawk13

Werd ich mir mal ansehen - danke!

@ samm

Es sind nur gewöhnliche XYZ ASCII files ohne Triangulation - PLY ist bereits trianguliert. Trotzdem danke für den Tipp - kann ich u.U. anderweitig gebrauchen :)

@ Neomi

Grundsätzlich geht's darum sich einen groben Überblick über die Daten zu beschaffen. D.h. primär ginge es darum, sich einigermassen flüssig durch die Punktwolke bewegen zu können. Somit ist pre-Prozessierung durchaus eine Möglichkeit.

Und da ich die Daten nur ansehen will, ist es mir somit egal, was sich neben dem Camera Frustum befindet.

Von dem her gesehen sind alle deine Vorschläge durchaus umsetzbar :) Wenn mich nicht alles täuscht wendet Geomagic ein ähnliches Prinzip an, wie das was du erwähnt hast (mit dem Punktesammeln und dem Reduzieren der angezeigten Datenmenge beim Bewegen der Kamera) - nur dass es halt nur under Windows läuft und nicht unter Linux :)

Vielen Dank für die Vorschläge - ich werds mir mal bei Gelegenheit genauer anschauen.

eile
2010-08-03, 14:21:43
Hallo,

Wenn eure Daten aus ply-Files kommen, und ihr sie z.B. für Ogre aufbereiten müsst, kuckt mal hier http://www.equalizergraphics.com/cgi-bin/viewvc.cgi/trunk/src/examples/eqPly/ die files ply.h / plyfile.cpp (Lese- / Schreibfunktionalität für ASCII und binäre ply-Files) an. Im verlinkten Verzeichnis befindet sich sicher auch ein Anwendungsbeispiel für das Einlesen. Mit dem ganzen dort vorhandenen könnt ihr die Daten auch rendern afaik, aber ich weiss nicht, ob es sich für diese Datenmengen eignet.

eqPly stammt zum Grossteil von mir. Es ist ein Beispielprogramm zu Equalizer. Mit Equalizer kann man das Rendering über mehrere Grafikkarten und Rechner verteilen, unter anderem auch um die Geschwindigkeit zu verbessern.

Falls sich eqPly für die Datenmengen nicht eignet habt ihr nicht genug Hardware. ;)


Gruss,

Stefan.