Saya bermain dengan orbit dalam permainan 2-d sederhana di mana sebuah kapal terbang di angkasa dan tertarik pada hal-hal besar. Kecepatan kapal disimpan dalam vektor dan akselerasi diterapkan ke setiap frame yang sesuai dengan hukum gravitasi universal Newton. Massa titik tidak bergerak (hanya ada 1 sekarang) jadi saya akan mengharapkan orbit elips.
Sebaliknya, saya melihat ini:
Saya sudah mencoba dengan orbit yang hampir melingkar, dan saya telah mencoba membuat massa sangat berbeda (faktor sejuta) tetapi saya selalu mendapatkan orbit yang diputar ini.
Berikut beberapa kode (D), untuk konteks:
void accelerate(Vector delta)
{
velocity = velocity + delta; // Velocity is a member of the ship class.
}
// This function is called every frame with the fixed mass. It's a
// method of the ship's.
void fall(Well well)
{
// f=(m1 * m2)/(r**2)
// a=f/m
// Ship mass is 1, so a = f.
float mass = 1;
Vector delta = well.position - loc;
float rSquared = delta.magSquared;
float force = well.mass/rSquared;
accelerate(delta * force * mass);
}
mathematics
physics
orbit
Nathon
sumber
sumber
Jawaban:
Bug ada dalam
fall
fungsi. Kita punyadelta
: vektor dari sumur ke kapalforce
: besarnya gravitasi antara dua badan ini.|force|
adalah G * m1 * m2 / r ^ 2tapi
|delta|
sudah r! jadi Anda sebenarnya mempercepat terlalu cepat. Anda perlu membaginyar
lagi (pada dasarnya menormalkan vektor delta) sebelum memanggil akselerasi.sumber
Perhatikan bahwa meskipun bug matematika telah diperbaiki, Anda menggunakan integrasi Euler (yaitu
velocity += delta
dan mungkinposition += velocity
), jadi Anda mungkin akan mendapatkan beberapa efek aneh seperti rotasi elips orbital dari waktu ke waktu, dan mungkin elips semakin besar / lebih kecil sejak integrasi Euler tidak dijamin untuk menghemat energi.Anda mungkin ingin beralih ke lompatan integrasi , yang hemat energi dan harus bekerja lebih baik untuk mekanik orbital. Juga, Anda harus memasukkan waktu bingkai dalam persamaan Anda sehingga kecepatan simulasi Anda bebas framerate.
sumber