Dual Contouring

Hi Leute,
Ich möchte eine Terrain-Engine auf Voxel-Basis implementieren. Ich weiß, dass dieses Ziel ziemlich hoch gesteckt ist, doch das Prinzip dahinter und vorallen Dingen das Ergebnis interessiert mich sehr.
Für die Generation des Meshes der Voxel möchte ich den Algorithmus Dual Contouring verwenden. Jedoch bin ich erst in der 10. Klasse der Mathematik und verstehe daher den Algorithmus, welcher in dem Paper beschrieben ist nicht richtig. Ich würde euch deswegen fragen, ob ihr andere Beschreibungen des Algorithmus kennt, welche einfacher sind, oder ob ihr ihn mir erklären könntet.
Vielen Dank
InDaMoon

Ich habe mal mit jMonkeyEngine Metaballs implementiert (und später den Code für Computertomographie-Sets angepasst). Die Oberfläche habe ich mit Marching Tetrahedrons (einer Variante von Marching Cubes) berechnet - war etwas frickelig, aber nicht wirklich schwierig. Ich weiß jetzt nicht genau, was der Vorteil von Double Contouring gegenüber dieser Implementierung wäre. Falls du dich inspirieren lassen willst: http://code.google.com/p/jmonkeyengine/source/browse/trunk/src/jmetest/scalarfields/ScalarFieldPolygonisator.java?r=4101 und parallele Klassen zum Testen.

Hi, erstmal danke, dass du mir hilfst. Marching Cubes ist ja fast das gleiche wie Marching Tetrahadons, oder? Marching Cubes habe ich bereits selber implementiert. Das Prinzip ist ja ziemlich simpel. Der Vorteil von Double Contouring gegenüber Marching Cubes ist am besten mit folgendem Bild zu beschreiben:


(a) Ergebnis von Marching Cubes (b) Ergebnis von Dual Contouring
(Quelle: http://procworld.blogspot.de/2010/11/from-voxels-to-polygons.html)

Mit Double Contouring kann man nämlich auch scharfe Kanten anzeigen, indem man zusätzlich die Normals speichert, was bei einer Terrain-Engine für z.B. Gebäude von großem Vorteil ist.
Das Problem ist nur, dass dieser Algorithmus etwas komplexer ist als Marching Cubes ist.

Das grundlegende Prinzip habe ich, glaube ich, soweit verstanden:
Man ermittelt für jeden Voxel, welcher einen Vorzeichenwechsel(ähnlich wie bei Marching Cubes) aufweist, einen Punkt innerhalb des Voxels mithilfe einer “Quadratic Error Function”.
Dann durchläuft man alle Kanten, deren Ecken einen Vorzeichenwechsel aufweisen und verbindet die vier Punkte der vier benachbarten Voxel zu einem Viereck.
Diese Vierecke bilden das fertige Mesh.

Das Problem ist nur, dass ich nicht weiß, wie diese “Quadratic Error Function” funktioniert. Das wird zwar in dem Paper ziemlich genau beschrieben, doch habe ich damit so meine Probleme. Könnt ihr mir genau dabei helfen?
Das hier habe ich zu dem Thema noch gefunden: http://www.cs.rice.edu/~jwarren/papers/techreport02408.pdf