Углы Эйлера (Yaw, Pitch) в WarCraft III.
Эта статья поможет вам задать углы Эйлера для любой модели, таким образом получив целых три новых разновидности поворота.
Что такое Yaw, Pitch и Roll? Чтобы это понять, посмотрите на картинки ниже.
[spoiler="Угол Yaw"]
[/spoiler]
[spoiler="Угол Pitch"]
[/spoiler]
[spoiler="Угол Roll"]
[/spoiler]
Для эмуляции этих углов требуется три шага.
Шаг 1 - Подготовка модели. - Скачайте Model Editor
здесь.
- Откройте нужную модель в этой программе.
- Выберите Windows -> Node Manager.
- Нажмите правой кнопкой на хелпер (шарик с буквой "i" внутри), который назван Bone_Root или как-то похоже.
- Выберите Edit Node.
- Переименуйте его в Bone_Head.
- Сохраните.
- Импортируйте отредактированную модель в карту.
Шаг 2 - Работа в Редакторе. - В нужном воине в Редакторе Объектов измените параметр "Графика - Файл модели" на импортированный.
- Измените значение поля "Графика - Анимация: Время цветового перехода (сек.)" на 0.
- Создайте боевую единицу.
- Создайте две реальные переменные, их значение будет являться градусной мерой угла.
Шаг 3 - Задаём углы Yaw и Pitch. В задании углов Yaw и Pitch нам помогут две простые Jass-функции.
[code=jass]function AdjustToRangeOfNum takes real adj, real num returns real
local real adjusting = adj
loop
exitwhen (adjusting <= num and adjusting >= 0)
if adjusting < 1 then
set adjusting = adjusting + num
elseif adjusting > num then
set adjusting = adjusting - num
endif
endloop
return adjusting
endfunction
function SetUnitYawPitch takes unit u, real yaw, real pitch returns nothing
// Пользователь может ввести любой угол, а нам нужен такой, который попадёт в область [0;360].
// И это делается из-за проверки недопустимых pitch-углов (90 и 270 градусов), у них изменение угла будет 0 и функция не поменяет поворот.
local real y = AdjustToRangeOfNum(yaw,360.)
local real p = AdjustToRangeOfNum(pitch,360.)
local real offsetX
local real offsetY
local real offsetZ
if p == 90. or p == 270. then
set p = p - 1.
endif
if y == 90. or y == 270. then
set y = y - 1
endif
set offsetX = Cos(p * .0174532) * Cos(y * .0174532) * 1000000.
set offsetY = Cos(p * .0174532) * Sin(y * .0174532) * 1000000.
set offsetZ = Sin(p * .0174532) * 1000000.
call SetUnitLookAt(u,"head",u,offsetX,offsetY,offsetZ)
endfunction[/code]
Вот, собственно, и всё.