Dapatkah tata surya direpresentasikan secara akurat dalam ruang 3d menggunakan dobel (atau rindu)?

15

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.)

Nicholas Hill
sumber
Bahasa apa yang Anda targetkan: C / C ++? Jawa? Sesuatu yang lain
Laurent Couvidou
4
@lorancou: Tidak relevan, ia secara eksplisit menentukan ukuran long.
DeadMG
@DeadMG Yang bisa 32-bit di C / C ++. 64-bit lebih dari a long long. Tapi ya, terserahlah, sebut saja nitpicking jika kamu mau.
Laurent Couvidou
Cukup gunakan BigInteger. Sebagian besar bahasa memiliki beberapa varian - nilai integer ukuran tidak terbatas (penggunaannya O (log (n)))
ashes999
Itu bisa menjadi jawaban, asalkan gamenya tidak terlalu berat dalam komputasi.
Laurent Couvidou

Jawaban:

11

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 ++:

printf("%.0Lf\n", 7.4e14);
printf("%.0Lf\n", 7.4e14 + 1.0);
printf("%.0Lf\n", 7.4e14 + 2.0);

Output:
-------
740000000000000
740000000000001
740000000000002

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:

printf("%.0Lf\n", 1.0e16);
printf("%.0Lf\n", 1.0e16 + 1.0);
printf("%.0Lf\n", 1.0e16 + 2.0);

Output:
-------
10000000000000000
10000000000000000 <-- oops
10000000000000002

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!

Laurent Couvidou
sumber
1
Jawaban ini bagus karena memetakan lebih mudah ke ruang floating point 3d yang digunakan oleh orang-orang seperti OpenGL dan DirectX, dan memiliki referensi yang baik. Karena itu, saya telah menandainya sebagai jawaban :)
Nicholas Hill
Keren :) Sebagai bonus, karena ini semua sangat perkiraan, Anda akan menemukan beberapa info lebih mendalam tentang pelampung di blog Bruce Dawson: randomascii.wordpress.com/2012/05/20/… .
Laurent Couvidou
17

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.

MichaelHouse
sumber
3
Cukup cantik. Versi singkat: Akurasi float adalah yang paling sedikit dari kekhawatiran Anda.
aaaaaaaaaaaa
1
Anda akan mendapatkan luapan dengan bilangan bulat, bahkan 64-bit. Pesawat ruang angkasa mengorbit di sekitar Pluto. Mencoba menghitung jarak dari pesawat ruang angkasa ke matahari. Mengkuadratkan. Ledakan.
Laurent Couvidou
3
Saya sangat tidak setuju dengan pernyataan di paragraf terakhir - pertanyaan OP masuk akal seperti itu, dan orang tidak perlu berharap untuk benar-benar memiliki item di setiap (kubik) sentimeter untuk peduli tentang akurasi 1cm pada posisi.
Steven Stadnicki
1
@StevenStadnicki Cukup adil, tetapi bahkan pada skala kilometer itu masih 164.029.188 gigabyte untuk 1 bit per kilometer kubik. Ini mirip dengan meminta ketepatan atom dalam speedometer mobil Anda. Itu jauh lebih akurat daripada yang seharusnya.
MichaelHouse
1
Nah, pergi ke AU atau skala tahun cahaya terlalu tepat. Karena kita berbicara tentang tata surya. Tahun cahaya atau parsec akan lebih baik untuk sesuatu yang lebih besar, seperti nebula besar.
MichaelHouse
2

Anda dapat menggunakan BigInteger, apa pun bahasa pemrograman Anda menyebutnya. Ini adalah bilangan bulat berukuran tidak terbatas; itu bersisik dengan baik - umumnya menggunakan log(n)penyimpanan untuk bilangan bulat ukuran n.

Java dan C # memilikinya; Saya yakin bahasa lain juga. Jika tidak, Anda dapat mendekompilasi dan mengimplementasikannya tanpa terlalu banyak kesulitan.

ashes999
sumber