横スクロール用の基本的なAIを作成しています。ジャンプを実行するだけで、AIユニットがポイントAからポイントBに到達できるかどうかを知る必要があります。
私の文字の飛行軌道はとても古典とは異なり、彼らは(例えばジャズJackrabbitの2のように)空中に力を加えることができるように、ビットunusalで発射の弾道についてです...
投射または発射された発射体が推進力なしに進む経路(...)
...私の問題は、推進力を備えた発射体(ロケットなど)に関するものだと思います。
これを説明するために、ジャンプして「左ボタン」を押し続けると、これは私のキャラクターの飛行曲線のようになります(左端では異なります。空中でマニューバを作成していた場所です)。
飛行中に加えられる力は常にX軸に平行であるため、「左」を押し続けるとF =(-f、0)、「右」を押し続けるとF =(f、0)になります。
彼はスキージャンパーのように非常に動くことができます:
したがって、それは単に放物線である古典的な軌道とは大きく異なります(出典:ウィキペディア)。
さらに難しくするために、単純な空気抵抗をシミュレートしているので、キャラクターはある最大速度値までしか加速できません。
これは、反対の移動方向に小さな力を加えることによって行われます。
b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize(); //normalizes vector and returns length
body->ApplyForce( AIR_RESISTANCE_MULT * speed * speed * -vel, body->GetWorldCenter() );
AIR_RESISTANCE_MULTは定数で、私の場合は0.1です。
私の性格は無限に小さいと仮定しましょう。
そして、私は障害物を考慮に入れていないので、私の質問は次のようになります...
初期速度V、ジャンプ時にキャラクターに適用する衝撃J =(0、-j)、重力G =(0、g)、力F =(+ -f)を指定して(少なくとも確実に推測する)を決定する方法、0)飛行中に継続的に適用され、空気抵抗を考慮することにした場合はAIR_RESISTANCE_MULT (これはオプションです) 、ポイントが、キャラクターがたどるパスによって描かれた曲線の下にあるかどうか
文字通り、どこから計算を始めればよいのかまったくわかりません。実際、必ずしも正確な答えに興味があるわけではありません。AIが完全に動作する必要はないので、うまく機能するハック/近似は素晴らしいでしょう。
編集: Jasonが示唆するように、シミュレーションを使用してこれを解決することにしましたが、そのような場合の対処方法は?
CからDへのセグメントを描画し、目的のポイントがこのセグメントの下にあるかどうかを確認する必要がありますか?
または、CとDの間のタイムステップをバイナリ検索して、目的のポイントに対して水平距離が十分に近いポイントを探し、その後、垂直方向の差を確認する必要がありますか?(私には少しやり過ぎに思えます)