3

特定のポイントに到達するために放物線状の弧(またはそれに近いもの)をたどる発射体の基本的なJavascript実装を作成しようとしています。私は複雑な数学に関しては特に精通しておらず、問題に関する資料を読むのに何日も費やしてきました。残念ながら、数学的な解決策を見ることは私にはかなり役に立たない。理想的には、頭を悩ませるための擬似コード(または既存のサンプルコード)を探しています。私が見つけたものはすべて、問題の部分的な解決策しか提供していないようです。

実際には、ある場所(弓の場所)から別の場所への矢の飛行をシミュレートすることを目指しています。各論理間隔で速度を更新することにより、発射体に対する重力の影響をすでにシミュレートしました。私が今理解しようとしているのは、可能な限り最短の時間で目標に到達するために、矢を発射するための正しい軌道/角度を正確に理解する方法です。

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

4

2 に答える 2

4

私は物理学者ではないので、私にできることは、本当に単純なプロセスに基づいたアプローチを教えることだけです。

  1. あなたの「矢印」は「x」と「y」の座標、そして「vx」と「vy」の速度を持っています。矢印の初期位置は、初期の「x」と「y」です。最初の「vx」は矢印の水平方向の速度であり、最初の「vy」は垂直方向の速度です(実際には速度ですが、これらは単なる言葉です)。これら2つの値は、概念的には、弓兵が矢を放つときに使用する角度によって異なります。
  2. 離散時間間隔での離散計算を使用して、時間の進行をシミュレートします。「滑らかな」軌道弧の方程式について心配する必要はありません。したがって、タイマーを実行し、100ミリ秒ごと(または任意の間隔)に更新された位置を計算します。
  3. 各時間間隔で、「vx」を「x」に追加し、「vy」を「y」に追加します。(したがって、「vx」と「vy」の最初の選択は、選択した時間間隔に拘束されることに注意してください。)また、重力の影響を反映するように「vx」と「vy」を更新します。それのように)風。「vx」が変わらない場合は、基本的に月に矢を放つことをシミュレートしています:-)しかし、「vy」は重力のために変わります。その変化は、各時間間隔で差し引かれる一定量でなければなりません。それを「デルタvy」と呼びます。必要な効果に基づいて正しい値を取得するには、物事をいじくり回す必要があります。(数学的には、「vy」は一次導関数の「y」コンポーネントのようなものであり、「
  4. 毎回「vy」に少量を追加するため、増分変更が追加され、矢印が画面上を移動するときに「重力の虹」を正しくシミュレートします。

今、あなたが解決する必要があるニュアンスは「vy」のサインです。「vy」の最初の符号は、「deltavy」の反対である必要があります。どちらが正でどちらが負であるかは、座標グリッドが画面にどのように関連しているかによって異なります。

編集—質問に実際に密接に関係するものについては、@Alnitakの回答を参照してください。

于 2011-03-10T16:07:50.113 に答える
4

Pointyの答えは、初期軌道(軌道は方向速度、またはベクトルの組み合わせと見なされる)が与えられた場合のオブジェクトの動きをシミュレートする方法の良い要約です。

しかし、あなたは質問で(私があなたを正しく読んだ場合)、原点と目的のターゲット点だけを知っている最初の軌道を決定したいと言いました。OP

悪いニュースは、実際には、特定Pの場所からそこに到達する放物線軌道が無限にあることですO。角度と速度は相互に依存しています。

Oが原点(つまり[0、0])になるようにすべてを変換すると、次のようになります。

T_x = P_x - O_x            // the X distance to travel
T_y = P_y - O_y            // the Y distance to travel

s_x = speed * cos(angle)   // the X speed
s_y = speed * sin(angle)   // the Y speed

次に、(x, y)任意の時点での位置(t)は次のとおりです。

x = s_x * t
y = s_y * t - 0.5 * g * (t ^ 2)

だからインパクトであなたは持っています

T_x = s_x * t
T_y = -0.5 * g * (t ^ 2) + s_y * t

しかし、3つの未知数(、、tおよびs_xs_yと2つの連立方程式があります。それらの1つを修正すると、方程式を解くのに十分なはずです。

FWIW、修正s_xまたはは、またはのいずれかs_yを修正することと同等です。そのビットは単純な三角法です。speedangle

もちろん、いくつかの組み合わせは不可能です。速度が低すぎる場合や角度が高すぎる場合、発射体はターゲットに到達する前に地面に衝突します。

注意:これは、位置が継続的に評価されることを前提としています。Pointyの回答と、モーションをシミュレートする方法についての独自の説明によれば、時間が離散的な増分で経過したときに何が起こるかとは完全には一致しません。ただし、位置を十分に頻繁に(つまり、1秒間に数十回)再計算する場合は、十分に正確である必要があります。

于 2011-03-10T16:16:18.520 に答える