[lua] Сглаженное движение

» опубликован
» Способ реализации: Lua
» Тип: Алгоритм
» Версия Warcraft: 131+

Краткое описание

В наработке содержится набор функций, необходимый для сглаженного поворота (+ нахождение кратчайшего угла), и для сглаженного движения при перемещении от точки до точки.
Чтобы наглядно понять о чем я, смотрим FHD видео
Видео

Код

function math.clamp (inb, low, high)
	return math.min( math.max(inb, low ), high )
end

function math.lerp(a, b, t)
	return a + (b - a) * t
end

function repeatN(t, m)
	return math.clamp(t - math.floor(t / m) * m, 0, m)
end

function lerpTheta(a, b, t)
	local dt = repeatN(b - a, 360)
	if dt>180 then	dt=dt-360 end
	return math.lerp(a, a + dt, t)
end

Примеры использования:

Для угла:
TIMER_PERIOD=1/32
local angleCast = AngleBetweenXY(GetUnitX(hero), GetUnitY(hero), GetPlayerMouseX[data.pid], GetPlayerMouseY[data.pid]) / bj_DEGTORAD
local curAngle=angleCast
TimerStart(CreateTimer(), TIMER_PERIOD, true, function()
	angleCast = AngleBetweenXY(GetUnitX(hero), GetUnitY(hero), GetPlayerMouseX[data.pid], GetPlayerMouseY[data.pid]) / bj_DEGTORAD
	curAngle = lerpTheta(curAngle, angleCast, TIMER_PERIOD * 8)
	print(curAngle)
end)
Для дистанции:
TIMER_PERIOD=1/32
local distance=DistanceBetweenXY(GetUnitX(hero), GetUnitY(hero), GetPlayerMouseX[data.pid], GetPlayerMouseY[data.pid])
local cutDistance=distance
TimerStart(CreateTimer(), TIMER_PERIOD, true, function()
	distance=DistanceBetweenXY(GetUnitX(hero), GetUnitY(hero), GetPlayerMouseX[data.pid], GetPlayerMouseY[data.pid])
	cutDistance=math.lerp(cutDistance,distance,TIMER_PERIOD * 8)
	print(cutDistance)
end)


Просмотров: 349

Bergi_Bear #1 - 3 недели назад 0
Без сглаживания создаётся эффект 5 fps, сглаживание же добавляет недостающие кадры
Bornikkeny #2 - 3 недели назад 0
Клевая штука!
PAMEXI #3 - 3 недели назад 0
Блин( Было бы не плохо иметь такую штуку и на 1.26(
Андреич #4 - 3 недели назад 0
PAMEXI:
Блин( Было бы не плохо иметь такую штуку и на 1.26(
что мешает сделать такое на jass..?
Bergi_Bear #5 - 3 недели назад (отредактировано ) 0
PAMEXI, для 126 всё возможно, кроме синхронизированных координат курсора, именно поэтому нельзя, повторить то что на видео
Можно в сингле на мемхаке
pro100master #7 - 2 недели назад 1   
Берги а где наши ники за помочь ? =)
Bergi_Bear #8 - 2 недели назад 0
pro100master, Это месяц назад было =), уже не помню кто помогал, вроде ты, Doc и кто-то третий
ScorpioT1000 #9 - 2 недели назад (отредактировано ) 0
Опять же, это уже юзер-френдли реализовано в той самой либе, странно, что не попробовал.
Причем не только lerp, но и hermite, и даже вкусный bezier для 1D и для Vector3.
Кому интересно - чекайте
Но в любом случае гц

Кстати, с bezier можно ещё и предсказывать движение (экстраполяция), чтобы казалось, будто отклик выше
Bergi_Bear #10 - 2 недели назад 0
Опять же, это уже юзер-френдли реализовано в той самой либе, странно, что не попробовал
Опять же та, сама самая либа работает на векторах, а тут на углах, что понижает порог вхождения и общую усвояемость (и ты не сделал видюшку =))
ScorpioT1000 #11 - 2 недели назад (отредактировано ) 0
Нет, там есть набор 1D функций, но в целом да - тема не раскрыта.
Но я еще даже на инг не запостил( а надо еще вики мутить и много всего
Vlod #12 - 2 недели назад 0
+ нахождение кратчайшего угла
Был один интересный случай, когда при переходе с 5 -> 355 градусов ракета решила развернуться кругом
Bergi_Bear #13 - 2 недели назад 0
Vlod, да без этого поведение будет именно такое,
МрачныйВорон #14 - 1 неделю назад (отредактировано ) 0
а как получается так что модели пушек подкрашиваются красным, когда в водичку подводишь? это фреймы? наверн спецэффекты какие нибудь, подкрашенные цветом
так получается это модели двигаются за курсором мыши
Bergi_Bear #15 - 1 неделю назад 0
Просто определение высоты и смена цвета эффекта, никаких фреймов
МрачныйВорон #16 - 1 неделю назад 0
Bergi_Bear, а представь если бы ворота так смещать
Bergi_Bear #17 - 1 неделю назад 0
МрачныйВорон, Тоже легко, а что ты задумал?
МрачныйВорон #18 - 1 неделю назад (отредактировано ) 0
Bergi_Bear, до окончательной задумки еще далеко. мб стенку как-нибудь сделаю. Увидел вращение, может быть ворота сделать и стены.
вот в меню стройки не делать 2 вида ворот и 2 вида стен (как обычно горизонтальные и вертикальные), а достаточно 1, не нужно копиями забивать меню. берешь просто вращаешь. И даже диагонально поставить ворота.
Bergi_Bear #19 - 1 неделю назад 0
Это хорошая идея, только надо чтобы физической путь из блокираторов хорошо строился
Vlod #20 - 1 неделю назад 0
Bergi_Bear:
Это хорошая идея, только надо чтобы физической путь из блокираторов хорошо строился
Можно кодом закрашивать карту путей при строительстве и разрушении, например, указав габариты объекта
Bergi_Bear #21 - 1 неделю назад 1   
Можно кодом закрашивать карту путей при строительстве и разрушении, например, указав габариты объекта
не думаю что это возможно, карты путей у нас в тга и динамически менять саму картинку не выйдет, но просто подкрашивать некие области при повороте ворот в принципе возможно, но эта тем не про подкрашивания, а про плавности разворота при установке