Bagaimana cara memuat planet bola dan wilayahnya?

14

Saya merancang game yang sebagian terdiri dari eksplorasi planet. Saya ingin menggunakan generasi pseudo-acak untuk mereka, beregenerasi dari benih yang ditentukan ketika saya harus memuatnya daripada menyimpan setiap detail, yang akan terlalu berat. Jadi saya hanya akan menyimpan dalam file benih acak dan modifikasi yang dilakukan oleh pemain jika ada.

Pemain harus dapat melihat planet ini dari orbit (dengan tingkat detail yang sangat rendah, kemudian turun ke tanah, perlahan-lahan meningkatkan level detail wilayah tempat dia mendarat, dan menurunkan yang ada di sisi lain) planet, yang pergi di luar bidang pandang pemain.

Jika saya harus melakukannya di tanah pesawat, saya akan melakukannya dengan mudah dengan sistem chunk square. Tetapi masalahnya di sini adalah bahwa planet hampir-hampir bulat.

Jadi apa cara terbaik untuk memuat detail tanah (relief dan objek yang dibumikan) di sekitar titik yang tepat?
Saya sudah memikirkan dua solusi, tetapi keduanya memiliki titik lemah:

1. Memotong bola dalam potongan persegi.

metode potongan persegi

Setelah pemain cukup dekat dengan tanah, saya hanya perlu meningkatkan detail kotak terdekat dari posisinya.
Jika itu tidak cukup, saya masih bisa memotong setiap kotak dalam sub-kotak untuk memuat ketika para pemain berada atau benar-benar dekat dengan tanah.

Tetapi seperti yang Anda lihat pada gambar, ada masalah jika pemain mencoba mendarat di tiang: kotak menjadi sangat ramping, atau bahkan segitiga untuk baris terakhir, dan juga fakta bahwa mereka akan banyak memuat, generasi akan tampak terdistorsi.

2. Mulai dari icosahedron.

metode icosahedron

Di sini, saya bisa meningkatkan tessellation segitiga di sekitar posisi pemain ketika dia semakin dekat.

Tapi saya tidak tahu bagaimana menempatkan segitiga lebih dekat dari posisi pemain. Saya mendengar koordinat Cartesian bisa berguna dalam kasus itu, tetapi saya tidak tahu bagaimana menggunakannya.


Saya menggunakan C ++ / OpenGL untuk itu, jadi hal utama untuk menghasilkan dan memuat di sini adalah simpul yang mewakili relief permukaan dan warna / tekstur.

Aracthor
sumber
Sebelum saya mulai menulis, apakah dunia Anda seperti bola? Apakah Anda mencoba untuk memaksakan kisi pada bola di mana setiap kisi memiliki properti yang disimpan ke file?
Alec Teal
@AlecTeal Saya mencoba mensimulasikan planet. Jadi itu adalah bola global. Dan masalah utama adalah bahwa pemain dapat mencoba untuk mendarat pada titik mana pun, pada tiang atau sepanjang khatulistiwa.
Aracthor
2
Jadi .... harus bertanya apakah Anda mencari "mesin game dunia bola" karena ada banyak implementasi di sana. Kenapa mereka tidak bekerja? Selain itu inilah mengapa kami memiliki peta kubus, mereka adalah bagan standar pada setiap homeomorfik berjenis topologi untuk bola karena alasan ini!
Alec Teal
1
menyarankan untuk mengevaluasi juga opsi quad sphere
dnk drone.vs.drones
maths.kisogo.com/index.php?title=Notes:Spherical_coordinates konsep awal. Membutuhkan gambar dan untuk dihabisi.
Alec Teal

Jawaban:

5

Oke, jadi saya menulisnya di sini:

http://www.maths.kisogo.com/index.php?title=Notes:Spherical_coordinates

(Saya membutuhkan markup matematika dan juga itu sangat panjang)


Menerapkan dokumen

Dokumen dimulai dengan memperkenalkan gagasan manifold, manifold adalah hal ini di mana bongkahannya adalah "homeomorfis" (pada dasarnya: sama dengan) bongkahan R ^ n (R ^ 2 adalah bidang x / y, seperti yang Anda bayangkan) tahu)

Bagan mencakup beberapa (mungkin semua, meskipun dalam kasus bola itu TIDAK BISA mencakup semua) dari bermacam-macam.

Dalam artikel saya mengembangkan 4 grafik untuk bola yang menjaga sudut, yaitu mereka menjaga jarak teratur.

Seperti yang Anda ketahui memberi koordinat ke titik pada bola sebenarnya cukup sulit! Apa yang kita lakukan sebagai gantinya (walaupun pada lingkaran dalam contoh) adalah memberikan setiap titik koordinat dari bentuk (i, x, y) di mana i adalah angka antara 1 dan 6 untuk bola, 1 dan 4 untuk lingkaran. Ini adalah nomor grafik.

X dan y merujuk ke sudut pada bagan itu (atau hanya x jika itu sebuah lingkaran).

6 grafik bola adalah belahan atas / bawah, kiri / kanan dan belahan depan / belakang.


Koordinat

Sekarang Anda dapat memberikan titik koordinat "bagus" koordinat yang berperilaku baik. Dalam istilah matematika, domain dari grafik adalah peta "terbuka", ini berarti ada beberapa angka positif sehingga bola di sekitar setiap titik juga ada di set. Misalnya rentang (0,1) (himpunan yang berisi x jika 0 <x <1) terbuka, ambil p dalam (0,1) (misalnya 0,001) lalu ada angka (misalnya 0,0005) seperti bahwa setiap titik dalam 0,0005 dari 0,001 juga dalam (0,1).

Artinya, Anda dapat melewati petunjuk melalui grafik.

Sekarang ada 45 derajat tumpang tindih dalam grafik yang kami kembangkan. Ini berarti jika Anda memiliki fitur pada koordinat (i, x, y), Anda dapat menentukan titik-titik formulir dengan aman (i, x + a, y + b) selama adan bberada di antara -45 dan +45 (dalam derajat)

Titik mana pun dari bentuk (i, x + a, y + b) dapat dengan mudah diubah menjadi titik dalam ruang 3 dimensi "normal" tanpa masalah.


Penerapan

Anda sekarang memiliki cara untuk menyimpan koordinat untuk sesuatu pada suatu bola, dan menunjukkan daerah petak besar ruang dengan koordinat ini, mereka juga berperilaku seperti koordinat, mereka terbuka misalnya (yang merupakan masalah jika Anda menggunakan 2 sudut saja)

Anda juga dapat benar-benar membuang jawaban "cara membuat bola biasa" sekarang karena yang harus Anda lakukan adalah melakukan 6 pesawat, dan pastikan ujung-ujungnya sejajar (yang sepele) dan hasilnya adalah:

Anda akan memiliki bola yang bagus dengan koordinat yang mudah digunakan

Setiap pertanyaan, silakan komentari, saya sudah mencoba untuk mengasumsikan sedikit pengetahuan sebelumnya. Saya juga baru mengajar orang

Alec Teal
sumber
@Alec_Teal Saya pada jawaban Anda sejak Anda mempostingnya, rumit dan sulit dimengerti (saya tidak menggunakan begitu banyak rumus matematika) tapi saya pikir saya harus mengerti ... Apakah metode Anda benar-benar berbeda dari berbasis kubus bola seperti yang dijelaskan di atas? Saya tidak mengerti apakah "grafik" Anda adalah proyeksi persegi atau sesuatu yang lebih ...
Aracthor
@ Archer lebih umum. Bagan secara harfiah seperti bagan dalam buku (peta) yang dilakukannya adalah memaksakan kisi pada beberapa area. Katakanlah Anda memiliki torus misalnya, atau torus 2 holed, Anda akan memerlukan metode ini. Tidak ada jawaban di sini yang berurusan dengan koordinat pada bola sebanyak cara biasa untuk membuat geometri, yang merupakan tugas yang berbeda. Saya dapat membantu dengan formula, saya sudah mencoba menulisnya semudah mungkin, tapi ini roti dan mentega saya, jadi saya tidak melihat kerumitannya.
Alec Teal
@Alec_Teal Saya memvalidasinya, tapi saya masih berpikir saya tidak mendapatkan semuanya. Tapi mari kita lanjutkan diskusi ini di ruang obrolan .
Aracthor
12

Seperti yang sudah Anda tunjukkan, ada sejumlah solusi untuk masalah ini, tetapi tidak ada yang 100% ideal. Bola itu rumit.

Berbasis kubus

Salah satu rute yang umum, digunakan oleh Spore dan kemungkinan besar permainan lainnya (meskipun sulit untuk memastikan tanpa mengintip di bawah tenda), adalah memproyeksikan bola ke kubus, dan menggunakan kotak persegi di atas setiap permukaan kubus.

(Inilah yang dijelaskan oleh Alec Teal dan dnk drone.vs.drones dalam komentar di atas)

Sphere dibagi lagi berdasarkan kubus

( Gambar dari pos ini yang menjelaskan menggunakan representasi kubik untuk LoD )

Ini memiliki banyak keuntungan dari metode lintang-bujur, dengan distorsi puncak yang jauh lebih sedikit. Sangat mudah untuk mengubah bolak-balik antara posisi pada grid wajah dan posisi pada bola, dengan menormalkan vektor atau membaginya dengan komponen terbesarnya dalam nilai absolut. Ini juga selaras dengan teknik pemetaan tekstur kubus , yang dapat berguna saat melihat seluruh planet dari kejauhan.

Pendekatan pemetaan yang khas disebut proyeksi gnomonik , dan masih memiliki masalah ketidakcocokan kepadatan seperti yang Anda lihat pada gambar di atas. Grid jauh lebih padat di dekat sudut kubus daripada di tengah-tengah wajah. Jika keseragaman itu penting, Anda bisa menguranginya dengan rumus pemetaan yang tepat, tetapi ini biasanya membuat pemetaan lebih sulit untuk dibalik.

Memvariasikan fungsi pemetaan untuk meningkatkan keseragaman

Dalam semua kasus, Anda masih akan memiliki distorsi sudut di sudut-sudut, di mana perpotongan kotak biasa dari empat kotak dengan sudut 90 derajat menjadi pertemuan 3 belah ketupat dengan sudut 120 derajat.

Berbasis Icosahedron

Pendekatan favorit pribadi saya adalah versi icosahedral yang Anda gambarkan, karena itu membuat distorsi sudut puncak sekecil mungkin. Jika kisi-kisi segitiga biasanya memiliki enam rapat segitiga pada sudut 60 derajat, simpul icosahedron memiliki 5 segitiga pertemuan pada sudut 72 derajat. Jadi masing-masing memiliki lebih sedikit distorsi daripada kotak dalam contoh kubus.

Ini bukan wilayah yang sama akrabnya dengan kotak dari versi kubus, yang mungkin mengapa itu tidak sepopuler itu. Dibutuhkan lebih banyak matematika untuk menyelesaikannya.

Mengidentifikasi poin terdekat tidak sesulit yang mungkin terlihat. Setiap bola geodesik berbasis icosahedron dapat diratakan ke kisi segitiga biasa:

Meratakan tessellations geodesik ke kotak segitiga biasa Bersih dari icosahedron pada kotak segitiga

Dan kotak segitiga biasa dapat diperlakukan seperti kotak persegi, seperti yang dibahas di sini .

Isomorfisme kotak segitiga-persegi

Jadi, begitu Anda menentukan wajah icosahedron yang Anda pakai (yang dapat dilakukan dengan raycast terhadap mesh icosahedral - Saya tidak tahu adanya cara matematika yang cerdas untuk menyederhanakan bagian itu), lingkungan dapat diisi menggunakan familiar grid traversal. :)

Edit:

Jika Anda menggunakan geodesik Kelas-I, Anda dapat membuka planet Anda menjadi lima bagan persegi panjang untuk menyimpan potongan level / tekstur / ketinggian secara efisien, mirip dengan enam bagan persegi yang Anda gunakan untuk menyimpan versi berbasis kubus:

Membuka bungkus geosfer ke dalam bagan persegi panjang

(Ini dapat membantu mengatasi masalah yang dikemukakan oleh Fuzzy Logic dalam jawaban lain. Ini juga mungkin tetapi sedikit lebih rumit untuk geodesik Kelas-II. Saya belum menyelidiki Kelas-III)

Kuncinya adalah bahwa sumbu grafik ini tidak benar-benar tegak lurus digunakan, sehingga alat / teknologi pengeditan dan streaming yang ada tidak akan mendukungnya di luar kotak. Jika Anda berencana untuk menulis chunk streaming Anda sendiri atau menggunakan generasi prosedural on-the-fly maka itu mungkin tidak menjadi masalah. Anda mungkin juga dapat mengatasi masalah penulisan dengan membuat peta sumber Anda dalam resolusi yang lebih tinggi daripada yang Anda butuhkan menggunakan alat yang lebih konvensional, kemudian menjalankannya melalui proses pembuatan yang sampel di sepanjang kotak grafik untuk membangun representasi padat, efisien yang dihubungkan langsung ke dalam struktur icosahedral.

DMGregory
sumber
1
Ada beberapa barang bagus di sini. Saya akan memberi +1 tetapi saya berencana untuk menulis jawaban nanti (saya mencoba untuk tidak mengikuti tahap awal pemungutan suara ketika saya juga menjawab). Satu-satunya komentar saya adalah bahwa pendekatan ini lebih baik untuk merender bidang daripada memodelkan permukaan
Alec Teal
Hanya jika Anda penasaran, saya sekarang telah menyelesaikan jawaban saya.
Alec Teal
4

Quad-sphere dengan chunked LOD adalah metode yang lebih disukai jika Anda ingin dapat pergi dari ruang ke tanah dengan level medan apa pun yang terperinci, baik pemetaan ketinggian dan tekstur prosedural atau standar.

Icosasphere menyediakan jala yang lebih seragam dan mudah dikenali tetapi menimbulkan masalah saat mencoba memetakan tekstur dan pemetaan ketinggian yang perlu Anda cache dan tidak akan terlalu ringkas atau sederhana seperti itu.

Quad-sphere memiliki titik jepit tetapi dengan tessellation yang cukup Anda tidak akan melihatnya. Kemudian Anda dapat memetakan tekstur dan mengimplementasikan DLOD secara efektif seolah-olah setiap wilayah (chunk) adalah kotak persegi dengan sedikit masalah. Ini lebih sederhana untuk diimplementasikan dibandingkan dengan icosasphere dan akan lebih efisien, baik dalam komputasi maupun sumber daya.

Lihat artikel Sean O'Neil tentang menghasilkan semesta prosedural di Gamasutra:
- Bagian 1 Perlin Noise dan Fractal Brownian Motion untuk pemetaan ketinggian dan tekstur.
- Bagian 2 Algoritma ROAM untuk mesh prosedural dengan DLOD untuk pembuatan planet. Menderita masalah kinerja. Tidak direkomendasikan tetapi bagus untuk nilai pendidikan.
- Bagian 3 Mengatasi masalah dengan masalah skala besar, optimisasi, dan floating point. Terutama terkait dengan skala alam semesta tetapi juga berlaku untuk planet ketika transisi dari skala tahun cahaya ke sentimeter jika Anda mau.
- Bagian 4 Membahas implementasi Quad-sphere dengan DLOD chunked (quad-tree) untuk generasi planet <- lihat artikel ini secara khusus

Logika Fuzzy
sumber
0

Saya bukan ahli pemrograman, tetapi Anda bisa memiliki semacam pos pemeriksaan. Sementara Anda dibersihkan melalui pos pemeriksaan keamanan, dengan animasi tentu saja, permukaan planet ini dapat memuat, dan sebaliknya.

Aidan.W
sumber
Ini menghindari masalah dengan membuka opsi untuk tidak merancang permukaan planet yang mudah meledak sebagai bola, tetapi tidak menyelesaikannya.
Philipp