Гранатомет (Миномет)

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Здравствуйте все.
У меня появился такой вопрос, по какому принципу можно сделать полет гранаты (мины), по параболе? Т.е как можно сымитировать полет гранаты по наклонной траектории?
Например - я предполагаю что за стеной есть противник, как рассчитать траекторию полета (угол выстрела и начальную скорость мины). Хотелось бы так, как на этом графике.
1473175764210263729.png
Можно конечно воспользоваться готовыми ent-гранатами (там это всё есть), но я хочу понять сам процесс расчета и построения траектории такого полета.
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Ну вот. Вроде что-то получается.
Это самый начальный вариант моего гранатомета. Модели гранат взял пока стандартные, что бы не мучиться, сделаю потом свои модельки гранат (наверно будут переливаться, что-бы их было заметнее, задам им какой нибудь звук при полете)
Всё-таки необходимо дополнить 3D модель Дрона поворотной станиной, для наведения гранатомета по pitch и yaw.
Сейчас у меня наведение только по вертикали, а этого явно не хватает. Можно, конечно, наводить телом(гусеницами) Дрона, но это не то. На днях обязательно сделаю.
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Закончил с созданием гранатометов, просто добавил платформу, на неё установил 2 своих, независимых друг от друга гранатомета. Отказался от начальных моделей гранатометов.
Для определение угла подъёма и начальной скорости выстрела сделал таблицу, её в массив и с неё в зависимости от расстояния беру данные. Нужно еще как-то учитывать скорость движения Дрона, т.к. при создании таблицы Дрон и цель были неподвижны.
Как и хотел, повороты гранатометов я сделал по горизонтали и вертикали, наведение плавное.
Вначале была мысль сделать расчет траектории полета гранаты формулой, но это оказалось проблематично, т.к. постоянные расчеты до добра не доведут, остановился на статичных расчетах(таблице). По моему самый оптимальный вариант.
И еще, думаю нужно сделать хотя-бы небольшой след за гранатами, а то их совсем не видно на фоне "неба".

 
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Ну вот и дополнение:
1. Сделал гранатам хвосты.
2. Сделал 3D модель лазерной пушки, установил на Дрона.
3. Дооолго возился со своей старой-престарой проблемой, проблемой получения координат начальной точки выстрела(при анимации). Решение нашел.
На видео видно, выстрел идет точно из центра ствола лазерной пушки. Не нравится то, что конечная точка, это точка Axis самой 3D модели. Хотелось бы что бы эффекты попадания лазера были в том месте в какое лазерный луч попал.


 
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
......Не нравится то, что конечная точка, это точка Axis самой 3D модели. Хотелось бы что бы эффекты попадания лазера были в том месте в какое лазерный луч попал.
Эту проблему я решил.
Сейчас луч попадает в тело противника(задал небольшой рендом). Все что нечаянно попадает под луч, получает ущерб, независимо от заданного конечного расстояния(проще говоря, можно своим телом спасти то, что находится в прицеле лазерной пушки Дрона).

 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
Дооолго возился со своей старой-престарой проблемой, проблемой получения координат начальной точки выстрела(при анимации). Решение нашел.
А каким способом решил?
Я тоже возился над такой проблемой, но так пока не добился ничего толком.
Правда хотел сделать аналогично тому как делалось в WeaponAttachmentAPI, без его использования.
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
А каким способом решил?
Я тоже возился над такой проблемой, но так пока не добился ничего толком.
Правда хотел сделать аналогично тому как делалось в WeaponAttachmentAPI, без его использования.

WeaponAttachmentAPI - смотрел, смотрел, ничего не понял, вернее ничего для себя интересного не увидел.

Мой процесс следующий:
1. При создании 3D модели (например лазерной пушки) делаю аттач на носу ствола. Это обязательно, думаю это и не нужно объяснять. Правильная ориентация аттача след:
смотрим на "морду" модели:
красный - вперед
синий - вверх
зеленый - вправо.
2. Программно, к этому аттачу цепляю любую
ENT, делаю её невидимой. Это для того что движек Souce по другому, по моему, не понимает(в принципе так же как и другие движки). Эта ENT и будет в дальнейшем начальной точкой выстрела. Но здесь есть одно НО. Если модель сборная(для упрощения проигрывания анимаций) аттач не должен быть более 2 в иерархии этой модели, т.е. основная модель и к ней аттачь. Если, к примеру, есть основная модель(к примеру танковые гусеницы), к ней припарентена башня, а к башне пушка, то ENT на носу пушки в любом случае выдаст неверные координаты. Хоть локальные хоть "мировые". Так как это именно мой вариант, я делаю след образом;
3. Вот здесь и самое интересное! В старом Pawn(CS 1.6) была временная TE_ (TE_BEAMENTPOINT)
которую можно переделать для SourcePawn, и она неплохо работает! (их там, кстати сказать, валом, но не все работают в SourcePawn'е). Конкретно эта TE_ это луч между ENT и конечной точкой(конечную точку получаем трассировкой, на месте этой точки создаю временную ENT, на сотую долю сек. она и будет точкой прицеливания). И вот теперь, независимо от того, каким по иерархии является данный аттач, начальная точка всегда будет там где нужно, т.е. по центру(центру аттача).
Вот сам код. уже для SourcePawn'а:

PHP:
stock TE_SetupBeamEntPoint(int halo, int modelIndex, int frame, int frameRate, float life, float width, float endWidth, fadeLength, float amplitude, const colorArray[4], int speed, int flag, int startEntity, int endEntity){
    TE_Start("BeamEntPoint");
    TE_WriteNum("m_nHaloIndex", halo);                  
    TE_WriteNum("m_nModelIndex", modelIndex);
    TE_WriteNum("m_nStartFrame", frame);
    TE_WriteNum("m_nFrameRate", frameRate);
    TE_WriteFloat("m_fLife", life);
    TE_WriteFloat("m_fWidth", width);
    TE_WriteFloat("m_fEndWidth", endWidth);
    TE_WriteNum("m_nFadeLength", fadeLength);
    TE_WriteFloat("m_fAmplitude", amplitude);
    TE_WriteNum("r", colorArray[0]);
    TE_WriteNum("g", colorArray[1]);
    TE_WriteNum("b", colorArray[2]);
    TE_WriteNum("a", colorArray[3]);
    TE_WriteNum("m_nSpeed", speed);
    TE_WriteNum("m_nFlags", flag);
    TE_WriteNum("m_nStartEntity", startEntity);   // Начальная ENT
    TE_WriteNum("m_nEndEntity", endEntity);     // Конечная ENT
}

Ничего сложного, в принципе, нет. Отрисовка такая же как и для всех TE_. Повторюсь - работает неплохо. Как по мне - самая рабочая TE_.




--- Добавлено позже ---
Хочу сделать следы от танковых гусениц, на основе все тех-же TE_ от старого, доброго Amxx-Pawn.

PHP:
stock TE_SetupFootPrintDecal(const Float:vecOrigin[3],const Float:vecDirection[3], ent, index, materialType = 'C')
{
    TE_Start("Footprint Decal");
    TE_WriteVector("m_vecOrigin",vecOrigin);
    TE_WriteVector("m_vecDirection",vecDirection);
    TE_WriteNum("m_nEntity",ent);
    TE_WriteNum("m_nIndex",index);
    TE_WriteNum("m_chMaterialType",materialType);
}
Пока не хочет работать зараза. Ошибки не выдает, хоть показал бы что, было бы проще. Может быть кто имел дело с таким?
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
на месте этой точки создаю временную ENT, на сотую долю сек. она и будет точкой прицеливания
ну я так тоже делал
Только такую энтити делал постоянной для каждого игрока и просто перемещал её за взглядом.

Я вообще не вкурил как к аттачу модели что-то прикрепить. Меня именно этот вопрос больше всего интересует (в WeaponAttachmentAPI вообще ещё 1 энтити с той же моделью прикрепляется).

А временные энтити можно в нетпропах глянуть
--- Добавлено позже ---
А вообще есть специальная команда в SM: sm_dump_teprops
Вот результат из CSS
--- Добавлено позже ---
Хм, параметры правильные. Ты их точно себе отсылал через TE_Send, TE_SendToClient или TE_SendToAll?
 

Вложения

  • temp_entity_csgo.txt
    32.2 КБ · Просмотры: 6
  • temp_entity_css.txt
    31.5 КБ · Просмотры: 6
  • teprops_css.txt
    12.6 КБ · Просмотры: 3
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Когда создаешь 3D модель, в ней сразу устанавливаешь позиции аттачей(углы выставлять нужно сразу правильно что бы потом головняков не было). Их можно миллион наделать, они не весят ничего, зато пригодиться потом могут.
Я сразу, после создания модели, наделал аттачей на перспективу, для камеры, для ламп, выхлопных газов, для пулеметов и т.д. На скрине видны кости - они соединяются линиями от основной кости к дочерним, и аттачи(каждый отдельно).
base.jpg
Не знаю, можно или нет парентить непосредственно к костям, я пробовал - не получается. Только к аттачам.
Моделей цеплять можно столько, сколько захочешь. У каждой из этих моделей можно сделать анимации(как текстурами так и в максе задать), парентить, если по умолчанию(не указывать аттач) прицепится к основной(центральной кости), если указываешь свой аттач - соответственно цепляется именно к нему.
Но припарентенные модели будут уже дочерними к основной. Т.е. иерархия складывается такая, основная модель это основа (даже для записи всех моделей, их id в массив) а все остальные модели (пушки, пулеметы, лампы, и т.д. и т.п. ) это уже как бы вспомогательные, ими можно управлять(поворотами, анимациями и т.д.) но все основное, положение, скорость, и т.д. получать только с основной модели. Это вкратце.

Только такую энтити делал постоянной для каждого игрока и просто перемещал её за взглядом.
Зачем лишний раз грузить проц. расчетами. Создал на долю секунды, тогда когда нужно, и сразу же убил. Лишние ENT на серваке не нужны.
--- Добавлено позже ---
Ты их точно себе отсылал через TE_Send, TE_SendToClient или TE_SendToAll?

TE_SendToAll(); для всех
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
Зачем лишний раз грузить проц. расчетами. Создал на долю секунды, тогда когда нужно, и сразу же убил. Лишние ENT на серваке не нужны.
Я делал точку для лазерного прицела через env_sprite, а когда она не была нужна скрывал с помощью AcceptEntityInput(iEndEnt[client], "HideSprite");
Когда же точка была видна, то просто перемещал её с помощью TeleportEntity() (просто создавать каждый раз, кмк, всё равно медленнее).
А луч создавал через временную энтити BeamEnts, чтобы не передавать каждый раз координаты начальной (для начальной создавал энтити в начальной точке и прекреплял к оружию) и конечной точек.
Только почему-то не получалось скрывать точку от других игроков через SDKHook_SetTransmit.

Так вот: у меня не выходило правильно прикрепить начальную энтити к аттачменту.
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Так вот: у меня не выходило правильно прикрепить начальную энтити к аттачменту.
Это как раз то, о чем я и говорил вначале. Она у тебя прикреплялась правильно, но сам луч начинался с основной кости конечной иерархии твоей модели. Это такая особенность у временных ent TE_
Попробуй просто на место своей env_sprite создать, например, prop_dynamic_override, и ты увидишь что она прикрепится точно по центру нужного аттача, но вот сам луч все-равно пойдет от основной кости модели. Такая беда.

У тебя назначение конечной точки иное. Она должна быть постоянно. Не пойму зачем использовать SDKHook_SetTransmit. Какая необходимость?
Ты создал в конечной точке энтитю env_sprite.
PHP:
int ent_glow = CreateEntityByName("env_sprite");                          // спрайт
if (ent_glow> 0 && IsValidEntity(ent_glow)){
DispatchKeyValue(ent_glow, "spawnflags", "0");
DispatchKeyValue(ent_glow, "rendermode", "9");
DispatchKeyValue(ent_glow, "renderamt", "200");
DispatchKeyValue(ent_glow, "scale", "0.1");
DispatchKeyValue(ent_glow, "GlowProxySize", "0.5");
DispatchKeyValue(ent_glow, "renderfx", renderfx);
DispatchKeyValue(ent_glow, "rendercolor", "255 0 0");           //  цвет
DispatchKeyValue(ent_glow, "model", GLOW_SPRITE);       // модель спрайта
DispatchSpawn(ent_glow);
TeleportEntity(ent_glow, pos, NULL_VECTOR, NULL_VECTOR);
eGlowSprite[ent] = EntRefToEntIndex(EntIndexToEntRef(ent_glow));   // в глобал, для будущего управления созданным спрайтом (здесь ent это id основной модели)

char SpriteOutput[64];            // здесь выключаешь через инпуты-аутпуты самой энтити env_sprite
Format(SpriteOutput, sizeof(SpriteAddOutput), "OnUser1 !self:HideSprite:0:0.0:0");
SetVariantString(SpriteOutput);
AcceptEntityInput(ent_glow, "SpriteOutput");
AcceptEntityInput(ent_glow, "FireUser1");                   // скрываешь сам спрайт

/*И точно так-же включаешь спрайт, например через 2 секунды*/
Format(SpriteAddOutput, sizeof(SpriteAddOutput), "OnUser1 !self:ShowSprite:0:2.0:0");
SetVariantString(SpriteAddOutput);
AcceptEntityInput(eGlowSprite[ent],  "AddOutput");
AcceptEntityInput(eGlowSprite[ent],  "FireUser1");  // показываешь спрайт
Это я на своем примере показываю, но у тебя спрайт не должен поворачиваться к наблюдателю(игроку) лицом, он должен быть wolrd_decal, т.е декаль для брашей (мира), но принцип понятен, вариантов масса.
 
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Если ты имел в виду TE_SetupBeamPoints, то это и есть та самая проблемная TE_, о которой я и говорил. Она работает с координатами, но отследить координаты припарентенной ENT нереально, они будут неверными, так как начало эта TE_ начнет от центральной кости припарентенной модели, что бы ты ни делал.
Единственный вариант это совместить(сместить) центральную кость и нужный аттач. Но это далеко не всегда выполнимо, или удобно. Да и далеко не все могут работать с созданием 3d моделей, я уже не говорю о создании атачей к этим моделям и т.д.
--- Добавлено позже ---
чтобы показывать спрайт не всем игрокам
У тебя спрайт в глобале! Делай с ним что хочешь, показывай кому хочешь, он полностью тобой управляем. Естественно пока он живой.
--- Добавлено позже ---
Кстати, еще одна "больная" TE_ имя ей "BeamLaser" вроде и неплохая, имеет все свойства настоящего лазера, вроде даже и работает, но или я её не понимаю или она меня.
Я от её использования пока отказался.
--- Добавлено позже ---
так как начало эта TE_ начнет от центральной кости припарентенной модели

Я здесь неверно написал, поэтому, что бы не вводить людей в заблуждение хочу поправить сам себя.
Начало этой TE_ будет от центральной кости не припарентенной! ENT(модели или спрайт, или target_point и т.д.), а от центральной кости той модели к которой припарентенна эта самая ENT(моделька и т.д.).

Например, есть ствол пушки, с центральной костью с названием "bone_base".
У ствола этой пушки есть аттачь с названием, к примеру, "attach_start_point".
Теперь к этому аттачу цепляем любую ENT, назовем её "ent_start_point", для получения стартовой точки луча. Эта ent_start_point прилепится как положено, точно по центру и направлении углов аттача attach_start_point.
Так вот теперь, если попытаться получить координаты ent_start_point, координаты будут ошибочны, сам луч будет начинаться строго от центральной кости! ствола пушки bone_base. Хотя ent_start_point будет находиться там где ей и положено.
lesson.jpg
Один из вариантов - это просто центральную кость ствола пушки bone_base тупо сместить в координаты расположения аттача attach_start_point. Но все те, кто имел дело с 3D моделированием, прекрасно понимают насколько это больной, и практически неприемлемый вариант.
Второй вариант - это сам аттач
attach_start_point сместить в координаты центральной кости ствола пушки bone_base. Этот вариант тоже не ахти, так как расположение центральной кости не всегда подходит для этого.

Такой мини-урок получился. Конечно есть и другие варианты, но я пользуюсь своим, он проверен, работает на 100%.
Нет просто, нигде,
такого рода информации. Вот и решил немного поделиться.

Кстати, есть люди, которые работают только с игровыми персонажами, от них вообще никакой информации. Молчат как партизаны.

Но это уже явно не та тема, не для этого сайта. Хотя не мешало бы объединить их.
 
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Поработал с озвучкой. Это оказывается целая наука! Даже места не хватит что бы описать охват этого процесса. Раньше думал что это просто, а оказывается нет, это очень сложно!
Даже просто, сделать созданные звуки громкими, как родные в сурсе, это уже сложность представляет. Увеличение громкости на выходе даёт искажения звука.
Я делал раньше голос робота так:
1. питчем загрублял звук
2. искажал его при помощи фильтров
3. увеличивал выходную громкость при экспорте звука.
Сейчас понял что это просто детский лепет.

Программа "FL Studio" - обработка звука при помощи плагина vocodex. Принцип такой - голосом генерируется какая-то нота(инструмента или несколько инструментов сразу) или несколько нот одновременно. Долго рассказывать, но эффекты получаются просто потрясные, никакими простыми фильтрами этого никогда не добиться.
Потом для увеличения громкости звукового файла нужна нормализация этого звука, никогда не знал(даже представить не мог) что у звука тоже есть нормализация.

Понимаю сейчас D.J. как они работают, сколько у них проблем

 
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
@Grey83,
Это не проблема, любую могу сделать, абсолютно любую. Могу в фотозаде сам нарисовать, пока использую то что в инете попалось на глаза первым.
Есть мысль, сделать размер зависимым от расстояния, больше планов нет.
Просто пока мне это не интересно.
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
Есть мысль, сделать размер зависимым от расстояния
У меня они и так зависят от расстояния (на скринах как раз одна шкала вблизи, а 2 других - вдали).
И в комментариях к одному из скринов я указал ссыль на гитхаб, где у меня этот плагин и переделанные под него текстуры.
Как раз из исходника можешь взять код создания такой шкалы.
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Озвучка голоса Дрона. Добавил на озвучку анимированный значок радио-иконки(сделал в фошопе). Время отображения иконки = продолжительности звукового файла.

 
Последнее редактирование:

eXtensiON

Дизайнер
Сообщения
133
Реакции
87
Отличная задумка и реализация дронов!
 

-=HellFire=-

Kernel panic - not syncing: Fatal exception
Сообщения
1,394
Реакции
585
Ждем новый Battlefield из этого чуда :biggrin::dance3:
 
Сверху Снизу