落下速度と加速速度を計算する方法は?


9

私はあなたが宇宙船を制御し、クラッシュせずに着陸する必要がある着陸船ゲームを作ることを考えています。エンジンの稼働時間に関連して落下または加速の速度を計算する簡単な式は何ですか?

回答:


28

最も簡単な方法は、オイラー積分です。位置ベクトルと速度ベクトルを保存する必要があります。各フレームで:

  • 最後の統合ステップから経過した時間を測定する:dt
  • エンジンによる力のベクトルを計算します:F
  • 加速度ベクトルを計算します。A = F / mここで、mは宇宙船の質量です。
  • 重力ベクトルを追加します:A = A + Gがいることを確認してくださいGは、地球の中心に向かってポイント
  • 速度ベクトルV = V + Adtを更新する
  • 位置ベクトルX = X + Vdtを更新する

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)の場合、ライブラリには以下が必要です。

  • ベクトルストレージエンティティ(各ベクトルのn個の浮動小数点数のリスト)
  • 合計演算子(コンポーネントごとの合計)
  • スカラー乗算演算子(各コンポーネントにfloatを掛けたもの)
  • ベクトル間のドット乗算(コンポーネントごとにコンポーネントを乗算し、すべてを合計する)
  • ベクトルの長さ(それ自体がドットで乗算されたベクトルの平方根)

これを実行するライブラリを使用するか、自分で実装することができます。ベクトルは構造体またはクラスにすることができ、選択はあなた次第です。

各エンジンは以下によって記述されるべきです:

  • その推力と方向を示すベクトル
  • 全出力時の1秒あたりの燃料使用量を示すスカラー。

ユーザー入力を使用して、各エンジンに0(未使用のエンジン)から1(フルパワー)までの数値を提供します。これは、エンジン(使用率)の係数です。

エンジンの推力ベクトルのエンジン係数を乗算して、エンジンの実際の信頼度を取得し、使用可能なすべてのエンジンのすべての結果を合計します。これにより、第2ステップのFが得られます。

エンジン係数を使用して、各エンジンの実際の燃料使用量を知ることができます。エンジン係数に燃料使用量を掛け、瞬時燃料使用量を知るにはdtを掛けます。総燃料容量変数からこの値を差し引くことができます(これにより、燃料の質量が大きい場合は、総質量mを更新できます)。

これで、統合を使用して新しい位置を計算し、惑星表面との衝突を確認できます。もしあれば、速度ベクトルの長さを使用して、着陸が成功したのか災害だったのかを伝えます。

明らかに他の衝突チェックを行うことができます/すべきです。一部のサーフェスエンティティはランディングポイントとして許可されないため、すべての衝突は致命的なものです。

入力を取得する方法と、宇宙船をレンダリングする方法は残しておきます。たとえば、エンジン係数を使用して、エンジンのステータスをフレームごとにレンダリングできます。


それはすばらしいですが、コードにそれを組み込む方法のいくつかのアイデアは素晴らしいでしょう。
ドヴォレ

1
私が物理学を習った場所shiffman.net/teaching/nature
Ming-Tang

この男は彼の物理学を知っています!
MGZero、2011

7

他の優れた答えは少し理論的なようですので、ここに単純なコードバージョンを示します。

// 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
シンプルに保つ。これは彼が探していたものに沿っていると思います。
Beska、2011

2

残念ながら、ここでの数学は毛深いです。FxIIIの答えは、落下物体の一般的なケースでは問題ありませんが、ロケットについて話しているのですが、ロケットは燃料を燃やします。

私はそれを行うコードを見てきましたが、それは完全に文書化されておらず、その背後にある数学を理解することができませんでした。CPUに制限がない限り、私は気にせず、力ずくでそれを強引に実行しません。FxIIIのアプローチは非常に短いタイムスケールで適用され、推力を調整します(または、燃料が燃え尽きるときにロケットのスロットルが戻ると、燃料の使用が維持されます。ロケットが燃料を燃焼させるときの各反復間の指定された推力ではなく、指定された加速。


燃料がなくなることは、落下パラメータを表すだけです。それは単に値が減少するベクトル力です。私が間違っている?単純なケースではFに対してGがあり、Fはロケットのエンジンで、Gは地球の重力です。この場合、両方に対してお互いを測定する必要があるため、燃料が残っていない場合、Fは0に落ちるので、オブジェクトにベクトル力としてGを適用する必要があります。F.としてのすべての値のための作品長いF> = Gオブジェクト「べき」Fの方向に移動するよう
daemonfire300

2
@ daemonfire300:あなたは誤解しています-私は燃料切れの影響ではなく、燃料の燃焼の影響について話しているのではありません。エンジンのスロットル設定を一定にすると、連続的に上昇する加速度の数値が生成され、一定の加速度を使用すると、燃料の燃焼率が連続的に低下します。これは、FxIIIが提供する単純な計算では、誤った燃料使用数が生成されることを意味します。
Loren Pechtel、2011

燃料が燃焼するときのA = F / Mからの加速ゲインの量は、車両に対する燃料の質量の比率が不合理に高いか、燃料の燃焼率が同様に高い場合を除いて、無視できる値になります。結局これはゲームです。
Patrick Hughes

@Patrick Hughes:真のロケット着陸機(火星のエアロブレーキとロケットのハイブリッドケースは数えません)が運ぶ燃料の量は、その総重量のかなりの部分を占めています。燃料:加速比を固定すると仮定すると、非常に間違った答えが生成されます。
Loren Pechtel、2011

1
これは質問に対する回答ではなく、@ FxIIIの回答に対するコメントです。
ジョナサンコネル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.