Hai teman-teman, saya mencoba mencari cara untuk menghasilkan fraktal ubin dalam kode (untuk peta game, tapi itu tidak relevan ) Saya telah mencoba untuk memodifikasi plug-in Solid Noise yang dikirimkan dengan GIMP (dengan pemahaman saya yang sangat terbatas tentang bagaimana kode bekerja) tetapi saya tidak bisa mendapatkan milik saya untuk bekerja dengan benar.
Kode saya yang dimodifikasi sejauh ini (Jawa)
Modul kebisingan padat GIMP yang mendasari kode saya dari (C)
Inilah yang ingin saya capai tetapi inilah yang saya dapatkan
Jadi jika ada yang bisa melihat kesalahan saya, atau memiliki saran bagaimana saya bisa melakukannya secara berbeda, saya akan sangat menghargainya. Terima kasih sebelumnya. Dan jika saya meminta banyak atau jika hanya kegagalan besar dalam hidup, saya minta maaf.
sumber
Jawaban:
Saya tidak mengikuti kode Anda dengan tepat, tetapi di sini ada deskripsi yang disederhanakan dari algoritma yang kira-kira akan mencapai efeknya (berdasarkan gambar yang Anda posting).
Penjelasan berikut ini bukan versi super dioptimalkan, tetapi adalah salah satu yang jelas secara konsep (saya harap). Setelah Anda menjalankannya, Anda dapat mengoptimalkannya (cukup drastis, sebenarnya).
Langkah yang sulit adalah langkah pengambilan sampel dan interpolasi. Misalkan kita berada di layer melewatkan sampling setiap m-th pixel. Ini adalah ide dasar untuk m> 1 (jika m adalah 1, kita menggunakan gambar apa adanya):
Beberapa tips:
sumber
Sepertinya pastebin asli saya kedaluwarsa, jadi saya tidak punya cara untuk membandingkan kode non-kerja saya, tetapi pada permainan saya saat ini saya melaluinya dan menerjemahkan kode GIMP ke dalam java lagi dan sepertinya berfungsi dengan baik sekarang.
Jika ada yang berencana menggunakan kode ini, saya akan merekomendasikan memodifikasi konstruktor untuk memodifikasi parameter pengaturan (detail dan ukuran) sehingga Anda dapat membuatnya berfungsi seperti yang Anda inginkan. EDIT: Saya menyadari pertanyaan awal saya adalah tentang membuatnya tileable, jadi ingatlah untuk mengatur tilable menjadi true!
Kode: http://pastebin.com/KsfZ99Xa
Contoh:
sumber
Hanya membaca sekilas versi Java dan C dan memperhatikan sedikit perbedaan dalam cara Anda menggunakan fungsi noise. Ini milikmu:
Kode C:
Mengapa Anda memilih untuk tidak mengurangi offset? (col - xoffset) dan (baris - yoffset)
Hanya ingin tahu. Saya tidak punya waktu untuk melakukan analisis kode secara lengkap.
Semoga ini membantu.
sumber
Saya tidak tahu apakah itu bisa membantu tetapi trik berikut ini berhasil bagi saya:
http://www.gamedev.net/blog/33/entry-2138456-seamless-noise/
Orang ini menggunakan fungsi noise 4d dan hanya memberikan nilai xy dari dua lingkaran sebagai nilai xyzw untuk noise 4d. Hasilnya adalah perulangan sempurna.
Berikut adalah ide (disederhanakan) untuk gambar 1000 * 1000:
sumber
Saya sarankan Anda menggunakan algoritma berlian-persegi , juga dikenal sebagai fraktal plasma atau fraktal perpindahan titik tengah acak. Dengan menggunakan algoritma ini, sangat mudah untuk membatasi tepi untuk memiliki nilai yang sama. Saat Anda menghasilkan nilai untuk tepi, salin ke tepi yang sesuai di sisi lain. Ini menghasilkan peta ubin sempurna.
sumber
Ada artikel bagus tentang generasi kebisingan di sini . Ini bukan Perlin noise seperti yang diklaim artikel (sebenarnya pink noise), tetapi masih sangat berguna untuk memahami bagaimana gambar noise dihasilkan.
Jadi, untuk benar-benar menjawab pertanyaan Anda: untuk membuat gambar noise tileable, Anda hanya perlu menjaga "tileability" sepanjang generasi. Artinya, ketika suara dihaluskan, Anda melicinkannya seolah diulang tanpa batas ke segala arah - ubin.
sumber
Dari tangkapan layar, dugaan saya adalah hanya lapisan "besar" yang dihasilkan, itulah sebabnya suara muncul terlalu teratur dan kurang detail.
Ini mungkin terdengar bodoh, tetapi apakah Anda mencoba meningkatkan variabel "detail" (baris 16)? Dalam kode Anda, ini diatur ke 1, yang berarti algoritma hanya akan menghasilkan dua lapisan detail sebelum berhenti. Coba tingkatkan menjadi sekitar 8.
sumber
Anda juga harus melihat Simplex Noise , yang dikembangkan oleh Ken Perlin untuk memperbaiki beberapa kekurangan kebisingan Perlin.
Saya telah mengerjakan implementasi Simplex Noise untuk game C ++. Mendukung multi-oktaf 1D / 2D / 3D / 4D noise. Saat ini, satu-satunya tekstur bawaan adalah marmer, tetapi Anda dapat dengan mudah menambahkan lebih banyak:
(http://code.google.com/p/battlestar-tux/source/browse/trunk/src/lib/procedural/)
sumber