宇宙に船がある 2D ゲームを実装しています。
そのために、Box2D を Lua でラップする LÖVE を使用しています。しかし、私の質問は、私よりも物理学をよく理解している人なら誰でも答えることができると信じています。そのため、疑似コードが回答として受け入れられます。
私の問題は、2D 物理学が有効な世界で宇宙船を適切に動かす方法がわからないことです。より具体的には:
大量の船がm
初期位置にあり{x, y}
ます。の初期速度ベクトルを持ちます{vx, vy}
( にすることができます{0,0}
)。
目標は のポイントです{xo,yo}
。{vxo, vyo}
船は、最短の軌道をたどって、の速度 (またはそれに近い速度) を持つ目標に到達する必要があります。
頻繁に呼び出される関数がありますupdate(dt)
(つまり、1 秒あたり 30 回)。この機能では、船はそれ自体に「インパルス」を適用することで、その位置と軌道を変更できます。インパルスの大きさは 2 進数です。特定の方向に適用することも、まったく適用しないこともできます)。コードでは、次のようになります。
function Ship:update(dt)
m = self:getMass()
x,y = self:getPosition()
vx,vy = self:getLinearVelocity()
xo,yo = self:getTargetPosition()
vxo,vyo = self:getTargetVelocity()
thrust = self:getThrust()
if(???)
angle = ???
self:applyImpulse(math.sin(angle)*thrust, math.cos(angle)*thrust))
end
end
1つ目???
は、場合によっては(おそらく)「衝動に駆られず」、船を「漂流」させた方がよいことを示すためのものです。2 番目???
の部分は、与えられた dt で衝撃角を計算する方法で構成されます。
私たちは宇宙にいるので、空気摩擦などは無視できます。
とてもいいことですが、これをコーディングしてくれる人を探しているわけではありません。私の問題が明確に理解できるように、コードをそこに置きました。
私が必要としているのは戦略、つまりこれを攻撃する方法です。私は基本的な物理学をいくつか知っていますが、専門家ではありません。たとえば、この問題には名前がありますか? そのようなこと。
どうもありがとう。
編集: ベータ版はこれに対する有効な戦略を提供し、Judge は親切にもそれを LÖVE のコメントで直接実装しました。
EDIT2:さらにグーグルで調べた後、 openSteerも見つかりました。それは C++ 上にありますが、私がふりをしたことを行います。この質問にたどり着く人にはおそらく役立つでしょう。