Добавлен , опубликован
без понятия как назвать эту ерунду
в общем, если ты тут, то наверняка знаешь что делает эта функция
function PolarProjectionXYZ(x, y, z, dist, GroundAngle, FacingAngle)
    --FacingAngle - 0-360 -- yaw
    --GroundAngle - 0-180 -- pitch
    local x1 = x + dist*SinBJ(GroundAngle)*CosBJ(FacingAngle)
    local y1 = y + dist*SinBJ(GroundAngle)*SinBJ(FacingAngle)
    local z1 = z + dist*CosBJ(GroundAngle)
    --
    return x1,y1,z1
end
если двигать по поляркам то будет красиво, да, но а если подключить высоту? например движение по дуге? выйдет примерно так:
да, тоже прикольно, но не в этом дело, движение строго вертикальное, под 90 градусов, и как крутить эти градусы мне было вообще непонятно, и тут мне помог великий человек, Vlod, без него я бы забил на эту идею
он мне скинул следующую карту:
с таким вот кодом
globals
    real time = 9
    real ptime = 0.03125
    real dist = 150 // расстояние от центра оси
    real height = 0
    real agl = 0
    real dagl = ((bj_PI*2)*5*ptime)/time // 5 оборотов за все время
    real dz = 300*ptime/time // на 300 вверх (после поворота вперед) за все время
    unit u = null
    integer tick = R2I(time/ptime)
endglobals


function update takes nothing returns nothing
    local real x
    local real y
    local real z
    local real tagl = bj_PI*0.25 // угол между oz и ox - 45g
    local real angle = bj_PI*0.5 // угол между ox и oy - 90g
    local real rds
    local real tmp
    set agl = agl + dagl // вращение вокруг центра
    set height = height + dz // движение вверх
    
    // получение стартовых позиций x y z
    set x = 0 + dist*Cos(agl)
    set y = 0 + dist*Sin(agl)
    set z = height
    
    // поворот по оси zx
    set tmp = x
    set x = x*Cos(tagl) + z*Sin(tagl)
    set z = -tmp*Sin(tagl) + z*Cos(tagl)
    
    // поворот по оси xy
    set tmp = x
    set x = x*Cos(angle) - y*Sin(angle)
    set y = tmp*Sin(angle) + y*Cos(angle)


    call SetUnitX(u, x)
    call SetUnitY(u, y)
    call SetUnitFlyHeight(u, z, 0)
    
    set tick = tick - 1
    if tick <= 0 then
        call PauseTimer(GetExpiredTimer())
    endif
endfunction


function Trig_init2_Actions takes nothing returns nothing
    call TriggerSleepAction(0)
    
    set u = CreateUnit(Player(0), 'hfoo', 0, dist, 0)
    
    call TimerStart(CreateTimer(), ptime, true, function update)
endfunction

//===========================================================================
function InitTrig_init2 takes nothing returns nothing
    set gg_trg_init2 = CreateTrigger(  )
    call TriggerAddAction( gg_trg_init2, function Trig_init2_Actions )
endfunction

думаю излишне говорить, что мне успешно удалось сделать красивое движение по моей задумке:
можно намного интереснее движения делать, если пофантазировать, у меня даже получались, но к сожалению их контролировать я не мог, вот примеры:
само движение по дуге я брал отсюда: xgm.guru/p/blog-rsfghd/dvizhenie-po-beze-MKA
к нему просто прикрепил то, что скинул мне человек, благодаря которому эта страница вообще появилась
`
ОЖИДАНИЕ РЕКЛАМЫ...