Sto giocando con Perlin Noise dopo aver lavorato con Diamond Square. Ho seguito l' implementazione di Hugo Elias che fondamentalmente crea una serie di funzioni con x, y come input per lanciare ogni valore di coordinata.
Il mio codice PHP è qui :
Ho due domande:
Come si usa l'algoritmo per generare una mappa di altezza in un array? Non l'ho capito appieno e ho appena portato su PHP lo pseudocodice, ma facendo l'ultima funzione (map_perlined) dopo aver letto da qualche parte che l'algoritmo "magicamente" ti dà valori di transizione per ogni punto x, y dato (apparentemente, senza dover leggere il suo valori adiacenti), ottengo questo solo quando uso come funzione casualemt_rand(-100,100)/100;
E questo quando si utilizza il crittografico: 1.0-(($n*($n*$n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0;
(che, a proposito, può essere implementato "così com'è" in PHP?):
Quindi, riassumendo, tre domande:
- Il mio codice è corretto?
- La funzione casuale può essere trasferita su PHP come descritto nel codice? Non genera errori, ma i risultati non ci sono.
- Come uso effettivamente l'algoritmo?
AGGIORNARE
Ok, ha creato una porta PHP del codice mostrato nel documento di Gustavson e, come ha detto un altro programmatore, genera solo un'ottava. Hai qualche altro sito / documento / guida utile su come usarlo con i concetti di ottave multiple, ampiezza, frequenza, ecc. Per controllare la funzione del rumore? Sulla carta di Gustavson mostra solo i risultati, non la reale implementazione dell'algoritmo, forse mi sto perdendo qualcosa?
AGGIORNAMENTO 2
@NATHAN
Ho fatto qualcosa del tipo:
$persistence = 0.5;
for ($j = 0; $j < $size; $j++) {
for ($i = 0; $i < $size; $i++) {
for ($o = 0; $o < 8; $o++) {
$frequency = pow(2,$o);
$amplitude = pow($persistence, $o);
$value += SimplexNoise($i*$frequency, $j * $frequency) * $amplitude;
}
//$value = SimplexNoise($i, $j) + 0.5 * SimplexNoise($i, $j) + 0.25 * SimplexNoise($i, $j);
$this->mapArray[$i][$j] = new Cell($value);
E dopo aver normalizzato i valori su 0..1, ottengo una mappa di altezza piuttosto noiosa come:
Come si esegue il seeding della mappa? Forse quello che devo implementare è la versione 3d con il terzo valore un'altezza casuale? Ma in tal caso, dovrei scoprire di prendere in considerazione i valori del vicino, che finirei con qualcosa come un algoritmo a diamante quadrato, esattamente ciò che non voglio fare.
AGGIORNAMENTO 3
Più lavoro Perlin. Devo ancora trovare un modo per guidare il rumore verso i miei risultati. Controlla queste ottave e il risultato finale:
Ottava da I a IV
Riassunto
Ogni ottava è praticamente la stessa. Controlla il codice:
$persistence = 0.5;
for ($j = 0; $j < $size; $j++) {
for ($i = 0; $i < $size; $i++) {
$value = 0;
for ($o = 0; $o < 4; $o++) {
$frequency = pow(2,$o);
$amplitude = pow($persistence, $o);
$value += improved_noise($i*$frequency, $j*$frequency, 0.5)*$amplitude;
}
$this->map[$i][$j] = new Cell($value);
I risultati sono normalizzati. Cosa useresti avrebbe una forte influenza nello sviluppo del rumore? Vedo esempi in cui il cambiamento dell'ampiezza dà superfici morbide o ruvide, ma anche se do un'ampiezza enorme, vedo poca differenza.