Ich habe versucht, das Voxel-Rendering zu verstehen, und habe mir Dual Contouring (DC) angesehen.
Bisher verstehe ich so viel:
- Führen Sie eine Dichtefunktion für eine Reihe von Gitterpunkten aus (dh Rauschfunktion).
- Finden Sie heraus, welche Kanten im Gürtel Änderungen zwischen den Endpunkten enthalten
- Erstellen Sie aus diesen Kanten Schnittpunkte (dh Vektoren).
Hier stecke ich fest, als nächstes würde ich Normalen erzeugen, aber wie? Wenn Sie sich dieses Thema ansehen, wird dieses Bild normalerweise angezeigt.
Untersuchungen haben ergeben, dass die Normalen aus einer Isofläche erzeugt werden. Ist es richtig zu denken, dass ich von Rauschen über Isofläche zu Normalen übergehe? Wenn ja, wie würde ich jeden Schritt ausführen?
Nach meinem Verständnis wäre der nächste Schritt der folgende aus dem DC-Papier ;
Generieren Sie für jede Kante, die einen Vorzeichenwechsel aufweist, ein Quad, das die minimierenden Eckpunkte der vier Würfel mit der Kante verbindet.
Wird dieses Zitat durch das obige Bild dargestellt?
Schließlich wäre der nächste Schritt, die QEF mit den Schnittpunkten und Normalen auszuführen, und dies würde meine Scheitelpunktdaten erzeugen. Ist das richtig?
quelle
Antworten:
Die Normalen werden basierend auf dem Gradienten der Dichtefunktion generiert, während Sie gleichzeitig die Schnittpunkte zwischen den Kanten und der Oberfläche erhalten. Wenn es sich um eine einfache und geschlossene Form wie eine Kugel handelt, können Sie die Normalen analytisch berechnen, aber mit Rauschen müssen Sie Proben entnehmen.
Sie haben die nächsten Schritte in der falschen Reihenfolge. Zunächst generieren Sie einen Scheitelpunkt für jede Zelle , die einen Vorzeichenwechsel aufweist. Die QEF, die Sie minimieren, ist einfach der Gesamtabstand zu jeder der Ebenen, die durch die Schnittpunkt / Normal-Paare für diese Zelle definiert sind. Anschließend gehen Sie durch die Kanten, die Vorzeichenwechsel aufweisen, und erstellen ein Quad mit den vier benachbarten Scheitelpunkten (die garantiert im letzten Schritt generiert wurden).
Meine größte Hürde bei der Umsetzung war die Lösung des QEF. Ich habe mir tatsächlich eine einfache iterative Lösung ausgedacht, die (zum Beispiel) auf einer GPU parallel gut läuft. Grundsätzlich starten Sie den Scheitelpunkt in der Mitte der Zelle. Dann mitteln Sie alle vom Scheitelpunkt genommenen Vektoren zu jeder Ebene und verschieben den Scheitelpunkt entlang dieser Resultierenden. Wiederholen Sie diesen Schritt eine festgelegte Anzahl von Malen. Ich fand, dass sich eine Verschiebung von ~ 70% entlang der Resultierenden in der geringsten Anzahl von Iterationen stabilisieren würde.
quelle
Vom Lesen des Papiers bis zu Seite 2 scheint es, dass die Volumengewichte an den Ecken des Gitters gespeichert werden, anstatt das Gewicht des Würfels selbst zu sein, wie es normale Algorithmen im Marching Cubes-Stil bevorzugen. Diese Eckgewichte definieren einen Punkt zwischen der Kante zwischen zwei Ecken, an dem ein Vorzeichenwechsel von Ecke zu Ecke stattfindet. Kanten mit Vorzeichenänderungen speichern auch eine Normale für die Kante, die die abgewinkelte Linie in Ihrer 2D-Darstellung im OP darstellt. Diese normalen Informationen werden während der Erstellung des Volumes definiert (unabhängig davon, welches Bearbeitungswerkzeug oder welche prozedurale Volume-Erstellungsmethode verwendet wird), nicht nachdem die Isofläche generiert wurde, wie dies von einem Algorithmus im Marching Cubes-Stil erwartet wird. Diese normalen Daten "besagen", dass die Linie / Oberfläche, die durch den Punkt verläuft, den vordefinierten Normalwert haben muss. In Fällen, in denen Marching Cubes die Linie an diesem Punkt biegen würden, um sich mit einem anderen Punkt an einer benachbarten Kante zu verbinden, verlängern Extended Marching Cubes und Dual Contouring die Linie / Oberfläche nach außen, bis sie sich mit der Linie / Oberfläche schneidet, die durch den Punkt auf der verläuft benachbarte Kante, die einen anderen Normalwert hat. Dies ermöglicht das Erstellen scharfer Ecken aus den Volumendaten, in denen grundlegende Marching Cubes-Algorithmen die Oberfläche etwas abrunden würden. Ich verstehe nicht ganz, wie QEFs (quadratische Fehlerfunktionen) dazu beitragen, außer dass sie es anscheinend einfacher machen, den erweiterten Punkt innerhalb eines Würfels zu berechnen, an dem sich eine Ecke befindet. Extended Marching Cubes und Dual Contouring verlängern beide die Linie / Fläche nach außen, bis sie sich mit der Linie / Fläche schneidet, die durch den Punkt an der angrenzenden Kante verläuft, der einen anderen Normalwert hat. Dies ermöglicht das Erstellen scharfer Ecken aus den Volumendaten, in denen grundlegende Marching Cubes-Algorithmen die Oberfläche etwas abrunden würden. Ich verstehe nicht ganz, wie QEFs (quadratische Fehlerfunktionen) dazu beitragen, außer dass sie es anscheinend einfacher machen, den erweiterten Punkt innerhalb eines Würfels zu berechnen, an dem sich eine Ecke befindet. Extended Marching Cubes und Dual Contouring verlängern beide die Linie / Fläche nach außen, bis sie sich mit der Linie / Fläche schneidet, die durch den Punkt an der angrenzenden Kante verläuft, der einen anderen Normalwert hat. Dies ermöglicht das Erstellen scharfer Ecken aus den Volumendaten, in denen grundlegende Marching Cubes-Algorithmen die Oberfläche etwas abrunden würden. Ich verstehe nicht ganz, wie QEFs (quadratische Fehlerfunktionen) dazu beitragen, außer dass sie es anscheinend einfacher machen, den erweiterten Punkt innerhalb eines Würfels zu berechnen, an dem sich eine Ecke befindet.
Beachten Sie, dass ich hier über Linien und Kanten im 2D-Sinne gesprochen habe, wie in der Darstellung im OP dargestellt. Ich müsste etwas mehr lesen und nachdenken, um dies für die Erzeugung volumetrischer Netze auf 3D auszudehnen.
Um die zweite Hälfte Ihrer Frage zu beantworten, wie die Normalen erzeugt werden sollen, und unter dem Gesichtspunkt des rauschgetriebenen Verfahrens zu denken, scheint es, als würden Sie Ihr Volumen mit Rauschdaten füllen, dann nach Kanten mit Vorzeichenänderungen suchen und dann die 4 Würfel untersuchen Diese teilen sich die Kante, um herauszufinden, wo welche Dreiecke erzeugt werden sollen, und berechnen die Scheitelpunktnormalen wie bei jedem anderen Schnittpunkt mehrerer Dreiecke, wobei der Durchschnitt der Normalen für jedes Dreieck, das den Scheitelpunkt teilt, verwendet wird. Dies ist für mich sehr spekulativ, da sich das Papier hauptsächlich mit CSG-Operationen und Volumina befasst, die aus scankonvertierten Netzen generiert wurden, die beide gut definierte Normalen auf den Oberflächen aufweisen.
Ich hoffe, dass zumindest der erste Teil dieser Antwort die Unterschiede in der Darstellung und Verwendung der Gewichtsdaten auf eine Weise behandelt, die sich von den grundlegenden Marching Cubes deutlich unterscheidet, und warum die normalen Daten relativ früh im Prozess der Volumengenerierung erstellt werden müssen. Dabei werden mit einfachen Marschwürfeln normalerweise Normalen als letzte Stufe des Netzgenerierungsprozesses erstellt.
quelle