Planet Prosedural, Ketinggian Peta dan Tekstur

19

Saat ini saya sedang mengerjakan generator planet prosedural OpenGL. Saya berharap untuk menggunakannya untuk RPG luar angkasa, yang tidak akan memungkinkan pemain untuk turun ke permukaan planet jadi saya telah mengabaikan apa pun yang terkait dengan ROAM. Saat ini saya sedang menggambar kubus dengan VBO dan memetakan ke bola.

Saya akrab dengan sebagian besar teknik menghasilkan peta ketinggian fraktal dan telah menerapkan versi saya sendiri perpindahan titik tengah (tidak begitu berguna dalam kasus ini, saya tahu).

Pertanyaan saya adalah, apa cara terbaik untuk menghasilkan peta ketinggian secara prosedural. Saya telah melihat libnoise yang memungkinkan saya membuat pemetaan ketinggian / tekstur yang dapat dimiringkan, tetapi sejauh yang saya bisa lihat, saya perlu membuat jaring seperti ini .

Meninggalkan ubin jelas.

Adakah yang bisa memberi tahu saya tentang rute terbaik yang harus diambil?

Masukan apa pun akan sangat dihargai.

henryprescott
sumber

Jawaban:

18

Pertama-tama, saya tidak yakin mengapa Anda ingin menerapkan peta ketinggian (yaitu perpindahan geometri) jika orang tidak dapat mendarat, sepertinya lebih efisien untuk memetakannya secara normal atau sesuatu.

Dengan itu, apa yang Anda inginkan adalah mengkonversi dari arbitrer (x, y, z)ke (u, v)koordinat, yang sepele. Tidak membutuhkan cubemap.

teks alternatif

teks alternatif

  1. Setiap (u, v)texel memiliki tinggi (heightmap RGB = height) dan posisi (x, y, z) = pos.
  2. Temukan dan normalkan posisi NORMAL(x, y, z) = N,.
  3. Vertex baru = pos+N*height.

Ini akan bekerja lebih baik dengan tessellation yang lebih tinggi. Juga gunakan libnoisepemetaan bola yang tepat untuk heightmap Anda, yang akan terlihat seperti ini (tapi hitam dan putih):

teks alternatif

David Titarenco
sumber
1

Pemetaan ketinggian perpindahan titik tengah adalah tempat yang baik untuk memulai. OP, kenapa menurutmu itu tidak?

OP baik untuk memodelkan permukaan planet sebagai cubemap, karena setiap peta datar (misalnya proyeksi mercator) akan memiliki distorsi yang jelek dan rumit, secara matematis.

Jika saya OP, saya akan melupakan geometri planet skala besar pada awalnya. Saya akan membuat cubemap di mana setiap wajah adalah 2 ** N + 1 piksel (2,3,5,9,17,33 ...) dan setiap texel mengkodekan tinggi [0..N) di mana 0 adalah ketinggian dari parit terendah yang diharapkan dan N adalah ketinggian gunung tertinggi yang diharapkan di planet ini.

Saya kemudian akan menghitung ketinggian acak untuk delapan simpul kubus, dan menyebarkannya ke dalam enam kotak peta kubus, sehingga setiap simpul muncul tiga kali.

Saat saya secara rekursif menghasilkan ketinggian fraktal untuk titik tengah tepi, saya akan memastikan untuk menyebarkan simpul tepi wajah ke wajah lain yang berbagi.

Setelah saya selesai, saya memiliki peta kubus di mana semua tepi texel digandakan dan semua sudut texels adalah tiga kali lipat. Tidak perlu mengubahnya ke peta normal - saya akan menggunakan algoritma dalam makalah Morten Mikkelsen untuk membuat normals langsung dari heightmap saat runtime.

Saat runtime saya mungkin akan membuat quad yang mencakup proyeksi planet ke layar, dan melakukan tes persimpangan sinar-bola tunggal dalam pixel shader untuk menemukan apakah saya mengenai planet ini dan di mana. Tentu ketukan raster model bola sangat-tessellated, dan mendapat tepi halus yang bagus juga.

bmcnett
sumber
1

Derau perpindahan titik tengah, dengan perpindahan maksimum yang diskalakan dengan garis bujur absolut piksel dapat menghasilkan peta derau bola dengan cepat. Tabel warna mengambil ketinggian, kemiringan, dan sinar matahari atau bujur sebagai paramaters dapat digunakan untuk menaungi planet ini secara otomatis.

bjk
sumber