Wie glättet man die Blöcke einer 3D Voxel Welt?

8

In meiner (Minecraft-like) 3D-Voxel-Welt möchte ich die Formen glätten, um eine natürlichere Optik zu erhalten. Schauen wir uns zuerst dieses Beispiel in 2D an.

Links ist, wie die Welt ohne Glättung aussieht. Die Geländedaten sind binär und jedes Voxel wird als Würfel in Einheitsgröße gerendert.

In der Mitte sieht man eine naive kreisförmige Glättung. Es werden nur die vier direkt benachbarten Blöcke berücksichtigt. Es sieht immer noch nicht sehr natürlich aus. Außerdem möchte ich flache 45-Grad-Pisten haben.

Auf der rechten Seite sehen Sie einen Glättungsalgorithmus, den ich entwickelt habe. Es berücksichtigt die acht direkten und diagonalen Nachbarn, um die Form eines Blocks zu erhalten. Ich habe den C ++ - Code online. Hier ist der Code, der mit den Kontrollpunkten kommt, dass die Bezier-Kurve gezeichnet wird.

%Vor%

Dies ist jedoch immer noch in 2D. Wie übersetzt man diesen Algorithmus in drei Dimensionen?

    
danijar 10.09.2012, 12:21
quelle

3 Antworten

2

Sie sollten sich wahrscheinlich den Algorithmus für marschierende Würfel ansehen und von dort aus arbeiten. Sie können die Glätte des resultierenden Blobs leicht kontrollieren:

  1. Stellen Sie sich vor, dass jedes Voxel ein Feld mit einer hohen Dichte in seiner Mitte definiert und langsam zu nichts verblasst, wenn Sie sich von der Mitte entfernen. Zum Beispiel könnten Sie eine Funktion verwenden, die 1 in einem Voxel ist und auf 0 zwei Voxel entfernt geht. Egal, welche genaue Funktion Sie wählen, stellen Sie sicher, dass es nur innerhalb eines begrenzten (vorzugsweise kleinen) Bereichs nicht Null ist.
  2. Summiere für jeden Punkt die Dichte aller Felder.
  3. Verwenden Sie den Marching Cubes-Algorithmus für die Summe dieser Felder
  4. Verwenden Sie ein Gitter mit hoher Auflösung für den Algorithmus

Um das Aussehen / die Glätte zu ändern, ändern Sie die Dichtefunktion und die Schwelle des Marching-Cubes-Algorithmus. Eine mögliche Erweiterung zu marschierenden Cubes, um glattere Meshes zu erzeugen, ist die folgende Idee: Stellen Sie sich vor, dass Sie zwei Punkte an einer Kante eines Würfels treffen, wobei ein Punkt innerhalb Ihres Volumens (über einem Schwellenwert) und der andere außerhalb (unter dem Schwellenwert) liegt. In diesem Fall legen viele Marsch-Cubes-Algorithmen die Grenze genau in der Mitte der Kante an. Man kann den exakten Begrenzungspunkt berechnen - das beseitigt Aliasing.

Ich würde auch empfehlen, dass Sie danach einen Netzvereinfachungsalgorithmus ausführen. Die Verwendung von Marching Cubes führt zu Netzen mit vielen unnötigen Dreiecken.

    
Simon 10.09.2012, 12:27
quelle
1

Als Alternative zu meiner obigen Antwort: Sie könnten auch NURBS oder einen beliebigen Algorithmus für Unterteilungsflächen . Insbesondere die Unterteilungsflächenalgorithmen sind auf glatte Netze spezialisiert. Je nach Algorithmus und Konfiguration erhalten Sie mit

glattere Versionen Ihres ursprünglichen Meshes
  • das gleiche Volumen
  • dieselbe Oberfläche
  • die gleiche Silhouette

und so weiter.

    
Simon 10.09.2012 12:39
quelle
0

Verwenden Sie 3D-Implementierungen für Biezer-Kurven, die als Biezer-Oberflächen bekannt sind, oder verwenden Sie die erläuterten B-Spline-Oberflächenalgorithmen:

hier

oder

hier

    
nicholas 10.09.2012 12:29
quelle

Tags und Links