Umsetzung Der Marching-Cube-Algorithmus?
Aus Meiner letzten Frage: Marching-Cube-Frage
Allerdings bin ich mir noch unklar wie:
- wie erstelle imaginäre Würfel/voxel zu prüfen, ob ein Scheitelpunkt ist, unter der isosurface?
- wie weiß ich, welche Scheitelpunkt unterhalb der isosurface?
- wie wirkt jedes cube/voxel bestimmt, welche cubeindex/Oberfläche verwenden?
- wie draw Oberfläche mit den Daten in triTable?
Sagen wir, ich habe ein point-cloud-Daten von einem apple.
wie muss ich Vorgehen?
kann jemand, die vertraut sind mit Marching Cube mir helfen?
ich kenne nur C++ und opengl.(c ist ein wenig aus meiner hand)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst die isosurface dargestellt werden kann, gibt es zwei Möglichkeiten. Ein Weg ist, um die isovalue-und pro-Punkt-skalaren als ein Datensatz aus einer externen Quelle. Das ist, wie MRI-scans arbeiten. Der zweite Ansatz ist es, eine implizite Funktion F (), die einen Punkt/vertex als parameter und liefert eine neue Skalare. Betrachten Sie diese Funktion:
Würde berechne die Entfernung von dem Punkt und dem Ursprung für jeden Punkt in Ihrer skalaren Feld. Wenn der isovalue ist der radius, Sie dachte nur eine Möglichkeit dar, eine Sphäre.
Dies ist wegen |v| <= R ist, gilt für alle Punkte innerhalb einer Kugel, oder dem Leben an seinem inneren. Finden Sie einfach heraus, welche Eckpunkte sind im inneren der Kugel, und welche sind auf der Außenseite. Sie wollen zu verwenden, die weniger oder mehr-als Unternehmen, da Sie ein Volumen teilt den Raum in zwei. Wenn Sie wissen, welche Punkte in Ihrem cube eingestuft sind als innen und außen, und Sie wissen auch, die Kanten der isosurface schneidet. Sie können am Ende alles aus keine Dreiecke zu fünf Dreiecke. Die position der mesh-vertices berechnet werden kann durch Interpolation über die sich kreuzenden Kanten um den wirklichen Schnittpunkt.
Wenn Sie darstellen wollen, dass ein Apfel mit skalaren Felder, die, würden Sie entweder brauchen, um den source-Datensatz zu plug-in für Ihre Anwendung, oder verwenden Sie eine ziemlich komplexe implizite Funktion. Ich empfehle immer einfache geometrische primitive wie Kugeln und tori, erstmal an zu arbeiten, und erweitern Sie dann von dort.
1) Es hängt davon ab, yoru Umsetzung. Sie benötigen eine Daten-Struktur, wo können Sie nachschlagen die Werte an jeder Ecke (vertex) des voxel-oder cube. Dies kann ein 3d-Bild (sprich: eine 3D-textur in OpenGL), oder es kann eine benutzerdefinierte array-Daten-Struktur, oder jedes andere format, das Sie wünschen.
2) markieren Sie einen der Eckpunkte des Würfels. Es gibt verschiedene Optimierungen, aber im Allgemeinen, beginnen Sie mit der ersten Ecke, und überprüfen Sie die Werte von allen 8 Ecken des Würfels.
3) die Meisten (schnelle) algorithmen erstellen einer Bitmaske " zu verwenden, wie eine lookup-Tabelle in einem statischen array von Optionen. Es gibt nur so viele mögliche Optionen für dieses.
4) Sobald du das gemacht hast Dreiecke von der triTable, können Sie mit OpenGL zu Rendern.
Dies ist nicht zur Arbeit zu gehen mit marching cubes. Marching cubes erfordert voxel-Daten, so dass Sie brauchen, um zu verwenden einige algorithmen setzen die Punktwolke der Daten in einem kubischen Volumen. Gauß-Splatting ist eine option hier.
In der Regel, wenn Sie arbeiten aus einer Punktwolke und sehen wollen, die Oberfläche, sollten Sie sich im Oberflächen-Rekonstruktion-algorithmen anstelle von marching cubes.
Wenn du mehr erfahren möchtest, würde ich empfehlen Lesen einige Bücher über die Methoden der Visualisierung. Ein guter ist von Kitware Leute - Das Visualization Toolkit.
Möchten Sie vielleicht einen Blick auf VTK. Es hat eine C++ Implementierung Marching Cubes, und ist vollständig open Source.
Wie gewünscht, hier einige Beispiel-code, der der Implementierung des Marching Cubes-Algorithmus (mit JavaScript/Three.js für die Grafik):
http://stemkoski.github.com/Three.js/Marching-Cubes.html
Weitere details auf der Theorie, Sie sollten überprüfen Sie heraus die Artikel auf
http://paulbourke.net/geometry/polygonise/