Ротация юнитов в игре - PullRequest
       13

Ротация юнитов в игре

0 голосов
/ 12 февраля 2010

У меня есть юнит в игре, который указывает в определенном направлении; когда он поворачивает в другом направлении, он должен сделать самый короткий поворот. Схема начинается под определенным углом и требует заданного угла для линейного интерполяции в направлении.

Например, при наклоне от 10 до 350 градусов целевой угол должен быть равен -10. В обратном направлении от 350 до 10 следует рассчитать конечный конец 370 градусов.

Какой алгоритм может рассчитать эти требуемые конечные значения?

РЕДАКТИРОВАТЬ :: Кажется, есть некоторая путаница в том, что мне нужно

Я использую линейную интерполяцию для вычисления углов во времени. Итак, если я хочу получить от 10 до 20, тогда конечное значение должно быть 20, тогда я интерполирую от 10 до 20 и поверну направо. Однако, аналогично, если я хочу перейти от 20 до 10, тогда интерполяция от 20 до 10 будет идти против часовой стрелки, это тоже хорошо. Проблема в том, что когда поворот превышает 180 в направлении по часовой стрелке, чтобы перейти от 270 до 80 (210 градусов), нужно повернуть по часовой стрелке, прямая интерполяция от 270 до 80 будет идти против часовой стрелки, мне нужно интерполировать от 270 до 420 (360 +80), который пойдет против часовой стрелки.

Ответы [ 4 ]

4 голосов
/ 12 февраля 2010

Вам нужно

dist = (end - start + 360) % 360;
if (dist > 180)
   dist = dist - 360;

, что дает вам что-то в диапазоне -180 ... 180. Если это то, что вы хотите.

1 голос
/ 12 февраля 2010

Мартин, я думаю, я понимаю, чего ты хочешь. По сути, вам просто нужно добавить 360 к вашей конечной позиции, пока она не станет больше вашей начальной позиции. Затем вычтите 360 из этого. Это два абсолютных угла, которые могут быть вашим решением. Тогда твой ответ просто в зависимости от того, что ближе всего.

Псевдокод / ​​реальный код:

int current = 350; // where you are now
int desired = 10; // where you want to go

while( desired < current)
  desired += 360;
int end = desired;
int start = desired - 360;

int delta1 = abs( end - current);
int delta2 = abs( start - current);
int answer = delta1 < delta2 ? end : current;
1 голос
/ 12 февраля 2010

Если вы хотите, чтобы что-то более сфокусированное на «конечном угле», как об этом:

float startAngle = something, endAngle = something;

endAngle = ((endAngle - startAngle) % 360) + startAngle;
if(endAngle < startAngle - 180) endAngle += 360;
if(endAngle > startAngle + 180) endAngle -= 360;

Это приближает endAngle как можно ближе к startAngle с шагом 360.

0 голосов
/ 12 февраля 2010

Если вы поворачиваетесь к определенной точке и просто хотите знать, поворачиваться ли по часовой стрелке или против часовой стрелки в течение этого кадра, обычный способ сделать это - рассмотреть направление игрока как вектор и взять перекрестное произведение между ним и вектором, охватывающим игрока до точки. Если оно положительное, поверните против часовой стрелки; если оно отрицательное, поверните по часовой стрелке.

...