Metode simulasi fisika untuk kali delta besar?


9

Metode simulasi fisika apa yang paling cocok untuk waktu delta yang sangat besar (berjam-jam hingga beberapa minggu)?

Selain itu, apakah saya akan menghadapi masalah menggabungkan metode yang berbeda untuk delta besar dan kecil?


1
Ini sangat tergantung pada area target Anda. Sulit mengatakan apa-apa tanpa tahu lebih banyak tentang diri Anda di sana. Terlalu luas
Kromster

Pertanyaan ini terkait.
Anko

Pada prinsipnya, skala waktu yang tepat tergantung pada apa yang dialami pemain. Apakah Anda ingin akurat pada skala waktu minggu dan memiliki pemain berinteraksi dengannya secara real-time? Itu jauh lebih sulit daripada membuatnya bekerja pada skala waktu minggu yang dialami pemain pada waktu-waktu nyata ( yaitu satu detik pengalaman pemain adalah satu minggu waktu-nyata).
mklingen

jika Anda mensimulasikan gerakan awan, atau variabel termodinamika dalam sel dengan lebar ratusan meter, dengan dt 10 menit, itu masuk akal. tapi tubuh kaku pada skala biasa, tidak terlalu banyak. apa aplikasinya?
v.oddou

Aplikasi ini adalah "mengejar" mekanik di mana simulasi sejak beban terakhir (dari bagian dunia) dijalankan, logika permainan adalah semua berbasis callback di mana callback adalah timer atau collback callback, saya ingin dapat menjalankan fisika ke depan timer callback secara efisien, dan memiliki simulasi simulasi fisika dengan memanggil collback callbacks. Tabrakan relatif tidak mungkin, tetapi saya ingin collback callback memiliki status permainan (fisika) yang tersedia pada saat tabrakan.
fread2281

Jawaban:


5

Anda mungkin akan menggunakan akselerasi konstan untuk rentang waktu besar ini (yang bisa menjadi akselerasi nol). Turunan dari percepatan konstan sehubungan dengan waktu adalah 0. Itu berarti itu tidak berubah sehubungan dengan waktu, jadi tidak masalah seberapa besar waktu delta Anda.

Integrasi kecil ini sehubungan dengan waktu menyediakan persamaan yang Anda butuhkan.

a = a
v = at + v0
s = .5at^2 + v0*t + s0

Di mana: a = akselerasi, v = kecepatan, v0 = kecepatan awal, s = posisi, s0 = posisi awal, t = waktu

Dengan menggunakan strategi ini, Anda dapat menggunakan rentang waktu dari milidetik hingga berminggu-minggu jika Anda mau. Menggabungkan mereka akan diurus dalam v0dan s0parameter persamaan.

Untuk menangani benturan, Anda harus menerapkan strategi yang mirip dengan yang digunakan untuk objek kecil kecepatan tinggi . Pertama menghitung posisi baru menggunakan persamaan di atas, lalu menyapu antara posisi lama dan baru untuk semua objek. Karena salah satu dari benda-benda itu dapat berpotongan satu sama lain (beberapa menit atau hari sebelumnya), ini bisa menjadi sangat kompleks. Kemungkinan karena Anda memiliki waktu delta yang begitu besar, semoga Anda akan memiliki banyak waktu untuk memproses tabrakan potensial ini.


bagaimana dengan tabrakan?
fread2281

Saya telah memperbarui jawaban untuk memasukkan strategi untuk menangani tabrakan.
MichaelHouse

ini salah. Integrasi Euler diketahui menyimpang untuk integrasi konstan, sedangkan Verlet (atau RK2, RK4) tidak.
v.oddou

@ v.oddou Mengingat simulasi ini untuk permainan, saya rasa akurasi yang Anda butuhkan tidak diperlukan. Kompleksitas tambahan dan kesulitan menambahkan tabrakan untuk Verlet membuat integrasi Euler menjadi pilihan yang unggul.
MichaelHouse

2

Mari kita ambil contoh dengan gravitasi.

Dalam fungsi di bawah ini, anggaplah kita memiliki variabel anggota kelas untuk posisi dan kecepatan. Kita perlu memperbaruinya karena gaya gravitasi setiap detik.

void update( float dt )
{
   acceleration = G * m / r^2;
   velocity = velocity + acceleration * dt;
   position = position + velocity * dt;
}

Semakin dtkecil dan semakin kecil, simulasi kami menjadi semakin akurat (walaupun jikadt terlalu kecil maka kita dapat menemukan kesalahan presisi saat menambahkan angka kecil ke angka besar).

Pada dasarnya, Anda harus memutuskan maksimum dtsimulasi yang dapat Anda tangani untuk mendapatkan hasil yang cukup baik. Dan jika dtyang masuk terlalu besar, maka cukup istirahat simulasi menjadi langkah-langkah kecil, di mana setiap langkah adalah maksimum dtyang Anda izinkan.

void update( float dt )
{
   acceleration = G * m / r^2;
   velocity = velocity + acceleration * dt;
   position = position + velocity * dt;
}

// this is the function we call. The above function is a helper to this function.
void updateLargeDt( float dt )
{
    const float timeStep = 0.1;
    while( dt > timeStep   )
    {
        update( timeStep  );
        dt -= timeStep ;
    }

    update( dt );  // update with whatever dt is left over from above
}

Jadi dengan strategi ini, Anda bisa menyesuaikan timeStep dengan kesetiaan apa pun yang Anda butuhkan (jadikan itu detik, menit, jam, atau apa pun yang diperlukan untuk mendapatkan representasi fisika yang akurat.


1

Sebagian besar game cenderung menggunakan Euler sederhana metode untuk integrasi ke depan (yaitu, mengintegrasikan kecepatan ke posisi dari waktu ke waktu, dan mengintegrasikan percepatan ke dalam kecepatan). Sayangnya, metode Euler hanya cocok untuk rentang waktu yang sangat kecil dan jangka pendek.

Ada metode yang lebih kompleks yang lebih akurat dalam skala waktu yang sangat lama. Mungkin yang paling populer dan paling mudah diterapkan adalah Runge-Kutte-4 . RK4 menentukan posisi di masa depan dengan mengambil sampel empat posisi dan kecepatan di masa lalu dan melakukan interpolasi. Ini cenderung jauh lebih akurat daripada metode Euler dalam skala waktu yang lebih lama, tetapi lebih mahal secara komputasi.

Misalnya, jika Anda ingin menghitung fisika dari sebuah planet yang mengorbit nyata memperbarui setiap beberapa hari waktu nyata, metode Euler akan menyebabkan planet itu melesat ke luar angkasa setelah hanya beberapa orbit karena kesalahan numerik. RK4 umumnya akan menjaga planet ini mengorbit dalam bentuk yang hampir sama ribuan kali sebelum mengakumulasi terlalu banyak kesalahan.

Namun, mengimplementasikan tabrakan ke dalam RK4 bisa sangat menantang ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.