Я реализую 2D-игру с кораблями в космосе.
Чтобы сделать это, я использую LÖVE, который обертывает Box2D с помощью Lua. Но я считаю, что на мой вопрос может ответить любой, кто лучше понимает физику, чем я, - поэтому псевдокод принимается как ответ.
Моя проблема в том, что я не знаю, как правильно поместить мои космические корабли в мир с физикой, поддерживающей физику. Более конкретно:
Корабль массы m
находится в исходном положении {x, y}
. Он имеет начальный вектор скорости {vx, vy}
(может быть {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.
Мы находимся в пространстве, поэтому мы можем игнорировать такие вещи, как трение воздуха.
Хотя было бы очень приятно, я не ищу, чтобы кто-то закодировал это для меня; Я поставил там код, поэтому моя проблема понятна.
Мне нужна стратегия - способ атаковать это. Я знаю некоторые основные физики, но я не эксперт. Например, имеет ли эта проблема имя? Такого рода вещи.
Большое спасибо.
EDIT: Beta предоставила правильную стратегию для этого, и судья любезно внедрил его непосредственно в LÖVE в комментариях.
EDIT2: после большего количества поисковых запросов я также нашел openSteer. Это на С++, но он делает то, что я притворился. Вероятно, это будет полезно любому, кто достигнет этого вопроса.