Добавлен , опубликован

О статье

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

Что влияет на поворот юнита

В РО (Редакторе объектов) юнита есть 3 нужных нам поля которые в той или иной степени оказывают влияние на поворот юнита, а именно:
  1. Движение - Скорость поворота (turnRate): скорость поворота юнита;
  2. Графика - Сдвиг окна (propWin): минимально допустимый угол между поворотом юнита и его целью для начала движения;
  3. Графика - Положение вставки (orientInterp): режим интерполяции поворота юнита.
Для начала хочу сказать что у юнитов есть Действительный и Визуальный углы поворота.
  • Действительный это тот угол поворота который рассчитывается для внутриигровых механик, например когда надо начинать движение юнита или когда можно атаковать/кастовать спел. На него влияют turnRate и propWin;
  • Визуальный это тот угол поворота который мы видим на экране. На него влияют turnRate и orientInterp.
Часто эти повороты не совпадают. Повороты вообще не простая штука, например когда юнит поворачивается, он делает это не с постоянной скоростью - он может плавно набирать скорость в начале, и плавно понижать ее под конец.
Для управления углом поворота у нас есть следующие нативки:
native SetUnitFacingTimed takes unit whichUnit, real facingAngle, real duration returns nothing // градусы, секунды
native SetUnitFacing takes unit whichUnit, real facingAngle returns nothing // градусы
native GetUnitFacing takes unit whichUnit returns real // градусы
SetUnitFacingTimed устанавливает действительный и визуальный угол поворота юнита за определенное время (т.е. от текущего угла поворота к указанному, скорость поворота юнита в РО на это никак не влияет). Хочу обратить внимание что действительный угол поворота таки может установиться мгновенно, тогда как скорость визуального угла поворота ограничена движком. Еще есть прикол что временное изменение можно отменить любим приказом который прерывает очередь (типо Stop/Hold).
ЭЭЭЭЭЭксперементы
Пробовал юниту перед тем как отдать приказ двигаться в точку (которая расположена прям за ним, 180 градусов кароч) триггерно установить угол поворота как раз по направлению в ту самую точку (с 0 длительностью). По итогу юнит начинал движение сразу же после отдачи приказа, хотя визуально только начал поворачиваться.
SetUnitFacing то же самое что и SetUnitFacingTimed с длительностью 0.
GetUnitFacing возвращает визуальный угол поворота.
Далее подробней.

Скорость поворота

turnRate, он же Скорость поворота - Характеризует скорость поворота юнита. Влияет как на действительную, так и визуальную скорость поворота.
Часто используются значения 0.4, 0.5, 0.6
Измеряется в радианах за 0.03 сек (kekw). Напомню что поворот на 180 градусов равен повороту на 3.14 (пи) радиан, т.е. узнать время, нужное для поворота на 180 градусов, можно по формуле:
time = 0.03*pi/turnRate
Отсюда выходит что можно узнать нужную нам скорость поворота, зная время необходимое для поворота на 180 градусов:
turnRate = 0.03*pi/time
Понятно что чем больше будет turnRate тем быстрее юнит будет поворачиваться, однако чем больше значение скорости, тем меньше оно будет ускорять юнита. После значения 1.0 ускорение почти не заметно.
При попытке установить скорость поворота на 0, значение выставится на 0.001 - юнит будет делать полоборота за 94.25 сек.
Демонстрация, белым текстом указана скорость поворота, зеленым указано время потраченное на поворот 180 градусов.
Время примерное, чем больше скорость тем меньше точность.
Для управления скоростью поворота у нас есть следующие нативки:
native SetUnitTurnSpeed takes unit whichUnit, real newTurnSpeed returns nothing // радианы за 0.03 сек
native GetUnitTurnSpeed takes unit whichUnit returns real // радианы за 0.03 сек
native GetUnitDefaultTurnSpeed takes unit whichUnit returns real // радианы за 0.03 сек
SetUnitTurnSpeed устанавливает текущую скорость поворота юнита.
GetUnitTurnSpeed возвращает текущую скорость поворота юнита.
GetUnitDefaultTurnSpeed возвращает дефолтную скорость поворота юнита из РО.

Сдвиг окна

propWin, он же Сдвиг окна - Бомбезный перевод словосочетания "Propulsion Window". Характеризует минимально допустимый угол между поворотом юнита (действительным, а не визуальным) и его целью для начала движения.
(!) Это влияет только на движение юнита, а не на его атаку или применение заклинаний (как это часто описывают). Минимальный угол когда юнит может начать атаковать/кастовать равен 11.5 градусов (от действительного угла, поэтому нам кажется что Лич может кастовать жопой, ведь визуально он еще не повернулся, хотя в действительности уже повернулся) и захардкожен, его никак не изменить.
Часто используются значения 30, 60
Измеряется в градусах. Устанавливается в диапазоне от 0.01 до 180.
При установке значения на 0, юнит перестает двигаться вовсе, только поворачивается на месте.
Если нужно чтоб юнит начинал движение сразу после отдачи приказа вне зависимости от его угла поворота, нужно установить значение на -1. Значения вне диапазона (0; 180] работают как -1.
Хз, может так будет понятнее. Юниту нужно повернуться стоя на месте до отметки в 60 градусов прежде начать движение:
Демонстрация, белым текстом указано окно сдвига, зеленым указано время потраченное на поворот до начала движения.
Опять же, время примерное.
Для управления сдвигом окна у нас есть следующие нативки:
native SetUnitPropWindow takes unit whichUnit, real newPropWindowAngle returns nothing // радианы
native GetUnitPropWindow takes unit whichUnit returns real // градусы
native GetUnitDefaultPropWindow takes unit whichUnit returns real // градусы
SetUnitPropWindow устанавливает текущий сдвиг окна юнита.
GetUnitPropWindow возвращает текущий сдвиг окна юнита.
GetUnitDefaultPropWindow возвращает дефолтный сдвиг окна юнита из РО.

Положение вставки

orientInterp, он же Положение вставки - Не менее бомбезный перевод словосочетания "Orientation Interpolation". Характеризует режим интерполяции поворота юнита (визуального, а не действительного), вообщем это то каким образом будет осуществляться поворот (плавность, резкость, и т.д.).
(!) Нативка GetUnitFacing возвращает именно визульный угол поворота.
Это что-то вроде выбора режима, может иметь 9 значений (от 0 до 8).
Для наглядности, вот график (0-8):
Как видно, самым быстрым и резким будет поворот при orientInterp=6, а медленным и плавным при orientInterp=8.
У того же Лича этот параметр указан как 3, поэтому кажется что он жопой кастовать может.
Демонстрация, белым текстом указано положение вставки.
Вот они слева направо.
Для управления положением вставки нативок нет.

Итог

Комбинируя разные значения этих полей можно добиться интересных результатов, например:
  • Наземный неповоротливый объект. Можно сделать так чтобы он долго и медленно поворачивался на месте прежде чем начать двигаться;
  • Воздушный массивный объект. Можно сделать так чтобы он начинал движение сразу после получения приказа, таким образом делая пируэты уже в движении.
Карта-пример идет в комплекте.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
18
Если кто еще какой инфой по этому поводу обладает, скидывайте сюда.
Ответы (6)
23
OVOgenez, Спасибо за статью! Можно дополнить инфой о возможностях и способах триггерного поворота юнита. Какие варианты самые быстрые, и для каких версий Варкрафта они работают.
18
makkad, мб позже добавлю, хотя там инфы немного, пару функций да их описание. Хотя вот как именно работает тот же SetUnitFacing надо будет посерчить.
18
Makeba, я ж указал этот пост в статье (ссылка первая).
25
OVOgenez, а, кек, раздел "о статье" попал в баннерную слепоту, так сказать
23
Перевод конечно у них просто пипец. Кто там, софтклаб переводил? Они вообще разбирались, что это значит на самом деле?
Кстати, а как по смыслу всё это нормально перевести?
И ещё эти тупые радианы вместо православных градусов, и 2 угла поворота, но это уже к близам вопрос.

вопрос сразу по РО
Как настроить поля атаки, чтобы юнит начал стрелять через например 3 секунды, после того, как он получил приказ и подошёл на дистанцию выстрела?
Ответы (9)
18
EugeAl, 1 радиан = 57,2958 градусов. Ну по этому поводу инфы в инете уже валом, не стал копипастить.
18
EugeAl, хз вообще можно ли сделать такое через РО, к повороту это явно не относится.
30
И ещё эти тупые радианы
Сам ты тупой, если не можешь с радианами разобраться.
30
1 радиан = 57,2958 градусов.
2Pi радиан это 360 градусов.
18
nazarpunk, ну вообще да. Но вот если обе части уравнения на 2Pi поделить то получим что получим)
25
Они вообще разбирались, что это значит на самом деле?
Да, разбирались, сразу после того, как разобрались с Громом Задирой и Райво из Пандарии
23
nazarpunk, да на кой черт они нужны, если градусы есть? Они бы ещё расстояния в игре в футах и милях добавили
23
EugeAl, Скорее градусы это устаревшая легаси мера измерения углов (близкая по этой характеристики к футам и милям), в отличии от естественно вытекающих из математики радиан.
23
makkad, проблема в том что в круге 360 градусов и 2п радиан, а 2п это откровенно неровное число, так же как мили и футы, и это усложняет расчеты
Сейчас прямо погуглил, да ну нафиг их)
30
Нужно было модельку поменьше подобрать, чтоб не двигать камеру на видео. Бесит ужасно.
Ответы (3)
18
nazarpunk, Выбирал чтоб чётче было видно разницу orientInterp. Там один хрен 50 юнитов в ряд с любой моделькой адекватно бы не уместилось.
30
OVOgenez, камеру бы отодвинул, у меня глаза блин выпали.
18
nazarpunk, тогда на числа с лупой смотрел бы) крч уже сделал как сделал, если чё можно скачать глянуть самому тестмап.
10
Бомбезная статья! Никогда не знал этого! Спасибо огромное, это действительно интересно. Каждый раз выпадаю с этого русского перевода редактора) А ещё Переключенный юнит и переключающий)
2 комментария удалено
27
Статья классная. Разобрался. Раньше никто не мог норм объяснить как работают "сдвиг окна". Про положение вставки итд
А в нативках что там?
!) Нативка GetUnitFacing возвращает именно визульный угол поворота.
Есть же еще в действиях поворот юнита, устанавливая его на ято он влияет?
Ответы (1)
18
MpW, нативки мб сегодня добавлю описание, но там ничего сверхъестественного, по идее...
23
Оч. познавательно) как ты резко перешёл от наработок героев, к викиэдитории по варкрафту)) Когда новый герой?))
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.