Buat planet planet prosedural

Distorsi, kebisingan mulus dan cara bekerja dengannya.

gambar

Kami menghasilkan sebuah planet


Salah satu cara paling sederhana untuk menghasilkan planet adalah dengan menggunakan noise. Jika kami memutuskan untuk memilihnya, maka kami memiliki beberapa opsi yang memungkinkan. Mari kita lihat masing-masing dan tentukan yang terbaik:

  • Perlin Noise adalah pilihan termudah. Kebisingan Perlin dikembangkan oleh Ken Perlin pada tahun 1983, ia memiliki beberapa kelemahan - artefak visual dan kecepatan ketika menghasilkan gambar besar yang agak rendah dibandingkan dengan opsi lain.
  • Simplex Noise (Simplex Noise) - dikembangkan oleh Ken Perlin pada tahun 2001 sebagai upaya untuk menghilangkan cacat noise Perlin; ini adalah solusi yang sangat layak dan cepat, tetapi memiliki kelemahan serius: penggunaan kebisingan simpleks tiga dimensi dilindungi oleh paten, yang membuatnya cukup mahal.
  • Open Simplex Noise - KDotJPG dikembangkan dengan satu tujuan sederhana: untuk membuat versi modern dari noise simplex, relatif cepat dan tanpa distorsi.

Dari ketiganya, saya pribadi lebih suka Open Simplex Noise, yang saya gunakan dalam proyek pribadi saya. Perlu dicatat bahwa dalam implementasi OpenSimplexNoise saat ini , pekerjaan tambahan akan diperlukan untuk mendapatkan akses mudah ke skala, oktaf dan generator . Ada banyak informasi di Internet tentang apa yang masing-masing elemen ini lakukan, dan saya sangat menyarankan Anda mempelajarinya. Namun, dalam artikel saya, saya tidak akan membicarakan hal ini.


Inilah yang terlihat seperti Open Simplex Noise dengan 16 oktaf.

Kebisingan mulus


Kebisingan tidak ada habisnya, yang berarti bahwa jika kita hanya membuat kanvas dengan rasio aspek 2: 1 untuk mendapatkan proyeksi dengan jarak yang sama , itu tidak akan diulang ketika ditumpangkan pada bola (saya ucapkan terima kasih kepada situs web yang menakjubkan ini), tetapi pada jahitan horizontal dan di kutub perbedaan besar.

gambar

Noise dibuat tanpa jahitan.

gambar

Perhatikan lapisan besar yang muncul ketika suara diaplikasikan pada bola.

Ada banyak cara untuk memperbaikinya; Misalnya, dalam postingan Red Blob Games [ terjemahan Habré] yang luar biasa ini, cukup menghasilkan pulau menggunakan fungsi yang menerima jarak ke pusat sebagai variabel dan menetapkan ketinggian 0 pada tepinya untuk meminimalkan jahitan.

Namun, ini bukan yang kita butuhkan. Kami ingin menghasilkan sebuah planet dengan kemungkinan keberadaan kutub utara dan selatan, dan untuk ini kita akan membutuhkan perhitungan matematika yang lebih kompleks.

Hamparan bola


Metode yang dapat menghasilkan planet berbentuk bola adalah mengubah koordinat Cartesian dari kanvas kita menjadi koordinat bola, menghasilkan noise berdasarkan koordinat ini, dan kemudian mengubah noise tersebut kembali ke koordinat Cartesian dan menerapkannya pada kanvas.

Namun, implementasi ini memiliki keterbatasan, yang penyebabnya ditampilkan dalam pos luar biasa oleh Ron Valstar . Yang paling penting, bentuk benua dalam kasus ini terlihat sangat aneh dan terdistorsi, dan oleh karena itu kami tidak akan menggunakan opsi ini.

gambar

Hamparan kebisingan bola. Bentuk dan distorsi aneh membuat benua cukup jelek.

gambar

Tapi setidaknya tidak ada lagi jahitan.

Hamparan kubik


Sebagai hasilnya, saya menggunakan metode kedua, yang diambil dari pos oleh Ron Valstar dan serangkaian artikel oleh acko Making Worlds . Mereka menggambarkan generasi bola dunia melalui generasi kubus dan "inflasi" nya, seolah-olah itu adalah balon, sampai itu adalah contoh bentuk bola.


Gambar diambil dari acko.net. Ini menjelaskan konsep peta kubik dengan cara sederhana yang divisualisasikan.

Sekarang kita hanya perlu menghasilkan enam wajah, yang cukup sederhana, ada banyak cara untuk melakukan ini.

Pada akhirnya, saya memutuskan untuk membuat array dan mengisinya dengan data. Saya mengkonversi koordinat 2D dari kanvas ke koordinat 3D dari kubus, dan kemudian menghasilkan suara untuk masing-masing koordinat 3D ini sehingga saya menyimpannya ke nilai koordinat 2D yang sesuai.

//Z STATIC for(int y = 0; y < cubeFaceSize; y++) { for(int x = 0; x < cubeFaceSize * 2; x++) { //Generates FRONT if(x < cubeFaceSize) { cubeMap[cubeFaceSize+x][cubeFaceSize+y] = noise.noise3D(x, y, 0); } //Generates BACK else { cubeMap[cubeFaceSize*3+(x-cubeFaceSize)][cubeFaceSize+y] = noise.noise3D(cubeFaceSize-(x-cubeFaceSize), y, cubeFaceSize); } } } //X STATIC for(int y = 0; y < cubeFaceSize; y++) { for(int x = 0; x < cubeFaceSize * 2; x++) { //Generates LEFT if(x < cubeFaceSize) { cubeMap[x][cubeFaceSize+y] = noise.noise3D(0, y, cubeFaceSize-x); } //Generates RIGHT else { cubeMap[cubeFaceSize*2+(x-cubeFaceSize)][cubeFaceSize+y] = noise.noise3D(cubeFaceSize, y, x-cubeFaceSize); } } } //Y STATIC for(int y = 0; y < cubeFaceSize * 2; y++) { for(int x = 0; x < cubeFaceSize; x++) { //Generates TOP if(y < cubeFaceSize) { cubeMap[cubeFaceSize+x][y] = noise.noise3D(x, 0, cubeFaceSize-y); } //Generates BOTTOM else { cubeMap[cubeFaceSize+x][cubeFaceSize*2+(y-cubeFaceSize)] = noise.noise3D(x, cubeFaceSize, y-cubeFaceSize); } } } 

Dengan cara ini, kita dapat membuat peta kubik yang dapat dengan mudah dikonversi ke proyeksi dengan spasi yang sama menggunakan kode indah yang ditulis oleh Bartosz .

gambar

Algoritma menghasilkan peta kubik.

gambar

Transformasi yang sama dari peta kubik.

gambar

Globe peta kubik yang diberikan di maptoglobe.com .

Seperti yang Anda lihat, sebuah peta yang sama jaraknya memiliki bentuk yang jauh lebih indah, dan ketika ditumpangkan pada sebuah bola, itu menciptakan hasil yang mirip dengan superposisi bola, tanpa semua kekurangannya. Omong-omong, proyeksi berjarak sama dapat dengan mudah dikonversi oleh program yang berbeda, misalnya, NASA G.Projector , menjadi hampir semua jenis kartu.

Kesimpulannya


Menghasilkan seluruh planet bisa tampak seperti tugas yang menakutkan, dan meskipun kebisingan ketika digunakan dengan benar adalah alat yang cukup kuat, ia memiliki masalah sendiri yang telah dihadapi banyak orang selama berabad-abad, misalnya, menaburkan bola dunia pada kanvas 2D dengan distorsi minimal.

Solusi yang saya usulkan menciptakan planet-planet yang dihasilkan secara kasar yang tidak memperhitungkan lempeng tektonik, sungai, rantai pulau, dan bahkan gunung, dan karenanya hanya dapat digunakan sebagai demonstrasi atau sebagai dasar untuk simulasi yang lebih kompleks.

Bahkan, itu hanya membuat matriks nilai dalam rentang nilai tertentu. Untuk gambar skala abu-abu, ini 0-255. Nilai-nilai tersebut kemudian dikonversi ke piksel yang menciptakan gambar yang mirip dengan gambar pertama dalam skala abu-abu, atau ke gambar dalam rentang dari -11000 hingga 8000 untuk mensimulasikan perbedaan ketinggian dunia nyata, setelah itu piksel diwarnai sesuai dengan interval ketinggian (misalnya, nilai dari 0 5 diwarnai dengan warna pasir untuk mensimulasikan pantai) .

Dalam membangun alam semesta, Tuhan menggunakan matematika tingkat tinggi.

- Paul Dirac

Source: https://habr.com/ru/post/id448324/


All Articles