Реалистичный снаряд
Кучу времени убил на это, страдая всякой ерундой, пытался раза 4 поискать в инете хоть какие-нибудь наработки, но видимо плохо ищу
В общем, как сделать снаряд, который игнорил бы впадины, ускорялся/замедлялся в зависимости от дуги и поворачивал бы свой носик на нужный градус (SetUnitLookAt)?
Может у кого есть наработка или ссылка?
upd я пока не в состоянии разобрать вектор и буду очень благодарен, если ответ будет через хэш-таблицу
1.26а

Лучший ответ:
Нужен мемхак или рефордж, чтобы поворачивать эффект по всем направлениям Yaw, Pitch, Roll
Всё остальное костыли 2005 года, оставьте их там же
(я про ту самую модель даммики с 360 анимациями для всех поворотов)
И разумеется 100% делать через эффект, никак юнитов

Тоже самое возможно на 126, 127, 128, просто возьмите это


Views: 115

» Лучшие комментарии


XGM Bot #1 - 1 week ago 0
Голосов: +0 / -0
Похожие вопросы:

» ответ
  1. Думаю, что можно.
Берем основную модель, возможно, вообще без мяса, только с гусеницами, но с кучей точек крепления. Также берем кучу моделей-аттачметов, представляющих собой эти самые пушки, корпуса и все прочее. При выборе характеристик модели через диалог или интерфейс соответственно создаем на основной модели эффекты-аттачменты, будет собрана техника. Такие штуки, как двигатель и прочие невидные извне элементы будут скорее входить в математическую модель юнита, но это также можно запилить. Название танка - сразу не скажу, есть ли триггер на смену, но на таблице рекордов можно отобразить что угодно.

2.Тоже можно.
Создаем погодный в определенной местности и делаем два триггера для контроля входа-выхода юнитов из нее. На искомых юнитов применяем нужные способности - и все готово.

  1. Здесь чуть сложнее: нужно постоянно проверять тип местности под юнитом, но тоже можно. Проверка на ограждения тоже может бить сделана.

4.Это уже интереснее. Видел раньше подобное в играх. При каждой атаке юнита случайным образом наносим или не наносим доп. урон, эффект горения, кидаем спелл на цель в зависимости от теоретического места попадания атаки.

5.И это можно. Но нужно писать нестандартную систему Альянса. Но через триггеры и JASS все можно...

  1. Продажа техники - лучше через способность, что бы кидать ее на понравившегося юнита, не стоит покупать кота в мешке. Стоимость должна зависеть от технического уровня юнита, его текущего состояния (мертвый танк попадет вам бесплатно, сами чините!), если он был модернизован дополнительно, то это тоже входит в стоимость. Разрешение на продажу делаем аналогично.

  1. Это легко через Custom Value и переменние.

Как ты понял, все что ты предложил создать можно, но на это нужно потрать хороший кусок времени. Остается пожелать тебе удачи над созданием проекта - мне идея уже нравится.
» ответ
Рассмотрим на примере модельки простого огра, у него есть анимация атаки slam и удар дубиной по земле
  1. Старт атаки
  2. Создаём упреждающий в области впереди героя (маркер, ну эффект ауры например), чтобы игрокам было понятно что скоро тут что-то произойдёт
  3. Проигрываем анимацию "attack slam" или нужную другую, для замаха дубиной, если надо больше и не хватает стандартной скосроти, замедляем скорость анимации
  4. Визуально подгадываем или упытным путём определяем время касания дубиной полна от 1 до 4 сек, на ваше усмотрение
  5. Запускаем новый разовый таймер с нужным периодом, и как таймер сработает, создаём спец эффект, и наносим урон юнитам в области эффекта
(это самый простейший способ, хоть на гуи можно сделать)

Bergi_Bear #3 - 1 week ago 5
Голосов: +5 / -0

Нужен мемхак или рефордж, чтобы поворачивать эффект по всем направлениям Yaw, Pitch, Roll
Всё остальное костыли 2005 года, оставьте их там же
(я про ту самую модель даммики с 360 анимациями для всех поворотов)
И разумеется 100% делать через эффект, никак юнитов

Тоже самое возможно на 126, 127, 128, просто возьмите это
rsfghd #4 - 1 week ago 0
Голосов: +0 / -0
Bergi_Bear, понимаю, что сейчас разочарую тебя, но я хочу посмотреть на эти костыли)
Если я вектор не могу понять, то какой там мемхак, а рефа у меня соответственно тоже нет и вряд ли будет
Bergi_Bear #5 - 1 week ago (изм. ) 2
Голосов: +2 / -0
мемхак, это Контр C + контр V и у тебя гигансткое и функциональное API, тебе не надо понимать вектор. Ибо в функции для повотора можно также передать углы
Тебе нужен Pitch если снаряд эффект выглядит как самолёт в изначальном положении, а там хоть костылями забиваешь как хочешь, но ты можешь его кренить, UnitLookAt - сделан для поворота головы при диалогах в кампании, все его дальнейшие применения - извращение чистой воды, когда есть альтернативы, когда этого не было, то ещё ладно. Но не сейчас, не иди на дорожку инвалида, оставь это для сидящих на айкапе

function GetEffectRoll takes effect e returns real // X | returns Degrees!
        return GetObjectRoll( ConvertHandle( e ) )
	endfunction

	function SetEffectRoll takes effect e, real angle returns nothing
        call SetObjectRoll( ConvertHandle( e ), angle )
	endfunction

	function GetEffectPitch takes effect e returns real // Y | returns Degrees!
		return GetObjectPitch( ConvertHandle( e ) )
	endfunction

	function SetEffectPitch takes effect e, real angle returns nothing // Y | In Degrees!
        call SetObjectPitch( ConvertHandle( e ), angle )
	endfunction

	function GetEffectFacing takes effect e returns real // Z | Yaw | returns Degrees!
        return GetObjectFacing( ConvertHandle( e ) )
	endfunction

	function SetEffectFacing takes effect e, real angle returns nothing // Z | Yaw | In Degrees!
        call SetObjectFacing( ConvertHandle( e ), angle )
	endfunction
Всё есть вертай не хочу

Дальше останется адаптировать готовый луа код и превратить его в jass
				BlzSetSpecialEffectX(missile, x) -- устанавливаем положение эффекта
				BlzSetSpecialEffectY(missile, y) -- устанавливаем положение эффекта
				local zNew  = GetParabolaZ(za, zb, distance * MISSILE_ARC, distance, way) -- считаем новую высоту эффекта
				local zDiff = zNew - z -- считаем разницу высот
				BlzSetSpecialEffectZ(missile, zNew) -- устанавливаем новую высоту эффекта
				local zAngle = zDiff > 0 and math.atan(SPEED_INC / zDiff) - math.pi / 2 or math.atan(-zDiff / SPEED_INC) - math.pi * 2 -- считаем угол наклона снаряда
				BlzSetSpecialEffectOrientation(missile, angle, zAngle, 0) -- устанавливаем направление эффекта
				z = zNew -- запоминаем новую высоту эффекта
BlzSetSpecialEffectOrientation тут нет, но это по аналогии функий мемхака это Facing, Pitch, Roll
Забабахай 2 вместо одной
SetEffectFacing(missile,angle)
SetEffectPitch(missile,zAngle)
Только 1 самый важный момент - Назар вроде как в радианах работал, а функции мемхака берут угол, но это уже проще
Прикрепленные файлы
rsfghd #6 - 1 week ago (изм. ) 0
Голосов: +0 / -0
Bergi_Bear,
Тоже самое возможно на 126, 127, 128, просто возьмите это
Решил просто перенести свои триггеры сюда, но оно пишет, что я какие-то блоки упустил и не даёт запустить карту
Прикрепленные файлы
Bergi_Bear #7 - 1 week ago 0
Голосов: +0 / -0
а pjass ты поставил последний?

Попробуй без переноса сохранить чистую карту для начала
rsfghd #8 - 1 week ago (изм. ) 0
Голосов: +0 / -0
Bergi_Bear, сохраняло спокойно, а конкретно мой триггер - нет
Это из-за cjass'a что ли?
Вот даже отключил свои триггеры, снова сохранил и всё норм

upd м, нет, вру, не норм
Карта хоть и сохраняется без ошибок при отключении триггеров, но запустить по прежнему нельзя, в главное меню кидает. Удаление триггеров так же не помогло, хотя я ничего не трогал больше
Bergi_Bear #9 - 1 week ago 1
Голосов: +1 / -0
Сиджас в последнем мемхаке наладили вот /nocjass стоят везде. Ты точно меня хорошо понял про pjass?
МрачныйВорон #10 - 1 week ago 2
Голосов: +2 / -0
rsfghd #11 - 1 week ago (изм. ) 0
Голосов: +0 / -0
Bergi_Bear, отсюда качал pjass xgm.guru/p/wc3/easymem
Ошибка с блоком была из-за отключённого AdicParser'a, но в мемхаке включить его низя, иначе другая ерунда вылезет
МрачныйВорон, пасиб большое, теперь хоть через впадины нормально перелетает)
Однако мне всё равно интересно как замедлить/ускорить снаряд до/от середины полёта и можно ли как-нибудь эту силу прикрутить к параболе?
МрачныйВорон #12 - 1 week ago (изм. ) 4
Голосов: +4 / -0
На скорую руку составил. Точно не могу сказать, что правильно. Но логически должно быть верным. Хочется на сие творение посмотреть)
Раскладываем скорость на векторы:
Vx=1,Vy=1,Vz=1 - изначально скорость нулевая, тк ракета еще не вылетела. Когда мы запустим, наша скорость будет равна 1. Скорости придает ускорение.
a=0 - ускорение. Изначально оно равно нулю, таймером каждую секунду увеличиваем наше ускорение. Когда снаряд достигнет середины дуги, или половины пройденного пути, тогда уже наше ускорение превращается в понижение. Будет постепенно понижаться до нуля.
Ux,Uy,Uz - тек положение нашего снаряда
каждую секунду тикаем таймером:
изменяем нашу скорость. Вот здесь я не уверен. Надо самому потестить, устал. Но взял из учебников физики. av-physics.narod.ru/mechanics/acceleration.htm простенькая формула.
Vx = Vx + at
Vy = Vy + at
Vz = Vz + at
изменяем наше положение снаряда. черт, забыл углы. ведь координаты, а тут углы. забыл относительно чего углы брать. Углы надеюсь сможешь понять как, а то лень через арккосинус
Ux = Ux + Vx * Sin(theta) * Cos(phi)
Uy = Uy + Vy * Sin(theta) * Sin(phi)
Uz = достаем нужную высоту из параболы (Uz + Vz * Cos(theta) )
//увеличиваем скорость
a = a + 1 - какую вам надо
Прикрепленные файлы
ScopteRectuS #13 - 1 week ago (изм. ) 2
Голосов: +2 / -0
Сам недавно делал способность с проджектайлом. Можно сделать без векторов и всяких косинусов и синусов. Код на Lua и Reforged, но тут главное арифметика, а не функции:
    -- arrowX/Y/Z - текущее положение снаряда
    -- arrowTargetX/Y/Z - куда должен лететь снаряд
    -- 32.8125 - скорость снаряда (расстояное, которое проходит снаряд за один тик таймера)

    local dx   = arrowTargetX - arrowX
    local dy   = arrowTargetY - arrowY
    local dz   = arrowTargetZ - arrowZ
    local dist = math.sqrt( ( dx ^ 2 ) + ( dy ^ 2 ) + ( dz ^ 2 ) )

    arrowX = arrowX + 32.8125 * ( dx / dist )
    arrowY = arrowY + 32.8125 * ( dy / dist )
    arrowZ = arrowZ + 32.8125 * ( dz / dist )

    BlzSetSpecialEffectX( arrow, arrowX )
    BlzSetSpecialEffectY( arrow, arrowY )
    BlzSetSpecialEffectZ( arrow, arrowZ )
Но тут правда прямолинейное движение.
rsfghd #14 - 1 week ago (изм. ) 0
Голосов: +0 / -0
МрачныйВорон,
a = a + 1 - какую вам надо
хе, я бы и сам справился с ускорением/замедлением в полёте, но дело в том, что я не знаю на какое значение нужно замедлять/ускорять снаряд, если будет через твой пример, то снаряд может замедлиться не долетев до середины, в итоге он так и повиснет в воздухе, потому что середину не перелетел, где должно было начаться ускорение
Прикрепленные файлы
ScopteRectuS #15 - 1 week ago 1
Голосов: +1 / -0
rsfghd, это нужно будет рассчитывать в зависимости от расстояния. Например, задаёте изначальную скорость и умножаете на процент пройденного пути. В итоге, когда снаряд долетит до конца пути - получит все 100 % ускорения. Или наоборот, тогда снаряд в конце будет иметь нулевое ускорение.

Ну или придумать свою формулу. Всё зависит от конкретного случая.
quq_CCCP #16 - 1 week ago 0
Голосов: +0 / -0
Как насчёт юзать аксид бомбу и не парится?
МрачныйВорон #17 - 1 week ago (изм. ) 1
Голосов: +1 / -0
» продолжение
углы надо найти, чтобы направление векторам задавать. Для этого нужно просчитать вектор движения dx,dy,dz
Ux,Uy,Uz - тек точка
Tx,Ty,Tz - конечная точка, куда должен прилететь снаряд
dx = Ux-Tx
dy = Uy-Ty
dz = Uz-Tz
theta = Atan2(SquareRoot(dx*dx + dy*dy), dz)
phi = Atan2(dy/dx)
rsfghd, ну вы должны сами понимать наскока она увеличивает/понижает скорость. Тут еще как бы есть время t, помноженное на ускорение a. t счетчик времени у вас растет? Очень сильно увеличивает вперед из-за времени. А еще как сильно понижаться будет?

Есть мысль, что половину пути L/2 приравнять - 100% или к max_a =1.00
R - расстояние между тек точкой снаряда и серединой маршрута
L - это расстояние от начала движения до конечного
a = R/(L/2) - вот процент ускорения (от 1 до 0). чем ближе ваша точка находится к центру дуги или середины маршрута, тем ниже процент a. В центре дуги ускорения не останется (a=0). и она начнет убывать (a<0 - типа под гравитацией). когда долетает до середины дуги. мы меняем знак наверное? и надо делать со счетчиком времени t, типа убывать, а то обратно будет удвоенно понижать.
Вопрос: что делать дальше? после центра дуги параболы? Ведь нужно, чтобы скорость понижалась, ведь в центре дуги достигла макс скорости. Теперь она должна понижаться по формуле: U = U0 - at
Вторая проблема - это счетчик времени t, если продолжит дальше увеличиваться, то это сильно повлияет на скорость. Я не знаю точного ответа, надо тестить. надо простенький пример какой-то провести, чтоб проверить. Ведь счетчик времени является множителем, очень сильно торможение будет, так и не долетит до цели. Возможно стоит убавлять счетчик или обнулить.
» пример
a - коэф сильно зависит от расстояния.
в итоге это мб не то что нужно. дело в том, что до цели долетает совсем ослабленный снаряд. он долетит до цели со скоростью U=1. мб надо вначале придать ускорение увеличивать в 2 раза, чтобы не казался слабысм

1
Прикрепленные файлы
rsfghd #18 - 1 week ago (изм. ) 0
Голосов: +0 / -0
ScopteRectuS, я пытался через процент, но видимо косячил где-то..
quq_CCCP, мне нужно будет манипулировать снарядом как мне угодно
МрачныйВорон,
a = R/(L/2)
я именно так и пробовал, но благодаря тебе я сейчас понял где допускал ошибку каждый раз, теперь я поправил это, спасибо)

upd ох.. даже не знаю чей ответ то выбрать, все очень сильно помогли)
ещё раз поблагодарю Ворона)
МрачныйВорон #19 - 1 week ago 1
Голосов: +1 / -0
rsfghd, а он реал работает? а то мне кажется что-то не правльно. легче чужоф код посмотреть
PT153 #20 - 1 week ago (изм. ) 1
Голосов: +2 / -1
а pjass ты поставил последний?
Это не пжасс ошибку выдал, а жассхелпер. Там же написано vJass, step 2 (structs).
prog #21 - 1 week ago 5
Голосов: +5 / -0
Господа, вы больны. Снаряд не замедляется и не ускоряется по горизонтали, не считая сопротивления воздуха, если только на снаряде не установлен реактивный двигатель. При движении по параболе изменяется только вертикальная составляющая скорости по мере приближения и удаления от вершины параболы.
PT153 #23 - 1 week ago 2
Голосов: +2 / -0
Полностью согласен с прогом, из курса школьной физики должно быть известно, что вдоль земли снаряд летит с постоянной скоростью.
МрачныйВорон #24 - 1 week ago 0
Голосов: +0 / -0
prog, а как надо?
prog #25 - 1 week ago 1
Голосов: +1 / -0
МрачныйВорон, считаем отдельно горизонтальную скорость, отдельно вертикальную. К вертикальной применяем постоянное ускорение вниз, к горизонтальной либо вобще не применяем ускорение либо применяем минимальное чтобы симулировать сопротивление воздуха. Все, реалистичная модель движения по параболе готова. Вершина параболы достигается когда вертикальная скорость доходит до нуля и начинает идти в обратную сторону.
rsfghd #26 - 1 week ago 0
Голосов: +0 / -0
prog, боже, спасибо тебе, ты ж гений))