ゴルフボールの軌道方程式に空気抵抗を追加する


10

VB.NET 2005で2Dゴルフゲームを開発していますが、ボールに影響を与えるはずの空気または風の抗力を実装する方法に行き詰まっています。

すでに私は発射物のためのこれらの方程式を持っています:

  • v0は、ヒットまたは発射されたときのゴルフボールの初速度
  • 垂直成分と水平成分、ゴルフボールの速度:

    vx=v0cos(θ)vy=v0sin(θ)gt
  • ゴルフボールの垂直および水平距離:

    x=v0cos(θ)ty=v0sin(θ)t(0.5)gt2

ゴルフボールの速度に適切に影響を与えるために、この式に空気抵抗をどのように追加しますか?私はそれを行う方法がわからない、誰かが同様の方程式で働いたことがありますか?

回答:


10

ドラッグや風のための閉じたフォームが存在するかどうかはわかりませんが、(すべての物理ライブラリが行うように)段階的にシミュレーションするのは非常に簡単です。

  1. 初期条件を設定します。

    x,y,vx,vy(for t=0)
  2. 位置を更新:

    x=x+(vx×dt)y=x+(vy×dt)

    (dtは最後の更新からの経過時間、別名デルタ時間)

  3. これらの速度ヘルパーを計算します。

    v2=(vx)2+(vy)2|v|=v2

    vの長さを表す)|v|v

  4. 抗力を計算します。

    fdrag=c×v2

    (ここで、cは小さな摩擦係数です!

  5. 力を蓄積する:

    fx=(fdrag×vx|v|)fy=(fdrag×vy|v|)+(g×mass)

    mass

  6. 更新速度:

    vx=vx+fx×dtmassvy=vy+fy×dtmass

それは基本的にそれらの物理学を近似するためのオイラーの方法です。


コメントで要求されたシミュレーションの方法についてもう少し:

  • (t=0)

x=0y=0vx=v0×cos(θ)vy=v0×sin(θ)

これは基本的に、tのすべての出現が0に置き換えられる基本的な軌道式と同じです。

  • KE=0.5m(V2)tv2

  • PE=m×g×y

  • (x,y)t1t=0t=t1

  • (x,y)t1t2t1<t2t1t2

疑似コード:

simulate(v0, theta, t1)
  dt = 0.1
  x = 0
  y = 0
  vx = v0 * cos(theta)
  vy = v0 * sin(theta)
  for (t = 0; t < t1; t += dt)
    x += vx * dt
    y += vy * dt
    v_squared = vx * vx + vy * vy
    v_length = sqrt(v_squared)
    f_drag = c * v_squared
    f_grav = g * mass
    f_x = (-f_drag * vx / v_length)
    f_y = (-f_drag * vy / v_length) + (-f_grav)
    v_x += f_x * dt / mass
    v_y += f_y * dt / mass
  end for
  return x, y
end simulate

どうもありがとうございました。お返事を差し上げます。
スミス

あなたが提供したこれらの方程式から、与えられた時間(t)の現在のXとYを取得したいのですが、VoをV_xに、Voをv_yに置き換えますか?また、ボールが発射された最初のKEを追加する必要がある場合、これKE=0.5*m*(V*V)は有効ですか?
スミス

@スミス私はあなたの質問を説明するために私の答えを編集します
ジョナス・ボーテル

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