私は現在、Farseer Physics ライブラリを使用して XNA でいくつかの物理玩具を試していますが、私の質問は XNA や Farseer に固有のものではなく、任意の 2D 物理ライブラリに固有のものです。
「ロケット」のような動きを追加したいと思います(ロケットである必要はないという意味でロケットのようなと言います-それは飛行機や水上のボート、または同様の状況の任意の数である可能性があります) 2D シーンの特定のオブジェクト。キネマティック シミュレーションを使用してこれを実装する方法は知っていますが、動的シミュレーションを使用して実装したいと考えています (つまり、時間の経過とともに力を適用します)。これを実装する方法については、ちょっと迷っています。
簡単にするために、ジオメトリを回転させるためのダイナミクスは必要ありません。体の速度に影響を与えるだけです。Farseer で回転しないように設定された円ジオメトリを使用しているため、オブジェクトの速度のみに関心があります。
最良の抽象化がどうあるべきかさえわかりません。概念的には、体が現在動いている方向 (単位ベクトル)、進みたい方向、速度を比較的一定に保ちながら方向を変える速さを表す値があります (小さな変動は許容されます)。
この抽象化を直接使用することも、オブジェクトが方向を変える速度 (時計回りまたは反時計回り) を制御する「ラダー」値のようなものを使用することもできます。
探している動きをシミュレートするには、どのような力を体に適用する必要がありますか? ロケットの「推力」をその場で調整できるようにしたいことも覚えておいてください。
編集:私が間違っている場合は修正してください。あなたには2つの力があります(今のところ主な推進力は無視しています):
1)常に体と同じ方向を向いている静的な「ひれ」があります。フィンが移動方向と一致しないようにボディが回転すると、移動方向とフィンの間の角度に比例して、フィンの長さに沿って空気抵抗が適用されます。
2) 指定された範囲内で自由に回転できる「ラダー」があり、ボディの重心 (この場合は円) から少し離れた位置に取り付けられています。繰り返しますが、この平面が移動方向と平行でない場合、空気抵抗により、舵の長さに沿って比例した力が生じます。
私の質問は、別の言い方をすれば、フィンとラダーに対する空気抵抗からこれらの比例力をどのように計算するのですか?
編集:参考までに、受け入れられた回答をテストするために私が書いたコードを次に示します。
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
float dc = 0.001f;
float lc = 0.025f;
float angle = MathHelper.ToRadians(45);
Vector2 vel = new Vector2(1, 0);
Vector2 pos = new Vector2(0, 0);
for (int i = 0; i < 200; i++)
{
Vector2 drag = vel * angle * dc;
Vector2 sideForce = angle * lc * vel;
//sideForce = new Vector2(sideForce.Y, -sideForce.X); // rotate 90 degrees CW
sideForce = new Vector2(-sideForce.Y, sideForce.X); // rotate 90 degrees CCW
vel = vel + (-drag) + sideForce;
pos = pos + vel;
if(i % 10 == 0)
System.Console.WriteLine("{0}\t{1}\t{2}", pos.X, pos.Y, vel.Length());
}
}
このプログラムの出力をグラフにすると、滑らかな円形の曲線が表示されます。これはまさに私が探していたものです!