Анимация угла объекта к целевому углу

Я работаю над программированием игры. В этой игре есть объект, который нужно повернуть, чтобы столкнуться с другим объектом.

Код:

Вот что я сделал:

//targetAngle is defined to be the angle pointing towards the other object
//angle is the angle of this object
angle += 0.05 * (targetAngle - angle);

Проблема:

Это работает очень хорошо, но объект часто вращается очень непрямым путем. Например, если объект был направлен на 3 часа, а ему нужно было повернуться на 5 часов, объект может двигаться против часовой стрелки, а не по часовой стрелке, что более желательно.

Я хотел бы, чтобы объект вращался самым прямым образом. Есть идеи, как это сделать?

Спасибо за ваше время и вклад. Если вы проголосовали против, сообщите мне, почему, чтобы я мог улучшить этот вопрос.

Обратите внимание, что в этой программе я использую радианы.


person Progo    schedule 27.01.2015    source источник
comment
Вы уверены, что targetAngle всегда больше угла? Возможно, отрицательная разница вызывает проблему.   -  person Juned Ahsan    schedule 27.01.2015
comment
@JunedAhsan Нет, на самом деле я уверен, что иногда angle иногда больше, чем targetAngle. Я постараюсь устранить отрицательную разницу.   -  person Progo    schedule 27.01.2015


Ответы (1)


Я думаю, что одним из способов было бы что-то вроде...

dAngle = (targetAngle - angle) % two_pi; //Range of (-two_pi .. two_pi)
dAngle += (dAngle > pi? -two_pi : dAngle < -pi? two_pi : 0); //Range of [-pi .. pi]
angle += 0.05 * dAngle;

Кроме того, если вы хотите, чтобы он всегда был обращен к игроку, но не знаете правильного угла, посмотрите на... Повернуть текстуру в зависимости от положения игрока

person dwn    schedule 27.01.2015
comment
Спасибо! Я попробую. Кроме того, в настоящее время я использую эту формулу для нахождения угла: atan2(y1-y2, x1-x2) - person Progo; 27.01.2015
comment
Это прекрасный способ сделать это. Чтобы быть одержимым производительностью, хорошо избегать обратных триггерных функций и повторного применения триггерных функций, но нет ничего плохого в том, чтобы сначала получить угол, и это может дать вам больше возможностей для создания анимации. - person dwn; 27.01.2015
comment
Прежде всего, ваше решение работает как шарм! +1 и принять. Кроме того, что плохого в использовании обратных триггерных функций? - person Progo; 27.01.2015
comment
! Отлично :Д! Вероятно, в вашем случае все в порядке, так что не беспокойтесь об этом. У прямого использования векторов вместо inv trig funcs может быть 3 преимущества: (1) более прямолинейно, потому что вы получаете базис напрямую, без предварительного получения угла, обратного преобразования в sin(угол), cos(угол), а затем формируя ваша основа преобразования (2) Триггерные функции Inv работают медленно (3) Некоторые обратные триггерные функции вносят ошибку в значения с плавающей запятой, что иногда может иметь значение, если ваша программа имеет большой диапазон высокоточных значений и имеет жесткие допуски для сравнения чисел - person dwn; 27.01.2015
comment
На всякий случай, если вы хотите увидеть, java atan2 находится в строке 591 здесь http://developer.classpath.org/doc/java/lang/StrictMath-source.html - person Progo; 27.01.2015