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?
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?
Jawaban:
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 v0
dan s0
parameter 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.
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 dt
kecil 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 dt
simulasi yang dapat Anda tangani untuk mendapatkan hasil yang cukup baik. Dan jika dt
yang masuk terlalu besar, maka cukup istirahat simulasi menjadi langkah-langkah kecil, di mana setiap langkah adalah maksimum dt
yang 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.
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 ...