Anda dapat menggunakan fungsi noise untuk menghasilkan ketinggian acak. Yang paling sederhana adalah nilai noise, yang bekerja persis seperti deskripsi Anda: Anda menghasilkan beberapa ketinggian integer acak, dan kemudian menyisipkan ketinggian di antara mereka. Metode interpolasi yang paling sering digunakan adalah pemetaan kurva S-cubic:
Misalkan Anda memiliki tinggi h0
pada titik x0
dan tinggi h1
pada titik x1
. Kemudian untuk mendapatkan ketinggian di titik mana pun x
( x0<=x<=x1
), Anda gunakan
t = (x-x0)/(x1-x0); // map to [0,1] range
t = t*t*(3 - 2*t); // map to cubic S-shaped curve
h = h0+t*h1;
Ketinggian yang diperoleh dengan cara ini akan mulus, acak, tetapi tidak terlalu menarik. Untuk membuat medan Anda lebih baik, Anda dapat menggunakan fraktal noise . Ini berfungsi seperti ini: misalkan Anda telah menghasilkan fungsi h(x)
yang mengembalikan ketinggian pada koordinat yang diberikan (menggunakan metode di atas). Fungsi ini memiliki frekuensi, ditentukan oleh frekuensi ketinggian interger asli. Untuk membuat fraktal darinya, Anda menggabungkan fungsi bersama dengan beberapa frekuensi:
fbm(x)=h(x) + 0.5*h(2*x) + 0.25*h(4*x) + 0.125*h(8*x);
Dalam contoh ini, saya menggabungkan empat frekuensi - asli, ganda, 4 kali dan 8 kali asli, dengan frekuensi yang lebih tinggi dengan bobot yang lebih sedikit. Secara teoritis, fraktal berjalan hingga tak terhingga, tetapi dalam praktiknya hanya diperlukan beberapa istilah. The fbm
dalam rumus singkatan gerak Brown pecahan - ini adalah nama fungsi ini.
Ini adalah teknik yang kuat. Anda dapat bermain dengan pengganda frekuensi, dengan bobot frekuensi yang berbeda, atau menambahkan beberapa fungsi untuk mendistorsi kebisingan. Misalnya, untuk mendapatkan lebih banyak nuansa "bergerigi", h(x)
dapat diubah menjadi 1-abs(h(x))
(dengan asumsi -1<=h(x)<=1
)
Namun, walaupun semua ini bagus, teknik ini memiliki batasan serius. Dengan pendekatan berbasis "ketinggian", Anda tidak akan pernah bisa memiliki "overhang" medan. Dan saya membayangkan mereka menjadi fitur yang sangat bagus untuk dimainkan di game "Moon Buggy".
Menambahkan overhang yang bagus adalah tugas yang sulit. Satu hal yang bisa saya pikirkan - Anda bisa mulai dengan "ketinggian" fraktal, dan "tessellate" menjadi serangkaian splines atau kurva bezier. Maka garis medan akan ditentukan oleh beberapa "titik kunci". Berikan sedikit jitter pada titik-titik utama ini - ini akan menghasilkan deformasi acak pada medan, mungkin membentuk beberapa bentuk yang menarik. Namun, persimpangan-sendiri medan mungkin menjadi masalah dengan pendekatan ini, terutama dengan jumlah jitter yang tinggi.
Gagasan saya adalah membuat fungsi noise yang dihaluskan. Pertama dengan metode intNoise (int) yang mengembalikan int "acak", tetapi yang tergantung pada input. Jika Anda menggunakan input yang sama dua kali, hasilnya akan sama.
Kemudian gunakan metode smoothing untuk membuat floatNoise (float) yang menggunakan dua bilangan bulat di sekitar input untuk membangun nilai acak.
Kemudian gunakan posisi X sebagai input dan Y sebagai output. Hasilnya akan menjadi kurva yang dihaluskan tetapi dengan ketinggian acak.
sumber