2012-05-24 20 views
7

Estoy tratando de adaptar el algoritmo 3D Perlin de ruido a las dimensiones inferiores, pero estoy teniendo problemas con la función de gradiente, ya que no entiendo completamente el razonamiento.Función de gradiente de ruido Perlin

La función original del degradado Perlin toma cuatro argumentos: un hash y una coordenada tridimensional (x, y, z). El resultado de la función se devuelve en función del valor de hash mod 16, como se detalla a continuación.

  • 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

Los valores de retorno de 0 a 11 hacen una especie de patrón, ya que cada combinación está representado una vez. Los últimos cuatro, sin embargo, son duplicados. ¿Por qué fueron elegidos para ajustarse a los últimos cuatro valores de retorno? ¿Y cuáles serían los casos análogos con dos dimensiones (x, y) y una (x)?

Respuesta

9

... ¿es la respuesta tardía mejor que ninguna? ;-)

La función grad en la implementación de "ruido mejorado" calcula un producto escalar entre el vector x, y, z y un vector de gradiente pseudoaleatorio.

En esta implementación, el vector de degradado se selecciona de 12 opciones. Destilan uniformidad de la selección y añadir los números 12 y 14, porque es más rápido que hacer hash & 15 de hash % 12

Para un ruido Perlin 2D he utilizado sólo 4 vectores de gradientes sin problemas visibles como este:

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

¡Gracias por la respuesta! Siempre estoy increíblemente agradecido con los héroes que se lanzan en picado para salvar las viejas preguntas olvidadas. –