2点間の線上の点を取得する


9

私はJavaScriptで単純な宇宙ゲームを作成していますが、今はベクトルに関して壁にぶつかっています。

ゲームビューは、2Dグリッドでトップダウンです。ユーザーがグリッドをクリックすると、宇宙船がその場所に飛びます。

したがって、2つのポイントセットがある場合:

{ x : 100.2, y : 100.6 }; // the ship
{ x : 20.5,  y : 55.95 }; // the clicked coordinates

ゲームループが1秒あたり60回の反復でティックし、望ましい船の速度が1ティックあたり0.05ポイント(1秒あたり3ポイント)である場合、ゲームループの各ティックごとに船の新しい座標セットを計算するにはどうすればよいですか?

ps慣性や船に影響を与える複数のベクトルを考慮したくないので、船は何をしている(つまり、一方向に飛んでいる)のを止めて、クリックした座標に静的な速度で移動したいだけです。

回答:


8

疑似コード:

speed_per_tick = 0.05
delta_x = x_goal - x_current
delta_y = y_goal - y_current
goal_dist = sqrt( (delta_x * delta_x) + (delta_y * delta_y) )
if (dist > speed_per_tick)
{
    ratio = speed_per_tick / goal_dist
    x_move = ratio * delta_x  
    y_move = ratio * delta_y
    new_x_pos = x_move + x_current  
    new_y_pos = y_move + y_current
}
else
{
    new_x_pos = x_goal 
    new_y_pos = y_goal
}

@トリスタン:あなたgoal_distはあなたのif状態を意味しますか?
Nate W.

21

LERP-線形補間

私は数日前に同様の問題に対してこの答えを出しましたが、ここに行きます:

線形補間は、進行状況に基づいて、2つの数値の間の数値を提供する関数です。実際には、2つのポイントの間にポイントを取得できます。


グレートフォーミュラ-計算方法

一般的なLERP式はで与えられpu = p0 + (p1 - p0) * uます。どこ:

  • pu:結果番号
  • p0:初期番号
  • p1:最終番号
  • u:進捗状況。パーセンテージで、0と1の間で指定されます。

パーセンテージを取得する方法

「このパーセンテージを取得するにはどうすればよいですか?」心配しないで。それはこのようなものです:開始ベクトルが終了するまでにポイントが移動するのに何時間かかりますか?了解しました。すでに経過した時間で割ります。これでパーセンテージがわかります。

見て、次のようなもの: percentage = currentTime / finalTime;


ベクトルの計算

結果のベクトルを取得するために必要なことは、式を2回適用することです。1つはXコンポーネント用、もう1つはYコンポーネント用です。このようなもの:

point.x = start.x + (final.x - start.x) * progress;
point.y = start.y + (final.y - start.y) * progress;

変量時間の計算

ポイントが0.5ポイントの速度で移動するようにしたい場合があります。つまり、より長い距離がより長い時間で移動するとします。

あなたは次のようにそれを行うことができます:

  • 距離の長さを取得するそのためには、2つのものが必要です。距離ベクトルを取得し、それを長さの値に変換します。

    distancevec = final - start;
    distance = distancevec.length();

私はあなたがベクトル数学を知っていることを望みます。そうでない場合は、この式で長さを計算できますd = sqrt(pow(v.x, 2) + pow(v.y, 2));

  • 所要時間を取得し、最終時間を更新します。これは簡単です。ティックごとに0.5の長さを取得したいので、分割して取得したティック数を取得する必要があります。

    finalTime = distance / 0.5f;

できました。

注意:たぶん、これはあなたにとって意図された速度ではないかもしれませんが、これは正しいです。したがって、斜めの動きでも直線的な動きになります。x + = 0.5f、y + = 0.5fを実行したい場合は、ベクトル数学の本を読んで、計画を再確認してください。


自分の位置から目的地まで%残したい場合はどうなりますか?デルタ時間を使用できず、x:y座標を使用する場合。
Dave

progressこの回答で述べられているように計算した場合、それは0..1範囲内である必要があります。ただ、実行しますprogressLeft = 1.0 - progress;
グスタボ・マシエル

3

これは、方向の法線を計算し、パラメトリック方程式を使用して現在の位置を計算することで実行できます。

newPoint = startPoint + directionVector * velocity * t

ここで、tは、船が目的の方向に移動を開始してからの経過時間です。更新ごとにこれを実行することもできます

newPoint = currentPoint + directionVector * velocity * timeDelta

そして、あなたはこれをあらゆるフレーム/物理/その他で計算するだけです。船が目的地に到着するまで更新します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.