1

答えが見つからないように見える数学の助けが少し必要でした。ドキュメントへのリンクは大歓迎です。

これが私の状況です。この迷路のどこにいるのかわかりませんが、動き回って最初に戻る方法を見つける必要があります。0,0 で開始からオフセットされた場所のウェイポイント リストを実装することを考えていました。これは 2D デカルト平面です。

2 つのプロパティが与えられています。移動速度は 0 から 1 まで、回転速度は -1 から 1 です。-1 は非常に左で、+1 は非常に右です。これらは速度であり、角度ではないため、そこに問題があります。移動速度として 0 と 0.2 を指定すると、低速で右に曲がり続けます。

これら 2 つの変数からオフセットを計算するにはどうすればよいですか? 「一歩」を踏み出すたびに収納できます。

移動速度と回転速度を考慮して、x 項と y 項のオフセットを計算するだけです。そして、それらのポイントに到達するための回転。

どんな助けでも大歓迎です。

4

2 に答える 2

4

あなたの質問はいくつかの点で不明確なので、いくつかの仮定を立てる必要があります:

  1. 各時間間隔中、並進速度と回転速度は一定です。
  2. すべての時間間隔でこれらの変数の値を知っています (そして、「非常に左」だけでなく、ラジアン/秒などの使用可能な単位で回転速度を知っています)。
  3. あなたは最初の見出しを知っています。
  4. 丸め誤差が問題にならない十分な精度を維持できます。

それを考えると、正確な解決策があります。最初の簡単な部分:

delta_angle = omega * delta_t

ここで、ω は角速度です。移動した距離 (おそらくカーブに沿って) は

dist = speed * delta_t

曲線の半径は

radius = dist / delta_angle

(角速度がゼロに近い場合、これは非常に大きくなります。これについてはすぐに説明します。) angle (間隔の開始時) がゼロで、+x 方向を指していると定義されている場合、間隔は簡単です。これを deta_x_0 および delta_y_0 と呼びます。

delta_x_0 = radius * sin(delta_angle)
delta_y_0 = radius * (1 - cos(delta_angle))

非常に小さい delta_angle と非常に大きな半径を処理できるようにしたいので、sin と cos を展開し、角速度がゼロに近い場合にのみこれを使用します。

dx0 = r * sin(da)     = (dist/da) * [ da - da^3/3! + da^5/5! - ...]
                     =  dist     * [  1 - da^2/3! + da^4/5! - ...]

dy0 = r * (1-cos(da)) = (dist/da) * [ da^2/2! - da^4/4! + da^6/6! - ...]
                     =  dist     * [   da/2! - da^3/4! + da^5/6! - ...]

しかし、角度は通常ゼロに等しくないため、これらの変位を回転させる必要があります

dx = cos(angle) * dx0 - sin(angle) * dy0
dy = sin(angle) * dx0 - cos(angle) * dy0
于 2010-05-09T03:11:02.543 に答える
1

2段階でできます。最初に方向の変更を計算して新しい方向ベクトルを取得し、次にこの新しい方向を使用して新しい位置を計算します。何かのようなもの

angle = angle + omega * delta_t;

const double d_x = cos( angle );
const double d_y = sin( angle );

x = x + d_x * delta_t * v;
y = y + d_y * delta_t * v;

angle各ステップで現在の出力を保存する場所。( d_x, d_y) は現在の方向ベクトルでomegaあり、回転速度です。delta_tは明らかにあなたのタイムステップでvあり、あなたの速度です。

これは、単純すぎて 2 つの異なる段階に分割できない場合があります。よく考えすぎてテストしていないかどうかはわかりませんが、機能する場合はお知らせください。

于 2010-05-08T09:04:54.437 に答える