Bagaimana saya harus menangani benda kecil di mesin fisika?

13

Saya membuat mesin fisika 3D untuk melempar dadu. Sampai sekarang dadu telah 1x1x1m dan gravitasi telah 9,82 m / s ^ 2. Ini tentu saja tidak terlihat realistis karena dadu akan merespons semuanya dengan cara yang terlihat agak lambat.

Untuk memperbaikinya saya mencoba mengubah semua ukuran untuk membuat dadu sekitar 0,02m di samping. Ini pada gilirannya membuat massa invers saya dan matriks inersia terbalik mendapatkan nilai yang sangat besar yang menyebabkan ketidakstabilan numerik.

Apa rute terbaik untuk menangani ini? Bisakah saya menjaga skala agar dadu 1x1x1 dan hanya mengubah massa atau ukuran gaya akting? Atau haruskah saya mengubah sesuatu yang lain?

Saya kira masalah yang sama bisa muncul jika Anda membuat game dengan tubuh fisik yang sangat besar seperti pesawat ruang angkasa atau sesuatu, jadi saya berharap seseorang telah mengalami sesuatu yang serupa sebelumnya.

Mikael Högström
sumber
Saya bukan ahli di sini, tetapi, tanpa kode apa pun, bagaimana kita bisa tahu apa masalahnya? Saya mungkin salah, karena Box2D memiliki masalah yang sama.
jcora
1
(Melihat semua upvotes, pasti ada cara konvensional untuk mengkode hal-hal ini, dan orang-orang tampaknya tahu apa masalah Anda. Saya kira saya salah.)
jcora
1
Ya saya pikir mungkin ada cara konvensional untuk menanganinya. Seperti yang saya lihat, ini bukan masalah kode melainkan masalah dengan ketepatan angka. Apa yang saya kejar bukanlah potongan kode untuk menyelesaikan masalah saya melainkan penjelasan tentang pendekatan untuk masalah ini.
Mikael Högström
Apakah maksud Anda presisi floating point?
jcora
Dalam arti ya. Kebalikan dari matriks inersia yang saya gunakan dalam penanganan tabrakan mendapat nilai yang sangat besar. Ini sebenarnya tidak dikondisikan sebagai elemen pivot mendapatkan nilai besar dan tidak ada banyak penambahan yang terjadi tetapi entah bagaimana harus ada masalah dengan ketepatan numerik karena simulasi dengan cepat berputar di luar kendali.
Mikael Högström

Jawaban:

1

Anda bisa

  • meningkatkan konstanta gravitasi? Game sering menggunakan 2 * 9,81 m / s ^ 2. Tidak ingat di mana saya membaca ini, tetapi game biasanya menggunakan unit yang tidak masuk akal. Apa pun konstanta yang terasa benar (buat game itu menyenangkan). Menggunakan konstanta realistis membuat fisika tampak lambat dan ringan.
  • jalankan simulasi dengan kecepatan lebih cepat. Jika Anda menggunakan cap waktu tetap, ini akan meningkatkan laju animasi.
  • gunakan pelampung presisi yang lebih tinggi?
torbjoernwh
sumber
Poin kedua tidak akan melakukan apa pun selain membuat simulasi lebih halus, atau bahkan mungkin mematahkannya jika simulasi berjalan terlalu cepat (saya tidak yakin apakah ini masalah yang realistis, tetapi jika dunia melangkah sebelum milidetik berlalu, waktu perbedaan akan selalu 0, dan tidak ada yang berhasil). Dia mungkin tidak ingin membuang memori pada pelampung presisi yang lebih tinggi.
jcora
1
Game sering menggunakan gravitasi ganda? Kata siapa?
GameDev-er
Saya tidak dapat mengubah kecepatan atau akurasi tetapi saya akan mencoba mengubah gravitasi.
Mikael Högström
Mengubah gravitasi konstan membuat dadu umumnya bergerak lebih cepat, memberi kesan bahwa semuanya dalam skala yang lebih kecil. Hal ini membuat perilaku lebih gelisah meskipun dengan microcollisions untuk menangani percepatan antara-frame. Saya kira saya hanya perlu men-tweak-nya :)
Mikael Högström
4

Jika Anda mengalami masalah dengan nilai-nilai numerik kecil, saya sarankan Anda mengurangi semuanya. Anda bahkan mungkin tidak menggunakan unit pengukuran "nyata", tetapi hanya beberapa unit "generik" yang hanya masuk akal di dalam mesin.

Opsi pertama, penskalaan, akan mengharuskan Anda menggunakan milimeter atau sentimeter sebagai unit pengukuran dasar. Dimensi kubus Anda tidak akan menderita kehilangan presisi.

Solusi kedua pada dasarnya adalah hal yang sama, tetapi Anda tidak perlu memikirkan unit yang sebenarnya.

Juga, mengapa Anda tidak mengubah massa kubus saja?

jcora
sumber
Karena satu-satunya generator gaya yang saya miliki adalah massa perubahan berbasis gravitasi / accelerometer tidak mengubah perilaku. Saran Anda dapat digunakan sebaliknya (mungkin itu yang Anda maksudkan) memberikan benda kecil massa yang lebih besar, membuat massa kebalikannya lebih dekat dengan satu dan dengan demikian mengurangi ketidakstabilan angka. Ini memberikan masalah yang sama seperti hanya meningkatkan gravitasi konstan.
Mikael Högström
0

Saya pikir saya harus membagikan solusi terakhir saya untuk masalah ini. Meningkatkan gravitasi konstan seperti yang disarankan memang membuat dadu bergerak lebih cepat sehingga memberi kesan skala yang benar. Namun, ini meningkatkan masalah microbouncing. Saya menambahkan microcollisions yang mengurangi masalah meskipun tidak menyelesaikannya dengan sempurna. Perhatikan bahwa ini menjadi masalah hanya untuk objek "kecil", jika Anda mengalami masalah terbalik dan ingin mensimulasikan objek yang sangat besar (pesawat ruang angkasa atau sesuatu seperti itu) maka Anda tidak akan mendapatkan masalah microbouncing sama sekali dan dapat bersaing dengan solusi itu.

Jadi saya menemukan tingkat gravitasi tertinggi yang bisa saya miliki tanpa terlalu banyak "microbouncing". Kemudian saya menggunakan deteksi guncangan sederhana pada telepon yang merespons perubahan besar dari pembacaan accelerometer dan impuls yang diterapkan ke semua objek ketika getaran tersebut terdeteksi. Itu tidak sempurna tetapi karena akan mengatur dadu bergerak cepat ketika ponsel diguncang, itu akan memberi kesan dadu "kecil". Ini sedikit hack tetapi harus dilakukan :) Berikut adalah klip dari mesin yang sedang beraksi.

Mikael Högström
sumber