Düşme ve hızlanma hızı nasıl hesaplanır?


9

Bir uzay gemisini kontrol ettiğiniz ve çökmeden yere inmeniz gereken bir lander oyunu yapmayı düşünüyorum. Zaman motorlarına çalışma süresi ile ilgili düşme veya ivme hızını hesaplamak için basit bir formül nedir?

Yanıtlar:


28

En basit yol Euler entegrasyonudur. Pozisyon vektörünü ve hız vektörünü saklamanız gerekir. Her karede:

  • son entegrasyon adımından bu yana geçen zamanı ölçün: dt
  • motorlarınızdaki kuvvet vecoru hesaplayın: F
  • ivme vektörünü hesaplar: A = F / m, burada m uzay gemisi kütlesidir.
  • yerçekimi vektörünü ekleyin: A = A + G , G'nin gezegenin merkezine doğru baktığından emin olun
  • hız vektörünü güncelle V = V + A · dt
  • konum vektörünü güncelle X = X + V · dt

( skalerler için x , vektörler için X )

dt'nin küçük olduğundan emin olun ...

|G | toprak için yaklaşık 9.8 m / s² ve ay için yaklaşık 1.6 m / s²

genel olarak gravital etkileşime bağlı çıkarma kuvveti:

Newton'un evrensel çekim yasası

Her vücudu etkiler ve diğerini işaret eder.

G sayıl çok ünlüdür Yerçekimi sabiti bu 6.67e-011 N- (m / kg) ila yaklaşık ²

Hızlanma ile ilgilendiğiniz için:

Hızlanma

İvmenizi hesaplamak için sadece gezegenin kütlesini (m2) ve yarıçapını (r) bilmeniz gerekir.

Genellikle gezegeni uzay geminize doğru hareket ettiren ivme ihmal edilebilir, çünkü genellikle m1 m2'ye kıyasla ihmal edilebilir.

Ancak, küçük bir asteroide inmeye çalışıyorsanız, muhtemelen ikinci adımda toplam kuvvet vektörüne bu kuvveti ekleyen genel formülü kullanmanız gerekir.

DÜZENLE:

Gerektiği gibi uygulama hakkında bazı ipuçları. İhtiyacın olacak:

  • Bir vektör kütüphanesi
  • Motor Modeli
  • Fizik Modeli
  • Çarpışma algılama
  • Kullanıcı Arayüzü (giriş ve grafik oluşturma)

Her şeyden önce vektör kütüphanesi: oyununuz mono / bi / ağaç / dört ... boyutsal olabilir, durumunuzu 3D bir kelimenin bir projeksiyonu olarak gördüğünüz sürece, fiziksel kurallar tutar.

N seçtiğiniz boyutsa (muhtemelen sizin durumunuzda 2 veya 3), kütüphane aşağıdakilere sahip olmalıdır:

  • bir vektör depolama varlığı (her vektör için n kayan nokta numaralarının listesi)
  • bir toplam işleci (bileşen bileşen toplamı)
  • skaler çarpım operatörü (her bileşen bir kayan nokta ile çarpılır)
  • vektörler arasında nokta çarpma (bileşeni bileşene göre çarpma ve hepsini toplama)
  • vektör uzunluğu (bir vektörün kendi başına noktalanan kare kökü)

Bunu yapan bir kütüphaneyi kullanabilir veya kendiniz uygulayabilirsiniz; bir vektör bir yapı ya da sınıf olabilir, seçim sizin.

Her motor aşağıdakiler tarafından tanımlanmalıdır:

  • itme gücünü ve yönünü gösteren bir vektör
  • tam güçte iken saniyede yakıt kullanımını gösteren bir skaler;

kullanıcı girişiniz her motora 0 (kullanılmayan motor) ile 1 (tam güç) arasında bir sayı sağlamak için kullanılacaktır: motor (kullanım) faktörü.

Motorun gerçek güvenini elde etmek için itme vektörünün motor faktörünü çarpın ve mevcut tüm motorların tüm sonuçlarını toplayın; bu size ikinci adımın F değerini verecektir .

Motor faktörünüz her bir motor için gerçek yakıt kullanımını bilmek için kullanılabilir: motor faktörünü yakıt kullanımı ve anlık yakıt kullanımını bilmek için dt ile çarpın ; bu değeri toplam yakıt kapasitesi değişkeninden ayırabilirsiniz (bu size toplam kütle m , yakıt kütlesi ).

Şimdi yeni pozisyonu hesaplamak için entegrasyonu kullanmaya devam edebilir, gezegen yüzeyinizle çarpışmayı kontrol edebilirsiniz; eğer varsa, inişin başarılı mı yoksa felaket mi olduğunu söylemek için hız vektörünün uzunluğunu kullanın.

Açıkçası başka çarpışma kontrolleri yapılabilir / yapılmalıdır, bazı yüzey varlıklarına iniş noktası olarak izin verilemez, böylece her çarpışma ölümcül olur.

Nasıl girdi alacağımı ve uzay geminizi size nasıl yaratacağımı bırakıyorum; motor durumunu örneğin kare kare yapmak için motor faktörünü kullanabilirsiniz.


Bu harika, ama kodda nasıl çürütüleceğine dair bazı fikirler harika olurdu.
Dvole

1
nerede fizik öğrendim shiffman.net/teaching/nature
Ming-Tang

Bu adam Fiziğini biliyor!
MGZero

7

Diğer mükemmel cevap biraz teorik göründüğü gibi, basit kod versiyonu:

// 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
Basit tutmak. Bunun aradığı şey boyunca olmasını bekliyorum.
Beska

2

Ne yazık ki, buradaki matematik kıllı oluyor. FxIII'in cevabı düşen bir nesnenin genel durumu için iyidir, ancak bir roket hakkında konuşuyorsunuz - ve roketler yakıtı yakıyor.

Bunu yapan bir kod gördüm ama tamamen belgelenmemişti ve arkasındaki matematiği anlayamadım. İşlemci sınırlı olmadıkça bir şekilde rahatsız etmezdim ve basitçe zorlamayım - FxIIIs yaklaşımı oldukça kısa bir zaman çizelgesine uygulandı ve itmeyi ayarladı (veya yakıt korumak için yakıt yanarken roketin gazı döndüğünü anlarsanız yakıt kullanımını ayarlayın) roket yakıtı yakarken her bir iterasyon arasında belirtilen hızlanma yerine belirtilen hızlanma).


Yakıtın bitmesi sadece düşen bir parametreyi temsil eder. Bu sadece değeri azalan vektörel bir kuvvettir. Yanlış mıyım? Basit bir durumda, F'ye karşı G vardır, burada F roketin motorudur ve G yeryüzünün yerçekimidir: Bu durumda, her ikisini de birbirinize karşı ölçmeniz gerekir, böylece yakıt kalmazsa F 0'a düşer, böylece sadece G'yi nesnenize vektörel kuvvet olarak uygulamak zorundasınız. F'nin her değeri için çalışır. F> = G olduğu sürece nesne "hareket etmelidir" F yönünde hareket etmelidir
daemonfire300

2
@ daemonfire300: Yanlış anlıyorsun - yakıt tükenmesinin etkisinden değil, yakıt yakmanın etkisinden bahsediyorum. Motorunuzdaki sabit bir gaz kelebeği ayarı sürekli tırmanma hızlanma rakamı üretir, sabit hızlanma sürekli azalan yakıt yanma oranı üretir. Bu, FxIII'in verdiği basit hesapların yanlış yakıt kullanım sayıları üreteceği anlamına gelir.
Loren Pechtel

Yakıt yandığında A = F / M'den ivme kazanımı, yakıt kütlesinin araca oranı aşırı derecede yüksek veya yakıt yanma oranı benzer şekilde yüksek olmadıkça ihmal edilebilir bir değer olacaktır. Ne de olsa bu bir oyun.
Patrick Hughes

@Patrick Hughes: Herhangi bir gerçek roket inişi tarafından taşınan yakıt miktarı (Mars aerobrake / roket hibrid kasalarını saymıyorum) toplam ağırlığının önemli bir kısmıdır. Yakıt: sabitlenecek hızlanma oranının çok yanlış bir cevap vereceğini varsayarsak.
Loren Pechtel

1
Bu sorunun cevabı değil, sadece @ FxIII'in cevabı hakkında bir yorum.
Jonathan Connell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.