0

飛行機がプレーヤーである単純なサイドスクローラーを構築しようとしています。そのため、シンプルでありながらリアルな物理学を備えたシンプルな飛行制御を構築したいと考えています。cocos2D と Box2D を利用しています。基本的なシステムは動作していますが、物理が正しく感じられません。

b2CircleShapeユーザーの入力に基づいて、平面 ( ) に力を加えています。したがって、基本的に、ユーザーがプッシュアップすると、body_->ApplyForce(b2Vec2(10,30), body_->GetPosition())が呼び出されます。同様に、ダウンには -30 が使用されます。

これは機能し、飛行機は上下に沿って飛行し、急降下または上昇します。しかし、それは気分が悪いだけです。上り坂で減速することはなく、急降下中にスピードアップすることもありません。私の単純な解決策は単純ではありません。

飛行機のクライミング/ダイビングの感覚をつかむにはどうすればよいですか?

4

2 に答える 2

1

最終的に、飛行中に適用される基本的な力、つまり推力、抗力、揚力、重力を単純化しました。

次の単純化を行いました。

  1. 抗力と推力は 2 つの力である必要はありません。代わりに、推力の大きさは現在の速度によって調整されます (airResistance に関する Andrew の提案と同様)。
  2. 重力は、box2d の World オブジェクトによって処理されます。
  3. 揚力は同じですが、重力の反対です (飛行機が水平に飛行している場合)。
  4. 推力と揚力は、平面の角度に基づいて設定されます。つまり、ボディの変換 R 列に基づいています。

現在、ユーザーは平面の角度を制御するだけで、推力と揚力が調整され、ワー​​ルド シミュレーションが更新されます。

これにより、良い感じのシミュレーションが得られましたが、大幅に単純化されました。

于 2012-07-01T14:25:23.960 に答える
-1

私はそれで行きます:

float engineForce(/* possibly some params */)
{
    return SOME_CONSTANT;
}

float airResistance(float velocity /* possibly more params */)
{
    return CFT * velocity;
}

float resultForce = std::max(engineForce() - airResistance(), 0);

このようなアプローチを使用すると、2 つの機能を使用してシステムを簡単に調整できます。

于 2012-06-19T10:10:17.647 に答える