Pemodelan orbit elips

8

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:

Ini yang saya lihat

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);
}
Nathon
sumber
merayu. yaaah D. Tes unit bahwa kode matematika terhadap hasil yang diketahui; dan semuanya akan baik-baik saja.
deceleratedcaviar

Jawaban:

7

Bug ada dalam fallfungsi. Kita punya

  1. delta: vektor dari sumur ke kapal
  2. force: besarnya gravitasi antara dua badan ini.

|force| adalah G * m1 * m2 / r ^ 2

tapi |delta|sudah r! jadi Anda sebenarnya mempercepat terlalu cepat. Anda perlu membaginya rlagi (pada dasarnya menormalkan vektor delta) sebelum memanggil akselerasi.

accelerate(delta * well.mass * mass / rSquared / Math.sqrt(rSquared))
Jimmy
sumber
4

Perhatikan bahwa meskipun bug matematika telah diperbaiki, Anda menggunakan integrasi Euler (yaitu velocity += deltadan mungkin position += 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.

Nathan Reed
sumber