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

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

Ответ
 
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Движение по параболе
У меня реальные траблы в плане написания параболического движения юнита. Пытался адаптировать найденные тут формулы, но результат неудовлетворительный (в зависимости от дальности юнит падает то раньше, то позже). Параметры вприцнипе такие: макс расстояние = 1300, смещение в отношении х и у происходит на 15 каждые 0.02 секунды. Проблема в вычислении z. Кто-нибудь может натолкнуть на/дать правильную формулу, что бы юнит не летал "по треугольнику", как это происходит у меня сейчас?)
Старый 04.03.2012, 22:44
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
library ParabolicMovement

function ParabolaZ takes real h, real d, real x returns real
  return (4 * h / d) * (d - x) * (x / d)
endfunction

endlibrary
h - максимальная высота в прыжке на середине расстояния (x = d / 2),
d - общее расстояние до цели,
x - расстояние от исходной цели до точки, где следует взять высоту по параболе.
Старый 04.03.2012, 23:00
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Vadik29, вопрос - и как я рассчитаю максимальную высоту, не зная угол? Мне известно только лишь расстояние между точками..
Старый 04.03.2012, 23:22
Klop
Папа римский
offline
Опыт: 13,006
Активность:
расчитываем шаг расстояние делённое на шаг тем самым получаем число раз которым выполнять будем цикл
далее поднятие максимальная высота задаётся тобой,т.е на середине он должен достигнуть максимальной высоты
кол-во раз делённое на 2
формула строится тобой при твоих данных
надеюсь помог
Старый 04.03.2012, 23:44
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Смотри мою статью по ссылке в подписе,там описывается работа с функцией параболы
Старый 04.03.2012, 23:47
Extremator

offline
Опыт: 39,403
Активность:
Vampirrr:
Мне известно только лишь расстояние между точками..
если у тебя есть точки то ты можешь получить:
  1. Дистанцияю между А и Б
  2. векторы АБ и БА
Старый 04.03.2012, 23:50
DualShock

offline
Опыт: 5,023
Активность:
((код jass
library ParabolicMovement
function ParabolaZ takes real h, real d, real x returns real
return (4 * h / d) * (d - x) * (x / d)
endfunction
endlibrary
))
Если ты не понимаешь как пользоваться формулой, то погляди на картинку:
Старый 05.03.2012, 00:34
Msey
????
offline
Опыт: 67,346
Активность:
это несложно
((кат код

method ParabolaZ takes real h, real d, real x returns real
        return (2 * h / d) * (d - x) * (x / d)
endmethod

static method MoveSur takes nothing returns nothing
        local sur dumm = sur(GetTimerData(GetExpiredTimer()))
        local group g
        local unit tar
        if DistanceBetweenPoints(GetUnitLoc(dumm.dum), dumm.cp) < DIST then
            set dumm.surX = GetUnitX(dumm.dum) + SPEED * Cos(bj_DEGTORAD*GetUnitFacing(dumm.dum))
            set dumm.surY = GetUnitY(dumm.dum) + SPEED * Sin(bj_DEGTORAD*GetUnitFacing(dumm.dum))
            call SetUnitPosition(dumm.dum, dumm.surX, dumm.surY)
            call SetUnitFlyHeight(dumm.dum, dumm.ParabolaZ(100., DIST, DistanceBetweenPoints(GetUnitLoc(dumm.dum), dumm.cp)) , 0)
            set g = CreateGroup()
            call GroupEnumUnitsInRange(g, dumm.surX, dumm.surY, 150., null)
                if CountUnitsInGroup(g) > 0  then
                    set tar = FirstOfGroup(g)
                    if dumm.FilterUnit(dumm.dum,tar) then 
                          if dumm.UnitCollision(dumm.dum,tar) then
                            call dumm.DamageGroup(dumm.dum, tar, DMG)
                            call dumm.destroy()
                            call GroupRemoveUnit(g,tar)
                            call DestroyGroup(g)
                          endif
                    endif
                endif
        else
            call dumm.destroy()
        endif
        set tar = null
        set g = null
    endmethod
call SetUnitFlyHeight(dumm.dum, dumm.ParabolaZ(100., DIST, DistanceBetweenPoints(GetUnitLoc(dumm.dum), dumm.cp)) , 0)
))
float GetPointZ (real x, real y) {
      location l = Location(x,y)
      float a = GetLocationZ(l)
      RemoveLocation(l)
      l = null
      return a
}
хотя большое кол-во кода меня иногда запутывает
Старый 05.03.2012, 01:12
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
DualShock, Extremator, копетаны
Nerevar, Klop, Vadik29, Msey, оно конечно все хорошо с параболой, но т.к. пытаюсь реализовать через банальную физическую формулу y = y0+V0t-5t^2, хотелось бы уже добить этот вариант. На данный момент я знаю, что скорость по проекции X равна 15 (это на сколько я перемещаю юнита каждые 0.02 секунды). Следовательно, по проекции Y скорость равна 26 (это если представить, что угол равен 60 градусам). Исходя из этого, я имею полное право воспользоваться вышеуказанной формулой, правильно? Проблема заключается в том, что юнит на самом деле кидается как будто при 10 градусах (ну хотя бы летит как будто по параболе), но никак не при 60. При попытках подстановки значений о параболе никакой речи и не шло - юнит постоянно поднимался.
Старый 05.03.2012, 01:31
Ответ

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

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

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

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



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