我正在用太空中的船只实现 2D 游戏。
为了做到这一点,我使用了 LÖVE,它用 Lua 包装了 Box2D。但我相信任何比我更了解物理的人都可以回答我的问题——因此伪代码被接受为响应。
我的问题是我不知道如何在启用了 2D 物理的世界上正确移动我的宇宙飞船。更具体地说:
有质量的船m
位于初始位置{x, y}
。它的初始速度向量为{vx, vy}
(can be {0,0}
)。
目标是 中的一个点{xo,yo}
。{vxo, vyo}
船必须按照最短的轨迹到达目标,其速度为(或接近目标)。
有一个update(dt)
被称为频繁调用的函数(即每秒30 次)。在此功能上,船可以通过对自身施加“脉冲”来修改其位置和轨迹。脉冲的大小是二元的:你可以在给定的方向上应用它,或者根本不应用它)。在代码中,它看起来像这样:
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
第一个???
是表明在某些情况下(我猜)最好“不要冲动”并让船“漂流”。第二???
部分包括如何计算给定 dt 上的脉冲角。
我们在太空中,所以我们可以忽略空气摩擦之类的东西。
虽然它会非常好,但我并不是在找人为我编写代码;我将代码放在那里,以便清楚地理解我的问题。
我需要的是一种策略——一种攻击它的方法。我知道一些基本的物理学,但我不是专家。例如,这个问题有名字吗?之类的东西。
非常感谢。
编辑:Beta 为此提供了一个有效的策略,Judge 在评论中直接在 LÖVE 中实施了它。
EDIT2:经过更多谷歌搜索后,我还找到了 openSteer。它在 C++ 上,但它做了我假装的事情。这可能对任何遇到这个问题的人都有帮助。