XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
MpW

offline
Опыт: 49,815
Активность:
q
Q

Отредактировано Steal nerves, 03.09.2014 в 03:42.
Старый 15.11.2013, 09:07
J64_

offline
Опыт: 4,724
Активность:
И вообще, берём учебник по геометрии.
Старый 15.11.2013, 14:15
Hanabishi
COOL STATUS
offline
Опыт: отключен
Как высчитать угол Z:
//функция вычисляет Z юнита
real GetUnitZ(unit u){
    return GetLocationZ(GetUnitLoc(u))+GetUnitFlyHeight(u)
}

nothing MyFunc(){
    unit u1 = //первый юнит
    unit u2 = //второй юнит
    
    real x1 = GetUnitX(u1)
    real y1 = GetUnitY(u1)
    real z1 = GetUnitZ(u1)
    
    real x2 = GetUnitX(u2)
    real y2 = GetUnitY(u2)
    real z2 = GetUnitZ(u2)
    
    real x = x2 - x1
    real y = y2 - y1
    real z = z2 - z1
    
    real angle_xy = Atan2(y, x) //угол в XY
    real dist_xy = SquareRoot(x*x + y*y) //длина XY
    
    //получем угол Z
    real angle_z = Atan2(z, dist_xy)
}
Старый 15.11.2013, 14:50
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
GetUnitLoc(u)
утечка
Старый 15.11.2013, 15:01
Hanabishi
COOL STATUS
offline
Опыт: отключен
Движение по Z организовывается чуть сложнее, чем в плоскости, из-за особенностей вара:
nothing Move(){
    //инициализация движения

    real speed = 1000.0 //скорость движения
    
    //теперь надо преобразовать скорость в вектор движения
    
    real speed_x = speed * Cos(angle_xy) * Sin(angle_z)
    real speed_y = speed * Sin(angle_xy) * Sin(angle_z)
    real speed_z = speed * Cos(angle_z)
    
    //сохраняем в хеш и двигаем юнит таймером
}

nothing TimerMove(){    
    //по Z чуть труднее
    //не забываем умножать скорость на период таймера
    location loc = Location(GetUnitX(u) + speed_x * timerPeriod, GetUnitY(u) + speed_y * timerPeriod)
    real land_z = GetLocationZ(GetUnitLoc(u)) - GetLocationZ(loc)
    RemoveLocation(loc)
    
    SetUnitFlyHeight(u, GetUnitFlyHeight(u) + land_z + speed_z * timerPeriod, 0)
    
    //сдвигаем по XY
    SetUnitX(u, GetUnitX(u) + speed_x * timerPeriod)
    SetUnitY(u, GetUnitY(u) + speed_y * timerPeriod)
}
Hanabishi добавил:
16GB:
GetUnitLoc(u)
утечка
Где тут утечка? Нативка вроде возвращает точку юнита, а не создаёт новую. Хотя уже не помню, вызывает или нет.
Старый 15.11.2013, 15:17
DioD

offline
Опыт: 45,134
Активность:
Нативка вроде возвращает точку юнита
ЕРЕСЬ!
Старый 15.11.2013, 16:06
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Hanabishi, Локейшены не болекспры, они не кешируются, сколько не вызови GetUnitLoc столько раз вернёт новую точку, не смотря на то что юнит стоял на месте...
Старый 15.11.2013, 16:22
Карточка
Kicked by SSrunX
offline
Опыт: 2,017
Активность:
globals
    location LocationForGetZ = Location(0,0)
endglobals

function GetUnitZ takes unit u returns real
    call MoveLocation(LocationForGetZ, GetUnitX(u), GetUnitY(u))
    return GetLocationZ(LocationForGetZ)
endfunction
Старый 15.11.2013, 18:01
Extremator

offline
Опыт: 39,428
Активность:
Hanabishi:
GetLocationZ(GetUnitLoc(u))+GetUnitFlyHeight(u)
Z точки (под юнитом) + высота полёта юнита = высота юнита в данный момент?
я к чему спрашиваю... мне ЭТО понятно, но вот когда юнита пролетает клифы/деревья/здания - высота меняется, у самого юнита... где-то в движке идёт авто-регулирование что ли...
И вот, молния будет корректно "следовать" за юнитом даже над резкими клифами?
а то я делал что такое, год назад, у меня было криво, я забросил это дело...
Extremator добавил:
Вот о чём я.
Это лечится?
Миниатюры
Кликните на картинку для увеличения
Название:  1.png
Просмотров: 79
Размер:  43.3 Кбайт  
Старый 16.11.2013, 11:15
Hanabishi
COOL STATUS
offline
Опыт: отключен
Extremator, смотри функцию TimerMove, там описано, как скорректировать, для этого высчитывается ещё одна точка.
А если ты говоришь про то, что он даже на ровном месте косячит, то просто поставь юниту тип передвижения "нет", и давай абилу ворона.
Старый 16.11.2013, 12:00
DioD

offline
Опыт: 45,134
Активность:
чтобы вычислить реальную высоту юнита необходимо перечислять (не важно как) 5 треугольников (как именно сами догадаетесь) в поисках препятствий которые могут повлиять на высоту юнита.
лично я вычислял все эти "погрешности" вручную без каких либо особых сложностей на летающем юните с моделькой виспа и не летающим юнитом с моделькой виспа, который двигался прицепом, при визуальном расхождении моделей, я жал эскейп и мне выводило дистанцию до препятствия, после я строил треугольники.
квадратом тоже можно вычислять, но треугольниками выходит оптимальнее по числу итераций, вершины треугольников и оффсеты хранить в прекешированном виде в массиве и накладывать матрицу при необходимости.
Старый 16.11.2013, 17:26
Hanabishi
COOL STATUS
offline
Опыт: отключен
((цитата
чтобы вычислить реальную высоту юнита необходимо перечислять (не важно как) 5 треугольников (как именно сами догадаетесь) в поисках препятствий которые могут повлиять на высоту юнита.
лично я вычислял все эти "погрешности" вручную без каких либо особых сложностей на летающем юните с моделькой виспа и не летающим юнитом с моделькой виспа, который двигался прицепом, при визуальном расхождении моделей, я жал эскейп и мне выводило дистанцию до препятствия, после я строил треугольники.
квадратом тоже можно вычислять, но треугольниками выходит оптимальнее по числу итераций, вершины треугольников и оффсеты хранить в прекешированном виде в массиве и накладывать матрицу при необходимости.
))
А можно просто
поставь юниту тип передвижения "нет", и давай абилу ворона.
Старый 16.11.2013, 17:44
Extremator

offline
Опыт: 39,428
Активность:
Hanabishi:
А можно просто
поставь юниту тип передвижения "нет", и давай абилу ворона.
Ну а если тип движения этого юнита имеет значение (в игре).
Например тизер виспа из доты...
Он прикрепляется к юнитам с разными типами движения
Старый 16.11.2013, 18:18
Hanabishi
COOL STATUS
offline
Опыт: отключен
Ну а если тип движения этого юнита имеет значение (в игре).
Придётся значит условие отдельно для него делать, как исключение
Старый 16.11.2013, 18:25
DioD

offline
Опыт: 45,134
Активность:
а не проще один раз посчитать оффсеты да?
Старый 17.11.2013, 11:09
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 11:49.