Это проблема, с которой я столкнулся, пытаясь реализовать игру с использованием движка LÖVE , который покрывает box2d с помощью сценариев Lua.
Цель проста: объект, похожий на башню (если смотреть сверху, в 2D-среде) должен ориентироваться так, чтобы указывать на цель.
Башня находится на координатах x, y, а цель на tx, ty. Мы можем считать, что x, y фиксированы, но tx, ty имеют тенденцию изменяться от одного момента к другому (то есть они будут курсором мыши).
Башенка имеет ротор, который может прикладывать вращающую силу (крутящий момент) в любой момент, по часовой стрелке или против часовой стрелки. Величина этой силы имеет верхний предел, называемый maxTorque.
Башенка также имеет определенную инерцию вращения, которая действует на угловое движение так же, как масса действует на линейное движение. Никакого трения нет, поэтому турель будет вращаться, если у нее угловая скорость.
Башенка имеет небольшую функцию AI, которая повторно оценивает свою ориентацию, чтобы убедиться, что она указывает в правильном направлении, и активирует вращатель. Это происходит каждый дт (~ 60 раз в секунду). Прямо сейчас это выглядит так:
function Turret:update(dt)
local x,y = self:getPositon()
local tx,ty = self:getTarget()
local maxTorque = self:getMaxTorque() -- max force of the turret rotor
local inertia = self:getInertia() -- the rotational inertia
local w = self:getAngularVelocity() -- current angular velocity of the turret
local angle = self:getAngle() -- the angle the turret is facing currently
-- the angle of the like that links the turret center with the target
local targetAngle = math.atan2(oy-y,ox-x)
local differenceAngle = _normalizeAngle(targetAngle - angle)
if(differenceAngle <= math.pi) then -- counter-clockwise is the shortest path
self:applyTorque(maxTorque)
else -- clockwise is the shortest path
self:applyTorque(-maxTorque)
end
end
... не получается. Позвольте мне объяснить две иллюстративные ситуации:
- Башня "колеблется" вокруг целевого угла.
- Если цель находится «прямо за турелью, чуть по часовой стрелке», турель начнет применять крутящие моменты по часовой стрелке и продолжит применять их до момента, когда она превзойдет угол цели. В этот момент он начнет прикладывать моменты в противоположном направлении. Но он получит значительную угловую скорость, поэтому будет продолжать двигаться по часовой стрелке в течение некоторого времени ... пока цель не будет "чуть позади, но немного против часовой стрелки". И это начнется снова. Таким образом, турель будет колебаться или даже вращаться по кругу.
Я думаю, что моя турель должна начать прикладывать крутящие моменты в «противоположном направлении кратчайшего пути», прежде чем она достигнет заданного угла (как при торможении автомобиля перед остановкой).
Интуитивно, я думаю, что турель должна «начать прикладывать моменты в противоположном направлении кратчайшего пути, когда он находится примерно на полпути к целевой цели». Моя интуиция подсказывает мне, что это как-то связано с угловой скоростью. И еще есть тот факт, что цель является мобильной - я не знаю, следует ли мне это как-то учитывать или просто игнорировать.
Как рассчитать, когда турель должна «начать торможение»?