Bagaimana cara menghitung kecepatan jatuh dan percepatan?


9

Saya sedang berpikir untuk membuat game pendarat, di mana Anda mengontrol pesawat ruang angkasa dan perlu mendarat tanpa menabrak. Apa rumus sederhana untuk menghitung kecepatan jatuh atau akselerasi yang terkait dengan waktu kerja ke mesin waktu?

Jawaban:


28

Cara paling sederhana adalah integrasi Euler. Anda harus menyimpan vektor posisi dan vektor kecepatan. Di setiap bingkai:

  • mengukur waktu yang berlalu sejak langkah integrasi terakhir: dt
  • hitung force vecor karena engine Anda: F
  • hitung vektor percepatan: A = F / m di mana m adalah massa pesawat ruang angkasa.
  • tambahkan vektor gravitasi: A = A + G pastikan bahwa G menunjuk ke pusat planet
  • perbarui vektor kecepatan V = V + A · dt
  • perbarui vektor posisi X = X + V · dt

( x untuk skalar, X untuk vektor)

pastikan dt itu kecil ...

| G | sekitar 9,8 m / s² untuk bumi dan sekitar 1,6 m / s² untuk bulan

secara umum, gaya paksaan karena interaksi gravitasi adalah:

Hukum gravitasi universal Newton

Itu mempengaruhi setiap tubuh dan menunjuk ke yang lain.

The G skalar adalah sangat terkenal konstan gravitasi itu adalah tentang 6.67e-011 N (m / Kg) ²

Karena Anda tertarik dengan akselerasi:

Percepatan

Anda hanya perlu mengetahui massa planet (m2) dan radius (r) untuk menghitung akselerasi Anda.

Biasanya akselerasi yang menggerakkan planet menuju pesawat ruang angkasa Anda dapat diabaikan karena biasanya m1 dapat diabaikan dibandingkan dengan m2.

Namun, jika Anda mencoba mendarat di asteroid kecil, Anda mungkin harus menggunakan rumus umum yang menambahkan gaya tersebut ke vektor gaya total pada langkah kedua.

EDIT:

Seperti yang diperlukan beberapa petunjuk tentang implementasi. Anda akan perlu:

  • Perpustakaan vektor
  • Model mesin
  • Model Fisika
  • Deteksi Tabrakan
  • Antarmuka Pengguna (input dan rendering grafik)

Pertama-tama pustaka vektor: gim Anda bisa mono / bi / tree / four ... dimentional, sejauh yang Anda anggap sebagai proyeksi kata 3D, roule fisik akan bertahan.

Jika n adalah dimensi yang Anda pilih (mungkin 2 atau 3 dalam kasus Anda), perpustakaan harus memiliki:

  • entitas penyimpanan vektor (daftar n angka floating point untuk setiap vektor)
  • operator penjumlahan (penjumlahan komponen demi komponen)
  • operator perkalian skalar (setiap komponen dikalikan dengan float)
  • dot-perkalian antar vektor (gandakan komponen dengan komponen dan jumlah semua)
  • panjang vektor (akar kuadrat dari vektor dot-mutiplied dengan sendirinya)

Anda bisa menggunakan perpustakaan yang melakukan ini atau mengimplementasikannya sendiri; vektor dapat berupa struct atau kelas, pilihan ada di tangan Anda.

Setiap mesin harus dijelaskan oleh:

  • vektor yang menunjukkan kekuatan dorong dan arahnya
  • skalar yang menunjukkan penggunaan bahan bakar per detik saat dalam daya penuh;

input pengguna Anda akan digunakan untuk memberikan kepada setiap mesin angka yang akan berada antara 0 (mesin yang tidak digunakan) dan 1 (daya penuh): faktor mesin (penggunaan).

Lipat gandakan faktor engine untuk vektor dorongnya untuk mendapatkan kepercayaan mesin yang sesungguhnya dan simpulkan semua hasil dari semua mesin yang tersedia; ini akan memberi Anda F dari langkah kedua.

Faktor mesin Anda dapat digunakan untuk mengetahui penggunaan bahan bakar yang sebenarnya untuk setiap mesin: gandakan faktor mesin dengan penggunaan bahan bakar dan dengan dt untuk mengetahui penggunaan bahan bakar sesaat; Anda dapat kurangi nilai ini dari total variabel kapasitas bahan bakar (ini memberi Anda kesempatan untuk memperbarui massa total Anda m jika massa bahan bakar yang cukup).

Sekarang Anda dapat melanjutkan menggunakan integrasi untuk menghitung posisi baru, periksa tabrakan dengan permukaan planet Anda; jika ada, gunakan panjang vektor kecepatan untuk mengatakan apakah pendaratan itu sukses atau bencana.

Jelas pemeriksaan tabrakan lainnya dapat / harus dilakukan, beberapa entitas permukaan tidak dapat diizinkan sebagai titik pendaratan sehingga setiap tabrakan adalah fatal.

Saya meninggalkan cara mendapatkan input dan cara membuat pesawat ruang angkasa Anda untuk Anda; Anda dapat menggunakan faktor engine untuk merender bingkai status engine demi frame, misalnya.


Itu bagus, tetapi beberapa ide bagaimana mengimplementasikannya dalam kode akan bagus.
Dvole

1
di mana saya belajar fisika shiffman.net/teaching/nature
Ming-Tang

Orang ini tahu Fisika-nya!
MGZero

7

Karena jawaban lain yang sangat bagus tampaknya sedikit teoretis, inilah versi kode sederhana:

// Position of the lander:
var positionX =  100.0;
var positionY = 100.0;

// Velocity of lander
var velocityX = 0.0;
var velocityY = 0.0;

// Acceleration due to gravity
var gravity = 1.0;

// If the player is pressing the thrust buttons
var isThrusting = false;
var isThrustingLeft = false;
var isThrustingRight = false;

// Thrust acceleration
var thrust = -2.0;

// Vertical position of the ground
var groundY = 200.0;

// Maximum landing velocity
var maxLandingVelocity = 3.00;    

onUpdate()
{
    velocityY += gravity;

    positionX += velocityX;
    positionY += velocityY;

    if (isThrusting)
    {
        velocityY += thrust;
    }

    if (isThrustingLeft)
    {
        velocityX += thrust;
    }
    else if (isThrustingRight)
    {
        velocityX -= thrust;
    }

    if (positionY >= floorY)
    {
        if (velocityY > maxLandingVelocity)
        {
            // crashed!
        }
        else
        {
            // landed successfully!
        }
    }
}

2
Menjaga agar tetap sederhana. Saya berharap ini sesuai dengan apa yang dia cari.
Beska

2

Sayangnya, matematika di sini menjadi berbulu. Jawaban FxIII baik untuk kasus umum benda jatuh tetapi Anda berbicara tentang roket - dan roket membakar bahan bakar.

Saya telah melihat kode yang melakukannya tetapi benar-benar tidak berdokumen dan saya tidak pernah berhasil menghitung matematika di baliknya. Kecuali jika Anda terbatas pada CPU, entah bagaimana, saya tidak akan repot-repot dan cukup memaksakannya - pendekatan FxII diterapkan pada skala waktu yang cukup singkat dan sesuaikan gaya dorong (atau penggunaan bahan bakar jika Anda mengetahui roket melaju mundur saat bahan bakar terbakar untuk mempertahankan percepatan yang ditentukan daripada dorongan yang ditentukan) antara setiap iterasi saat roket membakar bahan bakar.


Keluar dari bahan bakar hanya merupakan parameter jatuh. Ini hanyalah kekuatan vektorial dengan nilai yang menurun. Apakah aku salah? Dalam kasus sederhana Anda memiliki G terhadap F, di mana F adalah mesin roket dan G gravitasi bumi: Dalam hal ini Anda hanya perlu mengukur keduanya terhadap satu sama lain, jadi jika tidak ada bahan bakar yang tersisa, F jatuh ke 0 sehingga Anda hanya harus menerapkan G sebagai kekuatan vektorial ke objek Anda. Berfungsi untuk setiap nilai F. Selama F> = G objek "harus" bergerak ke arah F.
daemonfire300

2
@ daemonfire300: Anda salah paham - Saya tidak berbicara tentang efek kehabisan bahan bakar, tetapi efek membakar bahan bakar. Pengaturan throttle yang konstan pada engine Anda menghasilkan angka akselerasi yang terus menanjak, akselerasi yang konstan menghasilkan laju pembakaran bahan bakar yang terus menurun. Ini berarti perhitungan sederhana yang FxIII berikan akan menghasilkan angka penggunaan bahan bakar yang salah.
Loren Pechtel

Jumlah perolehan akselerasi dari A = F / M saat bahan bakar dibakar akan menjadi nilai yang dapat diabaikan kecuali jika proporsi massa bahan bakar untuk kendaraan tinggi tidak masuk akal atau laju pembakaran bahan bakar sama tinggi. Lagipula ini adalah permainan.
Patrick Hughes

@ Patrick Hughes: Jumlah bahan bakar yang dibawa oleh pendarat roket sejati (saya tidak menghitung kasus hybrid aerobrake / roket Mars) adalah bagian substansial dari total beratnya. Dengan asumsi rasio bahan bakar: akselerasi yang akan diperbaiki akan menghasilkan jawaban yang sangat salah.
Loren Pechtel

1
Ini bukan jawaban untuk pertanyaan, hanya komentar pada jawaban @ FxIII.
Jonathan Connell
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.