回答:
最も簡単な方法は、オイラー積分です。位置ベクトルと速度ベクトルを保存する必要があります。各フレームで:
(xはスカラー、Xはベクトル)
dtが小さいことを確認してください...
| G | 地球では約9.8 m /s²、月では約1.6 m /s²
一般に、重力相互作用による引力は次のとおりです。
それはそれぞれの体に影響を及ぼし、もう一方の体を指しています。
Gのスカラーは非常に有名であり、重力定数が6.67e-011 N(M / kg)の程度である²
加速に興味があるので:
加速度を計算するには、惑星の質量(m2)と半径(r)を知っているだけです。
通常、m1はm2と比較して無視できるため、通常、惑星を宇宙船に向かって移動させる加速度は無視できます。
ただし、小さな小惑星に着陸しようとしている場合は、おそらく2番目のステップでその力を合計力ベクトルに追加する一般式を使用する必要があります。
編集:
必要に応じて、実装に関するいくつかのヒント。必要になるだろう:
まず第一に、ベクトルライブラリ:あなたのゲームが3D単語の投影であると考える限り、あなたのゲームはモノ/バイ/ツリー/ 4 ...次元でありえます、物理的なルールは保持します。
nが選択した次元(おそらく2または3)の場合、ライブラリには以下が必要です。
これを実行するライブラリを使用するか、自分で実装することができます。ベクトルは構造体またはクラスにすることができ、選択はあなた次第です。
各エンジンは以下によって記述されるべきです:
ユーザー入力を使用して、各エンジンに0(未使用のエンジン)から1(フルパワー)までの数値を提供します。これは、エンジン(使用率)の係数です。
エンジンの推力ベクトルのエンジン係数を乗算して、エンジンの実際の信頼度を取得し、使用可能なすべてのエンジンのすべての結果を合計します。これにより、第2ステップのFが得られます。
エンジン係数を使用して、各エンジンの実際の燃料使用量を知ることができます。エンジン係数に燃料使用量を掛け、瞬時燃料使用量を知るにはdtを掛けます。総燃料容量変数からこの値を差し引くことができます(これにより、燃料の質量が大きい場合は、総質量mを更新できます)。
これで、統合を使用して新しい位置を計算し、惑星表面との衝突を確認できます。もしあれば、速度ベクトルの長さを使用して、着陸が成功したのか災害だったのかを伝えます。
明らかに他の衝突チェックを行うことができます/すべきです。一部のサーフェスエンティティはランディングポイントとして許可されないため、すべての衝突は致命的なものです。
入力を取得する方法と、宇宙船をレンダリングする方法は残しておきます。たとえば、エンジン係数を使用して、エンジンのステータスをフレームごとにレンダリングできます。
他の優れた答えは少し理論的なようですので、ここに単純なコードバージョンを示します。
// 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!
}
}
}
残念ながら、ここでの数学は毛深いです。FxIIIの答えは、落下物体の一般的なケースでは問題ありませんが、ロケットについて話しているのですが、ロケットは燃料を燃やします。
私はそれを行うコードを見てきましたが、それは完全に文書化されておらず、その背後にある数学を理解することができませんでした。CPUに制限がない限り、私は気にせず、力ずくでそれを強引に実行しません。FxIIIのアプローチは非常に短いタイムスケールで適用され、推力を調整します(または、燃料が燃え尽きるときにロケットのスロットルが戻ると、燃料の使用が維持されます。ロケットが燃料を燃焼させるときの各反復間の指定された推力ではなく、指定された加速。