Saya ingin tahu bagaimana cara terbaik mengatur koordinat dalam game 3D yang tujuannya adalah untuk memodelkan seluruh sistem tata surya secara realistis, namun dapat menangani gerakan terkecil dalam "kapal" (yaitu: mungkin kita dapat menganggap 1cm sebagai yang terkecil. gerakan yang dapat diterima untuk bingkai). Apakah 64-bit ganda (atau panjang 64-bit) mendukung ini, atau apakah kita mengalami masalah melimpah? Jika tidak, maka haruskah panjang atau ganda digunakan, atau jika demikian, maka pendekatan alternatif mana yang menurut Anda paling masuk akal untuk pemodelan posisi di tata surya dalam game 3D? (yaitu: hanya memegang sedikit sistem di layar pada waktu berdasarkan jarak ke kapal, atau memiliki sistem yang diwakili dalam ruang koordinat yang berbeda, dll.)
15
long
.long long
. Tapi ya, terserahlah, sebut saja nitpicking jika kamu mau.Jawaban:
Sudah ada jawaban yang bagus tentang bilangan bulat, tapi saya merasa seperti floating-point tidak harus dihilangkan. Dalam jawabannya, Byte56 mengambil pilihan untuk mencari orbit maksimum Pluto, mungkin diambil dari lembar excel ini , jadi saya akan tetap berpegang pada itu.
Itu menempatkan batas tata surya di:
7.376.000.000 km = 7.376x10 ^ 9 km = 7.376x10 ^ 14 cm ≈ 7.4x10 ^ 14 cm
The Double-presisi floating-point format yang menawarkan presisi maksimal 15 desimal signifikan. Jadi Anda beruntung: jika asal Anda berada di pusat Matahari dan Anda menggunakan posisi di sekitar Pluto, Anda dapat mewakili semua sentimeter, misalnya dalam C ++:
Jadi, jika Anda dapat membatasi gim Anda hingga orbit Pluto, maka selamat! Anda memiliki ketepatan yang cukup dengan ganda untuk mewakilinya.
Berhati-hatilah, itu cukup untuk merepresentasikannya dalam simulasi , tetapi jangan berharap untuk membuat ini tanpa rasa sakit. Anda harus mengonversi ke pelampung 32-bit, mungkin mengubah asal Anda sehingga Anda mendapatkan cukup presisi pada objek dekat, dan Anda mungkin harus bergantung pada beberapa tipu daya Z-buffer dan kamera untuk mendapatkan semua ini agar ditampilkan dengan benar .
Sekarang, jika Anda ingin astronot Anda mengunjungi beberapa komet yang jauh di awan Oort , yang jauh lebih besar, maka itu sudah berakhir. Sekitar 10 ^ 16 cm, Anda mulai kehilangan keakuratan:
Dan semakin memburuk, tentu saja.
Jadi jika Anda dalam hal ini, Anda mungkin ingin mencoba beberapa solusi yang lebih maju. Saya sarankan Anda melihat artikel Peter Freeze di Game Programming Gems 4: "2.3 Memecahkan Masalah Akurasi di Koordinat Dunia Besar". IIRC, ia menyarankan sistem yang mungkin sesuai dengan kebutuhan Anda, itu memang semacam beberapa ruang koordinasi yang berbeda.
Itu hanya beberapa petunjuk, Anda mungkin harus menggunakan beberapa resep Anda sendiri untuk menjalankan ini. Seseorang yang sudah menerapkan hal semacam itu mungkin dapat membantu Anda lebih banyak. Mengapa tidak mengirim email ke orang-orang di belakang Program Luar Angkasa Kerbal misalnya?
Semoga berhasil dengan game Anda!
sumber
Dengan asumsi Pluto untuk "tepi" tata surya (meskipun beberapa mengatakan itu sejauh 3 tahun cahaya). Pluto, saat itu orbit maksimumnya sekitar 7.376.000.000 kilometer dari matahari. Itu 7,37600 × 10 ^ 14 sentimeter. Gandakan itu untuk mendapatkan diameter dan Anda akan mendapatkan 1.475.200.000.000.000.000 sentimeter. Itu juga dalam ukuran maksimum 64 bit. Karena ketinggian tata surya dapat diabaikan dibandingkan dengan diameternya, kita dapat mengabaikannya.
Jadi ya, Anda bisa menggunakan waktu yang lama untuk mewakili posisi Anda di tata surya. Bahkan, Anda bisa memiliki posisi keluar sejauh 9,75 tahun cahaya dengan panjang yang ditandatangani (dua kali lipat untuk yang tidak ditandatangani).
Perhatikan bahwa ini bukan kasus untuk menemukan jarak. Jarak maksimum yang dapat Anda temukan adalah akar kuadrat dari jarak maksimum yang dapat Anda tempuh. Ini dapat diatasi dengan menggunakan sistem level detail untuk menemukan jarak. Anda dapat melakukan beberapa pemeriksaan sederhana untuk menebak seberapa jauh jaraknya (bandingkan nilai x dan nilai y), lalu gunakan kenaikan 1.000.000 kilometer untuk jarak besar ke kenaikan sentimeter untuk jarak kecil.
Tentu saja ada pertanyaan, apakah Anda benar-benar ingin? 99,999% dari tata surya benar-benar ruang kosong yang tidak menarik. Jika Anda secara akurat mewakili tata surya, saya harap Anda tidak mewakili fisika secara akurat. Butuh waktu lama untuk berkeliling tata surya. Terlalu lama bagi kebanyakan orang untuk tetap tertarik.
Dan mengapa bahkan memiliki akurasi yang begitu bagus kecuali Anda juga akan memodelkan objek-objek di tata surya dengan akurasi itu? Di situlah Anda akan mendapat masalah. Volume matahari adalah 1,40900 × 10 ^ 18 kilometer kubik. Pada skala sentimeter kubik, menggunakan bit tunggal untuk menyatakan bahwa ruang yang "ditempati" membutuhkan 1,4 × 10 ^ 33 bit atau 1,6 × 10 ^ 23 gigabyte. Saya pikir Anda tidak memiliki banyak RAM.
sumber
Anda dapat menggunakan
BigInteger
, apa pun bahasa pemrograman Anda menyebutnya. Ini adalah bilangan bulat berukuran tidak terbatas; itu bersisik dengan baik - umumnya menggunakanlog(n)
penyimpanan untuk bilangan bulat ukurann
.Java dan C # memilikinya; Saya yakin bahasa lain juga. Jika tidak, Anda dapat mendekompilasi dan mengimplementasikannya tanpa terlalu banyak kesulitan.
sumber