2012-05-24 14 views
7

Sto cercando di adattare l'algoritmo del disturbo 3D Perlin alle dimensioni inferiori, ma ho problemi con la funzione sfumatura, dal momento che non capisco completamente il ragionamento.Perlin gradiente di rumore funzione

La funzione di sfumatura Perlin originale richiede quattro argomenti: uno hash e una coordinata tridimensionale (x, y, z). Il risultato della funzione viene restituito in base al valore di hash mod 16, come elencato di seguito.

  • 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

I valori restituiti da 0 a 11 fanno una sorta di modello, poiché ogni combinazione è rappresentata una volta. Gli ultimi quattro, tuttavia, sono duplicati. Perché sono stati scelti per adattarsi agli ultimi quattro valori di ritorno? E quali sarebbero i casi analoghi con due dimensioni (x, y) e una (x)?

risposta

9

... è in ritardo la risposta meglio di nessuno? ;-)

La funzione grad nell'implementazione di "disturbo migliorato" calcola un prodotto punto tra il vettore x, y, z e un vettore gradiente pseudo casuale.

In questa implementazione, il vettore del gradiente è selezionato tra 12 opzioni. Cadono uniformità della selezione e aggiungere i numeri 12 e 14, perché è più veloce di fare hash & 15 di hash % 12

Per un rumore Perlin 2D Ho usato solo 4 vettori gradienti senza problemi visibili come questo:

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

Grazie per la risposta! Sono sempre incredibilmente grato agli eroi che si precipitano per salvare le vecchie domande dimenticate. –