Saya mempermainkan Perlin Noise setelah bekerja dengan Diamond Square. Saya mengikuti implementasi oleh Hugo Elias yang pada dasarnya, membuat serangkaian fungsi dengan x, y sebagai input untuk membuang setiap nilai koordinat.
Kode PHP saya ada di sini :
Saya punya dua pertanyaan:
Bagaimana cara menggunakan algoritma untuk menghasilkan peta ketinggian dalam array? Saya tidak sepenuhnya memahaminya dan hanya porting ke PHP pseudocode, tetapi melakukan fungsi terakhir (map_perlined) setelah membaca di suatu tempat bahwa algoritma "ajaib" memberi Anda nilai-nilai yang ditransisikan untuk setiap x, titik y diberikan (tampaknya, tanpa harus membaca nya nilai yang berdekatan), saya hanya mendapatkan ini ketika menggunakan fungsi acakmt_rand(-100,100)/100;
Dan ini saat menggunakan kriptografi: 1.0-(($n*($n*$n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0;
(yang, BTW, dapat diimplementasikan "apa adanya" di PHP?):
Jadi, simpulkan, tiga pertanyaan:
- Apakah kode saya benar?
- Fungsi acak dapat porting ke PHP seperti yang dijelaskan dalam kode? Tidak ada kesalahan, tapi hasilnya tidak ada.
- Bagaimana saya benar-benar menggunakan algoritma?
MEMPERBARUI
Ok, buat port PHP dari kode yang ditunjukkan di kertas Gustavson, dan seperti kata coder lainnya, itu hanya menghasilkan satu oktaf. Punya situs / kertas / panduan lain yang bermanfaat tentang cara menggunakan ini dengan konsep multi oktaf, amplitudo, frekuensi, dll. Untuk mengontrol fungsi noise? Pada makalah Gustavson hanya menunjukkan hasilnya, bukan implementasi sebenarnya dari algoritma, mungkin saya kehilangan sesuatu?
UPDATE 2
@NATHAN
Saya membuat sesuatu seperti:
$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);
Dan setelah menormalkan nilai ke 0..1, saya mendapatkan peta ketinggian yang agak membosankan seperti:
Bagaimana cara saya seed seed? Mungkin yang perlu saya terapkan adalah versi 3d dengan nilai ketiga tinggi acak? Tetapi jika demikian, saya harus mencari tahu untuk mempertimbangkan nilai tetangga, yang akan saya akhiri dengan sesuatu seperti algoritma berlian persegi, persis apa yang tidak ingin saya lakukan.
PEMBARUAN 3
Lebih banyak pekerjaan Perlin. Saya belum menemukan cara untuk memandu suara ke hasil saya. Periksa oktaf ini dan hasil akhirnya:
Oktaf I ke IV
Jumlahkan
Setiap oktaf hampir sama. Periksa kode:
$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);
Hasilnya dinormalisasi. Apa yang akan Anda gunakan memiliki pengaruh kuat dalam pengembangan kebisingan? Saya melihat contoh di mana mengubah amplitudo memberikan permukaan lunak atau kasar, tetapi bahkan jika saya memberikan amplitudo besar, saya melihat sedikit perbedaan.