Предполагая, что единственное, что имеет значение, это направление heading
и targetHeading
, мы будем предполагать, что все векторы нормализованы. Вы также сказали, что хотели бы, чтобы это было правдой:
dheadingDegrees/dt = angle(targetHeading,heading) degrees/sec in the direction of targetHeading
(По крайней мере, так я это интерпретирую, в отличие от "приближается на 10% каждый кадр, но никогда не достигает места назначения")
Чтобы получить точный ответ, вам понадобится интеграция и немного математики. Если вы хотите смоделировать его и получить точный ответ, вы, вероятно, хотите отделить его от «кадров» и смоделировать его, возможно, с 100 интервалами в секунду, в зависимости от требуемой точности.
Таким образом:
every time interval dt:
target = getCurrentTarget()
rotationSpeed = angleBetween(target,currentHeading)/(1second)
heading = {rotate heading by dt*rotationSpeed radians towards target}
^-------- for how to do this, see below ----------------^
to rotate a vector v1 to v2 from time t=0 to t=1, with constant angular velocity:
v1normalized = normalized(v1)
v2perpNormalized = normalized(v2 - v2*v1normalized)
animated = cos(t*pi/2)*v1normalized + sin(t*pi/2)*v2perpNormalized