2012-05-24 5 views
7

Ich bin auf der Suche nach dem 3D Perlin Noise-Algorithmus zu niedrigeren Dimensionen anzupassen, aber ich habe Probleme mit der Gradientenfunktion, da ich die Argumentation nicht vollständig verstehe. Die ursprüngliche Perlin-Gradientenfunktion benötigt vier Argumente: a hash und eine dreidimensionale Koordinate (x, y, z). Das Ergebnis der Funktion wird basierend auf dem Wert hash mod 16 zurückgegeben, wie unten aufgeführt.Perlin Rauschgradientenfunktion

  • 0: x + y
  • 1: -x + y
  • 2: x - y
  • 3: -x - y
  • 4: x + z
  • 5: -x + z
  • 6: x - z
  • 7: -x - z
  • 8: y + z
  • 9: -y + z
  • 10: y - z
  • 11: -y - z
  • 12: y + x
  • 13: -y + z
  • 14: y - x
  • 15: -y - z

Die Rückgabewerte 0-11 eine Art Muster machen, da jede Kombination einmal vertreten ist. Die letzten vier sind jedoch Duplikate. Warum wurden sie für die letzten vier Rückgabewerte ausgewählt? Und was wären die analogen Fälle mit zwei (x, y) und einer (x) Dimensionen?

Antwort

9

... ist späte Antwort besser als keine? ;-)

Die Funktion in der "Enhanced Noise" -Implementierung berechnet ein Skalarprodukt zwischen dem Vektor x, y, z und einem pseudozufälligen Gradientenvektor.

In dieser Implementierung wird der Gradientenvektor aus 12 Optionen ausgewählt. Sie fallen Einheitlichkeit der Auswahl und fügen Sie Nummern 12 und 14, weil es schneller ist hash & 15 als hash % 12

Für eine 2D-Perlin Noise zu tun haben, nur 4 Gradientenvektoren ohne sichtbare Probleme wie diese habe ich:

return ((hash & 1) ? x : -x) + ((hash & 2) ? y : -y); 
+1

Danke für die Antwort! Ich bin immer unglaublich dankbar für die Helden, die eintauchen, um die alten vergessenen Fragen zu retten. –

Verwandte Themen