Bagaimana cara membuat alam semesta tanpa batas?

15

Saya ingin tahu apa praktik terbaik dalam industri pengembangan game untuk membuat dunia 3d?

Untuk lebih spesifik:

  • Poin data diberikan dan statis. Setiap titik memiliki posisi, warna, dan ukuran;
  • Seluruh kumpulan data jauh lebih besar dari memori yang tersedia;
  • Pengguna harus dapat "memperkecil" untuk melihat gambar yang lebih besar sekaligus;

Pendekatan yang paling naif adalah dengan membagi alam semesta menjadi kubus dan hanya membuat apa yang terlihat. Saya tidak yakin bagaimana dalam skenario ini saya harus menerapkan "perkecil". Haruskah saya mengkompilasi kubus untuk setiap tingkat zoom yang memungkinkan? Atau mungkin ada pendekatan yang lebih baik?

Saya mencari solusi agnostik teknologi.

Anvaka
sumber
2
Apakah Anda berencana memiliki semacam jarak tampilan maksimum, atau apakah Anda memiliki cara menggabungkan titik-titik yang jauh sehingga Anda tidak perlu merendernya secara individual, atau apakah "titik" buram dan diatur sehingga sebagian besar dari mereka akan disembunyikan dari sudut pandang tertentu? Karena jika tidak ada yang di atas berlaku, saya tidak melihat cara untuk mencegah pengguna menemukan sudut kamera yang sebagian besar titik (atau setidaknya sebagian kecil dari mereka) akan terlihat pada saat yang sama.
Ilmari Karonen
4
Ngomong-ngomong, agak eksotis, tetapi sudahkah Anda mempertimbangkan data yang dihasilkan secara prosedural? Anda tidak mendapat manfaat dari bidang kerajinan kustom, tetapi hasilnya adalah konten didasarkan pada persamaan, bukan data dalam jumlah besar. Dengan beberapa kreativitas, itu dapat menyederhanakan banyak hal (:
Alan Wolfe
1
Zoom-out / zoom-in untuk infinite universebisa mirip dengan melacak hubungan antara dua titik pada beberapa kurva Mandelbrot setelah memperbesar ke level yang berbeda. Pada tingkat tertentu, Anda dapat kehilangan presisi dan tidak dapat membedakan atau bahkan menemukannya lagi.
user2338816
1
@AlanWolfe Custom crafting masih dimungkinkan - contoh utama adalah permainan Frontier lama, yang memiliki posisi bintang nyata untuk sekitar 1000 bintang atau lebih dekat dengan Sol (termasuk Sol dan planet serta bulan sebenarnya). Anda hanya memastikan mereka ada di tempat-tempat yang tidak dibuat secara prosedural, dan menambahkannya sebagai "lapisan" lain.
Luaan
@IlmariKaronen ya, Anda benar. Saya memiliki jarak tampilan maksimum, dan saya pikir saya akan menggabungkan titik jarak dengan mengikuti jawaban Ming-Tang
Anvaka

Jawaban:

8

Ini berdasarkan spekulasi saya dan membaca kode sumber Celestia.

Celestia memungkinkan Anda terbang mengelilingi planet dan memperkecil untuk melihat seluruh galaksi. Saya melihat-lihat kode sumbernya dan menemukannya menggunakan sebuah octree, sebuah struktur untuk membagi ruang secara rekursif menjadi 8 oktan.

Pemberi render akan mengubah lingkungan dengan melintasi octree, dan tidak melintasi objek jauh secara mendalam.

Celestia juga melacak magnitudo absolut oktan, di mana magnitudo absolut oktan didasarkan pada besarnya absolut bintang di dalam oktan. Jika oktan berdekatan, Celestia merender bintang secara individual, dan jika oktan jauh, Celestia menjadikan oktan sebagai satu bintang dengan besaran oktan.

Juga, bisa ada hierarki bermakna yang melekat pada objek. Misalnya, jika Anda dekat (jari-jari dinyatakan dalam basis data) ke sebuah bintang, planet-planetnya dirender. Jika sebuah planet cukup dekat (potongan piksel pada layar), model 3D-nya ditarik.

Game luar angkasa lain yang bisa saya beri nama adalah Orbiter dan Program Luar Angkasa Kerbal, yang merupakan sumber tertutup. Saya juga melihat ke Frontier Galaxy, yang secara prosedural menghasilkan peta bintang. Ada situs web yang menganalisis cara permainan bekerja dengan pembongkarannya: http://www.jongware.com/galaxy1.html

Ming-Tang
sumber
12

Ada sejumlah bagian dari teka-teki ini, yang masing-masing akan memberikan lubang kelinci yang dalam dan menarik untuk dieksplorasi. Beberapa dari mereka adalah:

  • Level of Detail - secara otomatis (atau "secara manual") memilih model terperinci atau disederhanakan, atau bahkan sprite atau hanya titik, atau untuk objek yang jauh.
  • Culling - memilih untuk hanya menggambar apa yang dibutuhkan. Ini mungkin apa yang ada di bidang pandang (frustum culling), apa yang tidak tersembunyi di balik hal-hal lain (oklusi culling), atau metode ad hoc lainnya. (Jawaban @Alan Wolfe menjelaskan beberapa cara untuk mengatur data Anda yang membantu memfasilitasi pemusnahan.)
  • Streaming - menarik data dunia dari penyimpanan ke dalam memori sesuai kebutuhan, jika tidak semuanya masuk ke memori sekaligus
  • Kotak langit - objek yang sangat jauh dapat dipra-render ke bola yang berada "jarak tak terbatas" dari kamera.

Dan saus rahasia Anda sendiri akan menjadi kombinasi apa dari ini, dan lainnya, teknik yang Anda gunakan, dan kapan, berdasarkan kebutuhan aplikasi khusus Anda.

david van brink
sumber
2

Apa pun yang hierarkis dan / atau jarang akan membantu Anda di sini.

Ada banyak ruang kosong, jadi tidak harus menggunakan penyimpanan untuk mewakili ruang kosong adalah suatu keharusan. Pendekatan hierarkis yang khas akan menjadi sesuatu seperti pohon Oktober yang secara rekursif membagi ruang menjadi 8 kubus yang lebih kecil, dan Anda dapat menyimpan objek dalam kubus terkecil yang dapat mereka tempati sepenuhnya.

Sebuah octree juga cukup bagus untuk Anda dapat menanyakannya untuk daftar semua objek dalam frustum tampilan yang akan memungkinkan Anda mendapatkan daftar hanya objek yang berada dalam sudut pandang Anda dan tidak terlalu jauh. Solusi jarang bisa berupa grid jarang di mana Anda dapat meminta informasi tentang lokasi x, y, z, tetapi Anda hanya perlu menyimpan informasi untuk sel yang bukan ruang kosong.

Pendekatan hierarkis umum lainnya yang digunakan termasuk pohon bsp (mereka membagi ruang menjadi 2 ruang setengah secara rekursif) serta pohon kd yang melakukan hal serupa.

Saya pribadi berpikir bahwa sebuah octree bisa menjadi awal yang baik untuk Anda, pastikan untuk membagi hanya sebanyak yang diperlukan sehingga Anda tidak membuang memori pada ruang kosong. juga, Anda mungkin akhirnya menginginkan solusi yang berbeda untuk objek statis Anda versus objek dinamis Anda.

Beberapa solusi (seperti bsp) bisa sangat efisien, tetapi membutuhkan waktu lama untuk membuatnya jadi biasanya bukan pilihan yang baik untuk memindahkan / mengubah objek.

Semoga itu bisa membantu, beri tahu saya jika Anda memiliki pertanyaan tentang detailnya!

Alan Wolfe
sumber