Анимация для сталкера своими руками

Введение в 3D-моделирование для S.T.A.L.K.E.R. Часть 2 Анимация

Материал из S.T.A.L.K.E.R. Inside Wiki

В этой статье я изложу минимум информации, необходимой для анимации нашего артефакта.

Прежде чем начать, хочу отметить, что для корректного экспорта анимации необходимо установить версию плагина, соответствующую версии СДК. (Для ЗП это 0.7 версия СДК, соответственно подойдут плагины для ЧН\ЗП.)

Привязка.

Ещё пара слов о привязке(речь идёт о работе в Максе и модификаторе Physics) 1.Чтобы отладить привязку, перемещаем все кости инструментом Select and Rotate (потом проще будет возвращать кости к начальному положению). Смотрим, какие вертексы остались на месте или сдвинулись не туда, куда нам нужно. Искажения будут видны сразу. Прямо в таком положении проводим корректировку привязки. Если вертекс в «квадратной рамке» (мы уже нажали Lock Assigment) ,то сперва нужно отвязать его , нажав Unlock Assigment , а затем через Assign to Link и Lock Assigment переназначить вертекс к другой кости.

2.Закончив отладку привязки, нужно вернуть кости в первоначальное положение. Для этого берём инструмент Select and Rotate и выставляем нули в поля внизу (это поля X Y Z) для каждой кости. Тем самым мы выровняем кости относительно точки отсчёта координат. Любое изменение, соответственно, вводимое через эти три поля , рассчитывается по отношению к точке отсчёта координат. Манипуляции мышью с осями в окнах проекции рассчитываются относительно родительской кости (предыдущей). Изменения в полях полностью сбивают все настройки, сделанные через манипуляции с осями.

Этим же способом надо будет вернуть все кости в первоначальное положение в конце анимации, чтобы она корректно повторялась.

3.В ходе работы над статьёй заметил интересную особенность. Первая кость экспортируется в СДК без привязки к ней шейдеров.

4. С помощью кнопки Select by Link можно выбирать все вертексы, привязанные к кости. Жмём на кнопку и на кость. Это может понадобиться, если нужно быстро изменить привязку либо проверить, какие вертексы ещё не привязаны(они автоматом помечаются синим цветом).

Анимация.

Жмём внизу экрана кнопку Autokey. Теперь любое изменение положения костей будет отмечаться на ползунке фреймов(кадров, по умолчанию их 100) ключом анимации. В одной точке ползунка можно изменить любое количество костей. На первом кадре лучше ничего не менять. Тащим ползунок на 15 , к примеру. Изменяем положение костей. Должно появиться два ключа- на первом кадре и 15. Играем с ползунком и костями, пока не надоест. Лучше использовать инструмент Select and Rotate. Ближе к 90 кадру лучше начать приводить кости в начальное положение. 100 кадр оптимально сделать таким же , как и первый. Анимации рутовой кости фактически игнорируются игрой. Если мы крутим её вокруг своей оси(крутится и весь арт), задираем в любую сторону, в игре этого не видно. В моём примере с цепью колец для имитации движения первого кольца нужно было повернуть его(первую кость) на 30 градусов, например, а затем вторую кость на 30 градусов в обратную сторону. Для экспорта анимации жмём Export Motion и сохраняем её под именем idle.skl –дефолтная анимка артефактов. Возможно название не важно. Имеем в виду, что если мы доводили до ума привязку, то нужно ещё раз экспортировать и модель.

В СДК настраиваем сперва модель, шейдеры и текстуры, затем кости. После жмём вкладку Motions => Append. Выбираем нашу анимку, читаем лог.

Для изменения скорости проигрывания анимации в игре изменяем параметр Speed.

Stop at end заставит анимацию воспроизвестись только один раз.

Для просмотра анимации в сдк нужно: 1. Ставим галочку напротив пункта Realtime в меню Options в левом нижнем углу СДК. 2. Переключаемся на режим Engine. Справа на панели. 3. Выделяем нашу анимку во вкладке Motions.

Или выбираем анимку с выполненным пунктом 1 и жмём Play.

Источник

Анимация для сталкера своими руками

Анимации NPC
Материал из S.T.A.L.K.E.R. Inside Wiki.
Перейти к: навигация, поиск
Недавно решил поэкспериментировать с анимками НПС, и теперь выкладываю результаты моих опытов над «людьми». Разумеется, опытные модмейкеры все это давно знают – поэтому материал предназначен для новичков, которые еще не освоили как прописывать неписям разные прикольные анимки, а заодно и озвучку через логику. Все анимки взяты из файла state_lib. script. Анимки, которые имеются в движке, но не вписаны в указанный файл, не рассматриваются. Это тема для отдельной статьи. Озвучка взята из файла sound_script (папка misc). Конечно, хотелось использовать и звуковые темы не вписанные в этот файл, но имеющиеся в папке sounds — но с этим еще надо разобраться.

[править]Часть первая.
Вся изложенная ниже схема является единым целым и ее можно ставить в ltx –ный файл логики любому вашему НПС целиком. Она будет зациклена и повторяться по кругу если кое-где поставить другие варианты перехода от одной ремарки к другой.

Читайте также:  Зерносклад своими руками как построить

[logic]
active = remark@base
danger = danger_condition
meet = meet

[remark@base]
anim = hello_wpn
no_move = true
target = actor
meet = meet
on_actor_dist_le = 2| remark@sit

[meet]
meet_state = 10|salut@esc_bridge_soldiers| 5|salut_free@esc_lager_killer
meet_state_wpn = 10|ward@cit_base_guard_talk_to_actor2| 5|probe_2@gar_bandits_seryi
victim = 10|actor
victim_wpn = 10|actor
use = true
use_wpn = true
meet_dialog = escape_lager_guard_start_dialog В базовой ремарке мой чувак использует анимку Волка — hello_wpn – одной рукой машет ГГ, другой держит ствол. Это начальная анимка, которая будет отрабатываться НПС, пока ГГ не подойдет на дистанцию встречи. В секции meet задается схема реагирования НПС при подходе к нему эктора. В строчке meet_state – реакция при подходе безоружного ГГ. На расстоянии 10 метров НПС отдает честь, затем встает в позицию «смирно» — руки по швам. Это анимка salut. Ближе 5 метров – тоже самое, дальше переходит в позицию «вольно». Это анимка salut_free. В секции meet можно задавать и то, что НПС будет базарить при виде эктора. В моей схеме: «чего стоишь сталкер, подходи, будем разговаривать» (esc_bridge_soldiers) отдавая салют, и на второй дистанции — «разбежались сосунки и т.д». (esc_lager_killer) В строчке meet_state_wpn — реакция НПС если эктор с пушкой в руках. У меня в этой схеме он встает в позу ward – руки за спиной, голова наклонена вниз. Словом поза тюремщика или надсмотрщика (ward примерно так и переводится). В этой позе НПС на дистанции ближе 10 метров орет «повторяю для тупых — отошел к дальней стене камеры…» (cit_base_guard_talk_to_actor2), а если ГГ подойдет еще ближе — «ты щас сдохнешь падла, понял…» (gar_bandits_seryi) и еще несколько рандомных фраз, которые заданы звуковой темой gar_bandits_seryi. К начальной анимке также можно добавлять любую звуковую тему через строчку snd. В данной ремарке ее нет.

Переходим к следующей схеме. Так как все эти схему у меня завязаны вместе, то переход ко второй ремарке произойдет, когда ГГ подойдет к НПС на дистанцию ближе двух метров. Прописано этой в строчке on_actor_dist_le = 2| remark@sit

[remark@sit]
anim = sit_ass
snd = mil_guard_to_max
no_move = true
target = actor
meet = no_meet
;on_actor_dist_le = 2| remark@raciya
;on_timer = 30000| remark@ raciya
on_signal = sound_end| remark@raciya
danger = danger_condition
Итак, что делает НПС в этой ремарке. Сидит на заднице — sit_ass, орет — mil_guard_to_max – «макс, у нас тут проблема на хуторе нарисовалась, собирай народ…» В секции meet прописано отсутствие встречи, так как задано no_meet . Так что разговаривать с ГГ непись не будет. После отработки заданной звуковой темы идет переход к к ремарке remark@ raciya. Сделано это через строчку on_signal = sound_end| remark@raciya. Переведу: на сигнал «конец звуковой темы» переходим к схеме remark@raciya.

[remark@raciya]
anim = choose
snd = bar_arena_public
no_move = true
target = actor
meet = meet@raciya
on_timer = 120000| remark@work
;on_actor_dist_ge = 35| remark@work
danger = danger_condition

[meet@raciya]
meet_state = 7|binocular@val_escort_guards| 5|guard_rac@mil_pavlik_to_ara
meet_state_wpn = 7|hide_rac@mil_ara_ambush
victim = 7|actor
victim_wpn = 7|actor
use = true
use_wpn = true
meet_dialog = escape_lager_guard_start_dialogАнимка choose – ГГ что-то высматривает: оглядывается по сторонам, прикладывает руку ко лбу, так же как это делам мы, когда смотрим вдаль против солнца. Звуковая тема – что то там из реплик на арене. При встрече – смотрит в бинокль (если он у него есть) и издевательски базарит — «скоро ты будешь работать обедом для мутантов» (в этой теме реплик несколько). На 5 метрах достает рацию (если есть) — анимка guard_rac и базарит реплики из темы предателя Павлика на милитари «все чисто можете подходить». При угрозе стволом — анимка hide_rac («сидит с рацией»), базар — «это засада, уходим» Через 120 секунд — переход к следующей ремарке: on_timer = 120000| remark@work

[remark@work]
anim = caution
no_move = true
snd = mil_max_before_collect
target = actor
on_timer = 30000| remark@work2
meet = no_meet
danger = danger_conditionАнимка caution – ГГ слегка согнувшись, что-то внимательно высматривает на земле, руки прикладывает к коленям. А затем радостно сообщает — «ребята у нас появилась работа». Видимо, что-то высмотрел интересное. Через 30 секунд — снова переход.

[remark@work2]
anim = search
no_move = true
snd = mil_collect_phrase3
target = actor
on_timer = 30000| remark@zombied
meet = no_meet
danger = danger_conditionАнимка search — поиск, только более развернутый. ГГ встает на колени или на корточки и начинает что-то искать. Что он при этом произносит – узнаете, когда послушаете. Через 30 секунд переход к схеме зомби.

[remark@zombied]
anim = trans_zombied
snd = pri_followers_leader_phrase1_1
no_move = true
target = actor
on_timer = 60000| remark@wounded
meet = meet@zombied
danger = danger_condition

[meet@zombied]
meet_state = 5|trans_0@hail
meet_state_wpn = 5|trans_1@hail
victim = 5|actor
victim_wpn = 5|actor
use = true
use_wpn = true
meet_dialog = escape_lager_guard_start_dialogАнимка trans_zombied — падает на колени, головой двигает вверх-вниз. trans_1 — также стоит на коленях, только головой вращает по кругу. trans_0 – то же самое, только более энергичней. Или наоборот — извиняюсь если перепутал.

Схема раненый. Тут все понятно.

Читайте также:  Загрузочный шнек для зерна своими руками

[remark@wounded]
anim = wounded_heavy_3
snd = help_heavy
target = actor
meet = no_meet
on_timer = 30000| remark@dinner
danger = danger_condition
wounded_heavy_3 – это анимка тяжелораненого. (есть еще и другие анимки раненого). Чувак скрючившись, грохнется на землю. Но на ней не остается, а тут же встает и бежит в сторону в денжере. Что и понятно – здоровье то у него норм. Остальные неписи видевшие как чувак упал, так же срываются в денжере с места. Ищут того, кто «стрелял». Не удивляйтесь, но так они запрограммированы.

[remark@dinner]
anim = sit_knee
no_move = true
target = actor
meet = meet@dinner
danger = danger_condition
on_actor_dist_ge = 15| remark@dynamite

[meet@dinner]
meet_state = 5|eat_bread@wait| 3|eat_energy@wait
meet_state_wpn = 5|eat_kolbasa@wait| 3|eat_vodka@val_escort_dead
victim = 8|actor
victim_wpn = 8|actor
use = true
use_wpn = true
meet_dialog = escape_lager_guard_start_dialogsit_knee — чувак сидит на заднице, опираясь на руку. eat_bread, eat_kolbasa, eat_energy, eat_vodka — тут я думаю ничего объяснять не надо. Чувак хавает и пьет. Пригубив водки, произносит – «пусть земля тебе будет пухом» При отходе эктора на дистанцию больше 15 метров — переход к схеме динамит. Звуковая тема wait – это пауза, в которой непись ничего не говорит.

[remark@dynamite]
anim = dynamite
no_move = true
target = actor
meet = no_meet
on_timer = 30000| remark@claim
danger = danger_conditiondynamite – закладка динамита. Как это выглядит – помните долговца на милитари у стены с динамитом?

[remark@claim]
anim = claim
snd = esc_wolf_thanks
target = actor
meet = meet@claim
danger = danger_condition
on_timer = 60000| remark@story
Анимка claim — НПС подзывает ГГ рукой. snd = esc_wolf_thanks — здесь НПС произносит фразу волка: «меченый теперь тебе проход в лагерь открыт, подходи».

[meet@claim]
meet_state = 7|refuse@mil_collect_phrase5| 5|probe_2@mil_collect_phrase6
meet_state_wpn = 7|backoff@gar_dm_bandit_demand
victim = 7|actor
victim_wpn = 7|actor
use = true
use_wpn = true
meet_dialog = escape_lager_guard_start_dialogАнимка refuse — непись пожимает плечами и произносит mil_collect_phrase5 — «не срать». probe_2 — судя по сопровождающим ее звукам (независимо от прописанной мной звуковой темы) – это анимка Круглова (его манипуляции с прибором, а может Сахарова — впрочем, это не важно). Если у вашего НПС будет в руках оружие — то смотреться она будет куда интереснее, так как выглядит будто непись проверяет свой ствол, совершая массу интересных движений. Фраза mil_collect_phrase6 — «опа – с нами новое мясо».

backoff — обычная анимка. Непись начинает махать стволом в разные стороны – типа убери ствол, меченый. Фраза — gar_dm_bandit_demand — «бабки артефакты гони», «ты че козел не врубаешься», «гони бабло или бошку отстрелим». Так как тема рандомная (с окончанием rnd в имени темы в файле sound_script – то и фраз несколько)

[remark@story]
anim = mode_shlem
no_move = true
target = actor
meet = meet@story
danger = danger_condition
on_actor_dist_ge = 30| %+passage_to_story_end%
on_info = <+passage_to_story_end>remark@story_end

[meet@story]
meet_state = 10|probe@wait| 5|probe_1@hail
meet_state_wpn = 10|probe_2@wait| 5|suicide@mil_crazy
victim = 10|actor
victim_wpn = 10|actor
use = true
use_wpn = true
meet_dialog = escape_lager_guard_start_dialog
mode_shlem — анимка то ли Круглова, то ли Сахарова. Непись будет что то вертеть в руках. probe_1 – тоже самое что и probe_2 , только здесь он плечами вроде бы не дергает. suicide — самоубийство. Советую посмотреть – тем более с озвучкой mil_crazy. probe — укороченный вариант probe_2 и probe_1

[remark@story_end]
anim = probe_3
no_move = true
snd = agr_doctor_1
target = actor
on_signal = sound_end| remark@base
;on_timer = 180000| remark@ base
meet = no_meet
danger = danger_condition

[danger_condition]
ignore_distance = 10probe_3 — интересная анимка (похоже что кругловская)- чувак срывается с места в панике, затем сгибается как будто от боли, хватается за голову. agr_doctor_1 — базар доктора в тайнике стрелка.

Теперь поясню строчки

on_actor_dist_ge = 30| %+passage_to_story_end%
on_info = <+passage_to_story_end>remark@story_endКогда эктор отойдет от НПС дальше чем 30 метров, ГГ выдается инфопоршень passage_to_story_end. После его получения — on_info — произойдет переход к базовой ремарке. Сам инфопоршень необходимо регистрировать в соответствующих файлах. Так как мой НПС находится на кордоне, то поршень я сунул в файл info_l01escape. Сообственно инфопоршень в строчке on_actor_dist_ge писать не обязательно(я его использовал только для примера) — можно просто поставить имя следующей ремарки — и в нужный момент произойдет переход. Но инфопоршень может понадобиться для других случаев.

Как я уже говорил в начале, схему можно сделать полностью зацикленной. Нужно лишь в тех блоках, где идет переход к следующей схеме через on_signal поставить таймер или дистанцию. Почему так — не знаю. Но у меня по второму кругу схема стопорилась на тех блоках, где шел переход через on_signal = sound_end|. По таймеру же все прекрасно крутится. Схема из второй части — как раз зацикленная.

P.S. : Кажется понял почему у меня стопорилась схема при использовании перехода on_signal = sound_end|. Дело в том, что если в имени звука, по завершении которого схема должна перейти к новому блоку стоит флажок seq, то он вроде как отыграется только один раз (если в этой теме нет дополнительных реплик). Следовательно по второму кругу он просто не будет срабатывать, а значит и схема застопорится. Так что для этого нужно ставить звук в имени которого в файле sound_script есть флажок rnd. Тема mil_guard_to_max как раз с флажком seq (и реплика только одна — без вариантов). Потому здесь (в схеме sit) она и будет стопориться на втором круге, если не заменить тему на другую. Но это еще надо проверить. Закоментированные строчки — пред которыми стоит ; — может смело выкидывать — это остатки проб разных вариантов.

Читайте также:  Как сделать опалубку под баню своими руками

[править]Часть вторая.
Еще одна схема. На этот раз в нее добавлены еще постэффекты.

[logic]
active = remark@base
danger = danger_condition
meet = meet

[remark@base]
anim = hello_wpn
no_move = true
target = actor
meet = meet
on_actor_dist_le = 2| remark@punch
danger = danger_condition С первой ремаркой все понятно. Переход ко второй на дистанции ближе 2 метров.

[remark@punch]
anim = punch
snd = cit_jail_guard_sneer
meet = meet@punch
target = actor
on_signal = sound_end| %=run_cam_effector(fatigue)%
on_timer = 60000| remark@doctor_wakeup %=run_postprocess(deadcity_wake:1777:false)%
danger = danger_condition

[meet@punch]
meet_state = 5|hide_s_left@wait| 4|hide_s_right@wait
meet_state_wpn = 5|backoff2@threat_back
victim = 10|actor
victim_wpn = 10|actor
use = true
use_wpn = true
meet_dialog = escape_lager_guard_start_dialogpunch– анимка удара рукой (или прикладом). Так как я не специалист по боксу, то не скажу точно как именно называется этот удар с правой в челюсть. Если поставите ее в meet_state_wpn на дистанции 2 метра — ГГ получит реальный удар в морду прикладом ствола. Так как я эксперементировал на своем торговце — то он (будучи безоружным) бил чисто кулаком. А если вместо запуска анимации камеры %=run_cam_effector(fatigue)% поставите запуск функции %=killactor%, то НПС кинется вас убивать.

hide_s_left и hide_s_right — непись присядет с разворотом ствола вправо или влево. backoff2 — более веселая анимка backoff. НПС покажет ГГ что-то вроде фака, перед тем как помахать стволом и при этом скажет что-то весьма нелицеприятное. %=run_cam_effector(fatigue)% — это вызов анимации камеры fatigue из папки anims. Земля уйдет из под ног ГГ. Ненадолго. Сработает сразу же после окончания фразы cit_jail_guard_sneer. А ровно через минуту от начала работы схемы – запуск постпроцесса %=run_postprocess(deadcity_wake:1777:false)% и переход к следующей схеме.

deadcity_wake – это постпроцесс, который должен был использоваться в Мертвом городе, если бы разрабы МГ все таки доделали. Если не видели — обязательно посмотрите.Сначала черный экран, затем прояснение с раздвоением картинки и красным фоном.

В следующей схеме идет продолжение постпроцесса – первые 15 секунд. Потом его остановка: on_timer = 15000| %=stop_postprocess(1777)%.

[remark@doctor_wakeup]
anim = doctor_wakeup
snd = cit_doctor_start_dlg
meet = meet@doctor_wakeup
target = actor
on_timer = 15000| %=stop_postprocess(1777)%
on_timer2 = 180000| remark@prisoner
danger = danger_condition

[meet@doctor_wakeup]
meet_state = 3|sleep@cit_jail_guard_sleep| 2|sleep_sit@wait
meet_state_wpn = 3|wounded_zombie@wait
victim = 10|actor
victim_wpn = 10|actor
use = true
use_wpn = true
meet_dialog = escape_lager_guard_start_dialogНачальная анимация — doctor_wakeup – доктор в мертвом городе. НПС склонится вниз – как будто над чьим то телом (по задумке – над меченым) и начнет базарить. Но совсем не то, что стоит у меня в строчке snd. Видимо, данная анимка завязана со звуком, и иначе не идет. Фразу прописанную мною — cit_doctor_start_dlg – нпс произнесет потом. Обе озвучки длинные – та, что идет с анимкой – монолог доктора в подземелье агропрома в тайнике Стрелка – типа, «что ж ты меченый в растяжку полез, сам же придумал эту хрень…» Моя озвучка — cit_doctor_start_dlg – неиспользованный монолог доктора в мертвом городе. Через 180 секунд – завершение схемы и переход к следующей.

[remark@prisoner]
anim = prisoner
snd = agr_krot_fear
meet = meet@prisoner
target = actor
on_timer = 60000| remark@base
danger = danger_condition

[meet@prisoner]
meet_state = 5|help_me@gar_dm_newbie_no_money
meet_state_wpn = 5|hands_up@agr_dont_shoot
victim = 10|actor
victim_wpn = 10|actor
use = true
use_wpn = true
meet_dialog = escape_lager_guard_start_dialog

[danger_condition]
ignore_distance = 10
Анимка – prisoner – пленный. Помните Шустрого у бандитов? Вот это она и есть. Фраза — agr_krot_fear – не смотря на то, что в названии звуковой темы имя Крота, орет ее Шустрый: типа братцы я тут, спасите.

help_me — машет рукой сидя на одном колене и орет, что у него «нет денег» — gar_dm_newbie_no_money . hands_up — руки кверху и орет «не убивай дяденька» (или типа того) — agr_dont_shoot.

Через 60 секунд возврат к базовой ремарке.

[править]Часть третья.
В файле state_lib – большая библиотека анимок. Я успел попробовать только часть. У одного бармена их 12. Правда, из пяти опробованных мной сработала только одна bar_sleep — НПС положит голову на руки сложенные перед лицом и будет спать стоя.

Анимки — barman_talk_freу, barman_shock, barman_wait_danger, barman_walk_danger — никакого эффекта не дали. Видимо, они работают только на бармене. Остальные пробуйте сами.

Анимка psy_pain – пораженный пси-излучением. Чувак сядет на колени, начнет трясти головой и бить себе руками по голове.

psycho_pain – вроде бы тоже самое, только чувак обхватывает голову руками и так сидит.

Анимки psy_shoot, psy_armed, psycho_pain, psycho_shoot– пока остаются на стадии исследования. Так как с ними либо глючит, либо вылетает.

Источник

Оцените статью