Yanıtlar:
En basit yol Euler entegrasyonudur. Pozisyon vektörünü ve hız vektörünü saklamanız gerekir. Her karede:
( 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:
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:
İ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:
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:
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:
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.
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!
}
}
}
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).