Общая информация: PPE = postprocess Постпроцессы - это, грубо говоря, цвето-шумовые эффекты экрана актера, которые мы можем наблюдать в большинстве современных шутеров.
Примеры того, чем, вообще, может быть постпроцесс:
"Красный экран" при ранении ГГ
Помутнение экрана в состоянии алкогольного опьянения
Шум и "коричневый экран" от радиоактивного очага
ПНВ
"Зеленый экран" от химикатов
Эффект для сценок, когда ГГ открывает/закрывает глаза
"Белый экран" от свето-шумовой гранаты
"Черный экран" в разных технических моментах
Раздвоение в глазах ГГ
Скриптовые функции В lua_help.script можем найти следующие строки, которые соответствуют действиям с постпроцессами:
Код
function add_pp_effector(string, number, boolean); function remove_pp_effector(number); function set_pp_effector_factor(number, number, number); function set_pp_effector_factor(number, number);
Внимание! Эти движковые функции принадлежат к пространству level (namespace level). Это значит, что их нужно запускать в скриптах таким образом:
Теперь давайте разберем их предназначение и аргументы. В принципе, с первыми двумя все понятно: одна функция запускает эффект, а другая - останавливает.
Аргументыlevel.add_pp_effector
string - путь к ppe-файлу от папки anims.
number - временный story_id эффекта, любое произвольное число.
boolean - true/false - играть зациклено/не зациклено. К примеру, эффект ПНВ проигрывается закциклено, а контузия от удара - не зациклено. Пример:
number - тот самый временный story_id эффекта, который был запущен. Пример:
Код
level.remove_pp_effector(150) --отключаем ппе
Выходит, что мы задаем эффекту свой номер, а потом по этому номеру останавливаем эффект. Все просто, не так ли? С другими двумя функциями все чуть сложнее. По неведомым причинам, разрабы решили назвать две функции одинаково. Единственное их отличие - количество аргументов: 3 и 2. Давайте глянем в исходники движка:
Как видим, в самом движке одна функция называется set_pp_effector_factor (3 аргумента), а другая - set_pp_effector_factor2 (2 аргумента). Обе как бы задают интенсивность эффекту. Смотрим аргументы.
number (int) - story_id нашего уже запущенного эффекта.
number (float) - число от 0 до 1 (дроби, разумеется, поддерживаются), которые означает саму интенсивность.
number (float) - вероятно, скорость перехода от текущей интенсивности к новой, которая указана во втором аргументе. Число от 0 до 1. Параметр изучен мало.
У второй одноименной функции первые два аргумента совпадают, а третий отсутствует. Пример:
Хочу заметить, что разработчики пользовались функцией с двумя аргументами почти во всех случаях. Однако, есть исключение (см. sr_deimos.script, xr_detector.script).
Скриптовый метод создания/запуска эффекта Признаюсь, я этим методом никогда не пользовался, так как не вижу особого смысла. Тем не менее, знать о том, что такой существует - не лишнее. Скажем спасибо Маландринусу и другим ребятам, которые создали по этому делу справку: АМК
Процесс создания PPE-файла, статьи Да, это самое сложное для понимания.
Утилиты:
SDK Postprocess Editor. Увы, по нему уроков я не встречал. В будущем ждите разбор этого редактора от меня. Честно говоря, я хоть и научился там создавать практически юбой эффект, для меня там много чего до сих пор на уровне интуиции и методы тыка. Совет: просматривайте оригинальные файлы, смотрите на значения, смотрите градиенты постпроцессов, смотрите эффект в игре.
Файл gradient_map.psd из архивов концепт-документов Сталкер ЗП. Спасибо людям, которые слили этот архив документации. Вещь очень интересная. Она, кстати, принцип работы градиент-файлов для постпроцессов, которые лежат в textures/grad. Пока этим, однако, никто не воспользовался. В общем, качайте, смотрите, разбирайтесь. Отключайте все ппе-слои, кроме того, что нужен, и получите приблизительную картинку с ним из игры. Ссылка на файл.
Сообщение отредактировал FantomICW - Понедельник, 01.06.2015, 18:24
Платформа: All Автор: FantomICW [Смерти Вопреки] Инструменты:
Adobe Photoshop (у меня версия CC 2014)
X-Ray SDK 0.7
Файл для пробы градиента Введение Приветствую! Этот небольшой урок будет посвящен созданию градиента для файла PPE. Данный вопрос поднимался, как мне кажется, очень редко, так что мини-урок должен пригодиться. Сегодня мы также будем использовать файл для проверки градиентов из ресурсов документации для Сталкер ЗП. Перед тем, как начать урок, я также хотел бы, на всякий случай, сказать, что новый градиент можно создать на основе уже имеющихся в папке textures/grad. Звучит крайне очевидно, но мало ли Ладно, приступим. 1. Запускаем ФШ, можем сразу открывать файл для пробы градиентов. Далее создаем пустой документ с размерами 256x2 px.
2. Теперь переходим на панель слоев и создаем новый слой-градиент.
3. Зададим первоначальные настройки градиенту. "Стиль" - "Линейная", Угол - 0. После этого кликаем на поле цвета градиента.
4. Итак, можем регулировать градиент так, как пожелаем. Кликаем на квадратик, дальше на поле "Цвет", выбираем цвет. Регулируем ползунками прозрачность, интенсивность и прочее.
5. К примеру, у меня будет один из градиентов для токсических аномалий, мутно-зеленоватый. Градиент нужно добавить в список стандартных, если нам его нужно позже просмотреть в файле для пробы В таком случае, нажимаем на кнопку "Новый". В поле "Наборы" должна появиться превью-картинка нового элемента.
6. По сути, работа в ФШ на этом закончена. Осталось только сохранить и зарегистрировать текстуру в СДК (сделать ей thm-файл). Позже мы вернемся к ФШ для просмотра градиента. Сохраняем текстуру в папку editors/import формате tga32 bit, но прежде позаботьтесь, чтоб у текстуры был альфа-канал. Название желательно сделать grad_текстура. Запускаем Actor/Shader/Particle/Level Editor. Жмем Images-->Check new textures и начинаем настраивать текстуру:
"Format" - 32 bit (8:8:8:8).
Градиент - элемент худ-графики, так что мип-мапы и бампы отключаем. Нажимаем на "Ок". Текстура готова ко включению в постпроцесс.
7. Как уже было сказано, мы можем вернуться к превью градиента в ФШ. В файле-исходнике дублируем любой слой и два раза кликаем на "кружочек" градиента. Из списка выбираем наш градиент. Не забудьте также сделать слой видимым.
На этом все, спасибо за внимание!
Сообщение отредактировал FantomICW - Среда, 27.05.2015, 20:44
Платформа: по сути, универсально Автор:FantomICW [Смерти Вопреки], использован справочный материал от Malandrinus'а и ко Инструментарий:
X-Ray SDK 0.7 (Postprocess Editor)
Введение Итак, знакомьтесь: это Postprocess Editor, и здесь создаются PPE. В принципе, программа не очень сложная, но нужно немного посидеть над ней, чтобы уловить основные моменты, понять принцип работы. Для начала ознакомимся с общим интерфейсом.
Сверху - панель файла. Снизу - список вкладок, панель различных параметров, которые немного меняются (в зависимости от вкладки). По центру - график вкладки. Теперь давайте разбирать предназначение и параметры самих вкладок. Скриншоты, думаю, не нужны в этот раз.
Универсальные параметры/кнопки
+ - кнопка добавляет новый ключевой кадр. • - - кнопка удаляет выбранный кадр. • Clear - кнопка удаляет все кадры из списка. • Copy from - кнопка позволяет скопировать ки-фреймы (ключевые кадры...и да, произноситься именно "ки" а не "кей", если что ) из другого списка. При этом, стоить заметить, значения цвета не сохраняются. • Key Time (sec) - в поел можно выставить время выбранному кадру из списка. • RGB - значения цвета по схеме RGB. Напоминаю, сам цвет подбирается в палитре (нажмите на кнопку ниже).
Base color Заливает картинку полу-прозрачным основным цветом. Белый/черный отображает, как Add Color. Параметры: • Универсальные
Grey color Вкладка дополнительного серого цвета, которым можно "разбавить" основной цвет. Параметры: • Универсальные • Intensity - параметр интенсивности серого цвет, значение от 0 до 1
Duality Вкладка раздвоения экрана. Можем наблюдать такое в постпроцессе опьянения, к примеру. Параметры: • Универсальные, но без RGB • Duality-H - параметр раздвоения по горизонтали, значение от -1 до 1 • Duality-V - параметр раздвоения по вертикали, значение от -1 до 1 У последних двух параметров значение смещение берется, судя по всему, относительно экрана. Если ставим 0,5, то "копия изображения" сместится на половину экрана. Минусовое значение нужно для движения влево/вниз.
Noise Вкладка параметров шума. Шум наблюдаем во многих постэффектах, включая ПНВ и радиацию. Параметры: • Универсальные, но без RGB • Noise Intensity - интенсивность шума, значение от 0 до 1 • Noise Grain - размер зерна, значение от 0 до 1 • Noise FPS - частота "смены" шума. Только глаза не убейте, если большое значение выставите
Blur Вкладка размытия экрана. Наблюдаем все в тех же эффектах, когда ГГ "дают по голове". Параметры: • Универсальные • Intensity - интенсивность размытия, значение от 0 до 1
ColorMapper Вкладка для градиента постпроцесса. В ЗП многие эффекты на этом и юазируются. Параметры: • Универсальные, кроме RGB • Influence - непрозрачность ("влияние") градиента, значение от 0 до 1 • Поле для ввода названия текстуры градиента (обычно это grad/grad_текстура)
Первый урок закончен.
Сообщение отредактировал FantomICW - Воскресенье, 31.05.2015, 10:24
Введение Основы интерфейса усвоили, а значит можем прочитать пару PPE-файлов. Файлы берем из чистого ЗП. Поехали. Практика Давайте начнем с простого: постэффект обычного ПНВ. Открываем файл anims/nightvision_1.ppe. У него все вкладки пустые, кроме шума и градиента. Смотрим шум (Noise):
Анализируем: • Есть два ключевых кадра (0 сек. и 5 сек.) • И там, и там одинаковое значение для размера зерна и для интенсивности • И там, и там 25 ФПС Хорошо, теперь смотрим вкладку ColorMapper:
Видим, что ключевые кадры совпадают с шумом. Выставлен градиент. Кстати, особенность этой вкладки в том, что в поле вводится название градиента один раз для всех кадров. Теперь можем сделать вывод: имеем простой постэффект с цветным градиентом и средним шумом. Заметьте, что значение для шума совпадает в обоих кадрах (в нулевом и пятисекундном). Что это может значить? А значит это то, что постэффект сделан специально для зацикленного проигрывания. Возьмите себе на заметку, что для цикличного постпроцесса нужно сделать нулевой кадр и второй кадр с каким-то значением времени, где значения параметров совпадают. По такой же схеме работают и другие постпроцессы. К примеру, давайте откроем black.ppe. У него заполнена только вкладка Base Color:
Как видим, и в нулевом кадре, и в кадре 3-й секунды выставлен черный цвет. То есть изображение зациклено черное. Да, все логично. Давайте, напоследок, рассмотрим часть более динамичного постпроцесса - fade_in_out.ppe, у которого рабочая только вкладка Add Color. Смотрим: • На нулевом кадре установлен нейтральный цвет (по сути - никакого цвета). • По достижению постпроцессом 1-й секунды экран становится полностью черным. • На кадре 4-й секунды все тот же черный цвет. • Кадр 5-й секунды цвета не имеет, как и нулевой кадр. Вывод: через одну секунду после начала действие эффекта экран становится черным и остается таким в течении 3 секунд (4 - 1 = 3). Но уже на 5-й секунде чернота пропадает.
На этом "теоретическая практика" закончена.
Сообщение отредактировал FantomICW - Воскресенье, 31.05.2015, 13:15
Введение Сделаем два варианта постпроцесса: полу-прозрачный и непрозрачный. Суть такова: постпроцесс будет через каждый две секунды заливать экран очередным цветом радуги. При этом, красным (первым цветом) экран станет на 1-й секунде. Вспоминаем: Каждыйохотникжелаетзнать, гдесидитфазан. Практика: непрозрачный 1. В редакторе нажимаем на кнопку "New". Уже договорились, что постэффект будет переливаться цветами радуги, которых есть семь. Добавляем сюда еще нулевой кадр и финальный кадр, в целом выходит 9 кадров. Эффект полу-прозрачный, значит работаем с Add Color. 2. Тогда создаем нулевой кадр и в Key Time устанавливаем 0,00. 3. Далее создаем первый цветной кадр. Ему автоматически будет выставлено время 0,01. Меняем на 1 сек. Цвет ставим красный. Далее делаем второй цветной кадр, который отобразится через 2 секунды после первого, то есть ставим ему значение 3. Цвет у кадра будет оранжевый. Продолжаем так создавать кадры с разницей в две секунды. Тогда 7-й кадр должен оказаться на 13-й секунде. Делаем последний кадр с отсутствием цвета на 15-й.
Все, сохраняем постпроцесс.
Результат:
Практика: полу-прозрачный 1. Новый файл не создаем, а делаем эффект на основе уже готового. 2. Переходим на Base Color, с которым будем работать, и жмем на кнопку "Copy from"-->Выбираем Add Color. Итого мы получаем все те же ки-фреймы на нашей вкладке, но без цвета. 3. Цвет можете подбирать заново или же копировать вручную с Add Color. 4. Когда с цветом разобрались, на вкладке Add Color жмем "Clear", чтоб удалить из списка фреймы, которые нам на это вкладке не нужны. 5. Все, проверяем, сохраняем.
Результат:
Третий урок закончен.
Сообщение отредактировал FantomICW - Воскресенье, 31.05.2015, 14:00
Введение Вот мы и подошли к созданию сюжетного постпроцесса. Давайте сделаем "сценку" отравления, головокружения ГГ с потерей сознания. Практика
1. Предлагаю начать с цвета экрана. Пускай, экран будет закрашен в полу-прозрачный зеленый, как это принято в Сталкере для химических проблем ГГ (с точки зрения реализма, это абсурд, но ладно ). На Base Color делаем три поинта: • Нулевой без цвета. • 3-я секунда - цвет ближе к хаки. • 6-я секунда - более темный оттенок. Выходит, что с самого начала цвет экрана плавно станет тускло-зеленым, а потом потемнеет.
2. Далее разберемся с серым цветом и блуром...Переходим на Blur: • Нулевой кадр без цвета. • На 3-й секунде делаем Intensity0.8
Кстати, такие же значения автоматически появляются на вкладке Gray color.
3. Duality. Делаем кадры 0, 4, 6, 8, 10. Раздваиваться изображение начнет в переходе между 4 и 6. Ниже значения раздвоения будут показаны по такой схеме: Кадр - значение Duality-H - значение Duality-V
Раздвоение, как видите, будет в определенном участке симметричным (используем минус для симметрии).
4. Noise. Шум появится между 2-й и 4-й секундой, таким и останется. • На 0 и 2 ставим нулевую интенсивность, а размер зерна и ФПС - по одному. • На 4 и 10 ставим интенсивность 0,43, размер зерна - 1, а ФПС - 30.
5. Последнее - черный экран в конце эффекта. Используем Add Color. • На 0 и 9 цвета нет. • На 11 ставим черный.
На этом все
Результат:
Надеюсь, этот мини-курс вам помог. Удачи!
Сообщение отредактировал FantomICW - Воскресенье, 31.05.2015, 19:07
Общая информация: ANM = animation (анимация камеры) Анимки камеры - штуки не сложные, на самом деле. Тем не менее, их можно применять по-разному.
Примеры:
Любые шатания экрана.
Легкие движения экрана синхронно с анимками оружия.
Камера кат-сцены от первого лица.
Камера кат-сценки от третьего лица.
Основные скриптовые функции Функции из lua_help.script:
Код
function add_cam_effector(string, number, boolean, string); function add_cam_effector2(string, number, boolean, string, number); function remove_cam_effector(number);
Как и постпроцессы, анимации камеры принадлежат к пространству level, так что запускаем так:
Хорошо, переходим к разбору функций, аргументов. level.remove_cam_effector - тут все просто. А чем же отличаются level.add_cam_effector и level.add_cam_effector2? Дело в том, что анимация камеры может проигрываться либо от текущей позиции ГГ, либо по уже заданным глобальным координатам, которые записываются в anm во время создания полета камера в Level Editor. Так вот, первая функция проигрывает эффект от текущей позиции ГГ, а вторая - по координатам. Иными словами, если нам нужно запустить пошатывание ГГ, то берем первую функцию, а если у нас полет камеры или кат-сцена от первого лица в каком-то обозначенном месте (и нам важно сохранить соответствие координатам), то используем вторую. Кроме того, хочу заметить, что у второй функции появляется дополнительным аргумент в конце.
Аргументыlevel.add_cam_effector
string - путь к anm-файлу от папки anims.
number - временный story_id эффекта, любое произвольное число.
boolean - true/false - играть зациклено/не зациклено.
string - коллбек на окончание анимации камеры, очень интересная вещь. Пример:
Код
level.add_cam_effector("camera_effects\\fusker.anm", 29, false, "") --ГГ ударили прикладом
Как видите, если коллбек на окончание не нужен, то ставим аргумент "". Рассмотрим пример с коллбеком:
Функции xr_effects.script В xr_effects.script тоже есть функции для анимок, которые можно запускать через логику или скриптовым методом:
Код
function run_cam_effector(actor, npc, p) function stop_cam_effector(actor, npc, p) function run_cam_effector_global(actor, npc, p) function cam_effector_callback() --рабочая функция, коллбек на окончание для функций запуска, указанных выше
Если интересно, покопайтесь, посмотрите на аргументы функций. Пример запуска из скрипта показывать нет смысла - можно сразу запускать движковыми функциями.
sr_cutscene Всем квестерам известная схема логики тоже базируется на всех тех функциях, о которых мы говорили. И, кстати, на постэффектах тоже. Давайте посмотрим на саму схему в логике:
Разберем параметры: point и look - вейпоинты, на которых окажется ГГ к окончанию анимации камеры. global_cameffect (bool) - true/false, то есть используем level.add_cam_effector2 или level.add_cam_effector соответственно. pp_effector - постпроцесс во время кат-сцены. Путь от anims, окончание .ppe указывать не надо. cam_effector - файл anm, путь от anims/camera_effects. fov - угол обзора. Работает, если global_cameffect = true. enable_ui_on_end - true/false, включать или нет интерфейс после окончания камеры. outdoor - true/false. Интересный параметр. По сути, проверяет, происходит ли действие на улице. Если на улице и если ГГ во временных рамках 6.00-21.00, то поверх накладывается комплексный эффект brighten, который несколько осветляет общую картинку. Что такое комплексный эффектор, мы разберем позже. Со схемой почти все, но есть еще одна интересная штука: комплексная кат-сцена ака cam_effector_sets.script. Дело в том, что схема, перед тем, как запустить эффект-значение cam_effector, проверяет наличие одноименной таблицы в скрипте cam_effector_sets.script. Разумеется, в этом случае в значении никакого пути от camera_effects нет. Чтобы было понятнее, давайте приведу пример:
Анимку проигрываются по очереди. Параметры в таблице: anim - файл камеры, от anims/camera_effects. looped - true/false, зациклено ли. global_cameffect - как и в самой схеме параметр. enabled - кондлист (условие) проигрывания этой камеры и действие, которые выполняется (к примеру, выдается инфопорция). В общем, если хотите создать фильм на движке X-Ray, вот это вам в помощь . Подробнее по этой системе можете узнать в sr_cutscene.script.
Анимация камеры и анимации оружия Вы когда-нибудь замечали папку anims/camera_effects/weapons? Там лежат анимации камеры, которые синхронизируются с анимациями оружия. Если вы сделали новую анимацию камеры для оружия, то она будет воспроизводиться при двух выполненных условиях: 1. anm лежит в anims/camera_effects/weapons. 2. anm имеет название такое же, как и название самой анимации худ-модели из библиотеки omf/внутри самой модели.
Создания ANM-файла, статьи Почему-то многие пугаются создания камеры, хотя особых причин для этого нет. Да, не самое легкое. Не самое легкое в том плане, что без практики, фейлов и ошибок научиться сложно. Да-да, говорят иногда "философы", что учатся на собственных ошибках только дураки...Так вот, в этом случае - нифига. Только самому пробовать, ошибаться, исправлять, десяток разначинать заново. Зато потом спокойно создаешь самые сложные облеты камеры. Пробуйте, разбирайтесь.
Утилиты:
SDK Level Editor - основной способ.
3DS Max + Den Stash tools - тоже вполне рабочий способ. Спасибо Дену Сташу за плагин экспорта камеры в формате anm.
Вроде есть способ экспортировать камеру из 3DS Maya.
Создание анимации камеры в 3DS Max (не глобальный эффект)
Платформа: All Автор:FantomICW [Смерти Вопреки] Благодарность:Den Stash'у за скрипты для Макса Инструменты:
3DS Max
Скрипты Дена Сташа Введение Рассмотрим создание обычной анимации камеры в Максе. Анимка будет совсем простая - актер посмотрит вверх-вниз. Так как видео по скриптам и камере с канала Дениса было удалено, думаю, тутор не помешает. Практика 1. Для начала в 3DS Max создадим объект камеры и назначим ему тип Free. Рекомендуется также выставить FOV70 (приближенно к игровому).
2. Поставим камеру на сетку и для удобства переместим на нулевые координаты.
3. С самого начала камера будет повернута вниз. Поэтому нужно установить ей поворот на 90 по оси Х.
4. Начинаем анимировать. Устанавливаем режим Auto Key. Далее переводим ползунок анимации на 10-й фрейм, на котором и разворачиваем камеру так, чтоб она смотрела немного вверх. Давайте сразу определим, что между изначальной точкой камеры и ее разворотом вверх/вниз будет 10 фреймов. Таким образом, между. Верхней точкой и нижней точкой, в которую мы дальше опустим камеру, 20 фреймов.
5. Тогда на 30-м фрейме опускаем камеру так, чтобы смотрела вниз.
6. На 40-м фрейме возвращаем камеру в исходное положение (90 по Х).
7. Если нужно, можем просмотреть движение камеры от 1-го лица через Кнопка вида-->Cameras-->Наша камера. Если все устраивает, начинаем сохранять. Нажимаем на кнопку Time Configuration. В окошке выставляем End Time40.
8. Напоследок, экспортируем файл скриптом. Анимация простая, так что сохранять можно каждые 5 фреймов. Если сохранять каждый 1 фрейм, размер файла должен увеличиться. В принципе, такое больше нужно для анимок, где требуется "ювелирная точность". Ставим флажок напротив Camera Mode и экспортируем файл. Потом смотрим, что вышло
Результат
Удачи!
Сообщение отредактировал FantomICW - Понедельник, 01.06.2015, 21:48
Создание HUD-анимации камеры в 3DS Max (не глобальный эффект)
Платформа: All Автор:FantomICW [Смерти Вопреки] Инструменты:
SDK Level Editor Введение Рассмотрим создание обычной анимации камеры в СДК. Я не буду особо зацикливаться на каждой кнопочке, так как, спасибо ее создателям, есть вот эта статья: http://stalkerin.gameru.net/wiki....тсцены) Простите, что посылаю вас так далеко, но надеюсь на ваше понимание: в какой-то момент справку писать однозначно надоедает. В общем, читаем статью, а потом здесь закрепляем материал. Схема примерно такая же, как и в Максе. В этот раз актер будет поворачиваться вправо/влево. Практика 1. Установим объект editor/camera на нулевых координатах. Выставим Motionable и Auto Key.
2. После этого передвигаем камеру на начальную позицию (я просто поднял чуть выше). Теперь уже можно выставить время Current Frame (сколько камера будет двигаться до 2-го поинта). Важно! Только в таком порядке все делаем, иначе камера может заглючить и переместиться куда-то далеко. Кстати, двигаться камера будет до 2-го фрейма 2 секунды Должно сейчас быть 2 ключа, а время окончания должно быть равно текущему времени.
3.Оборачиваем камеру вправо с ее стороны/влево с нашей стороны.
4. В Current Frame вбиваем 6,000. То есть к 6-й секунде камера повернется уже в другую сторону (к третьему поинту).
5. Разворачиваем камеру в другую сторону. Далее меняем 6,000 на 8,000.
6. Возвращаем камеру на исходную позицию (4-й фрейм). Все, экспорт.
Результат
На этом все. Успехов!
Сообщение отредактировал FantomICW - Понедельник, 01.06.2015, 22:52
Общая информация: Вот мы и подошли к кульминации всей статьи. Комплексный эффектор - это комплекс, состоящий из anm и ppe.
Что это может быть:
Шатаемся, все двоится
Трясемся, контрик взял за мозги
Секции эффекторов Находятся они в файле configs/misc/postprocess.ltx (хотя там явно не только постпроцессы должны быть). GSC использовали комплексные эффекторы бестолково: постпроцессы оставляли постпроцессами, а камеры - камерами. В чем прикол - непонятно. Может, им удобней было вызывать не файлы, а именно секции. Ладно, давайте разбирать параметры. А нет, сначала покажу, какие эффекторы - косячные:
Они по какой-то другой системе делались. А теперь параметры:
Код
[complex_effector] pp_eff_cyclic = 1 pp_eff_overlap = true pp_eff_name = something.ppe radius_min = 0.7 ;не работает radius_max = 1.0 ;не работает cam_eff_cyclic = 0 cam_eff_name = camera_effects\shell_shock.anm cam_eff_hud_affect = true ;судя по всему, не рабочий snd = characters_voice\human_01\dolg\help\wounded_heavy\help_8 ;не работает
Подробно о рабочих параметрах: pp_eff_cyclic - 0/1, играть постпроцесс незацикленно/зацикленно. pp_eff_overlap - true/false, перекрытие есть/нет. Что это за перекрытие мне пока понять не удалось. Видимо, что-то с отображением при цикличности. pp_eff_name - постпроцесс, расширение указываем, путь от anims. cam_eff_cyclic - 0/1, играть анимацию незацикленно/зацикленно. cam_eff_name - анимация камеры, расширение указываем, путь от anims.
Основные скриптовые функции Функции из lua_help.script:
Код
function add_complex_effector(string, number); function remove_complex_effector(number);
Как видим, все просто, как никогда. Да, тоже пространство level.
Аргументыlevel.add_complex_effector
string - секция эффектора.
number - временный story_id эффекта, любое произвольное число.
number - временный story_id эффекта, любое произвольное число.
Код
level.add_complex_effector(9789)
Функции xr_effects.script Да, есть такие. Названы, однако, как функции для постпроцессов
Код
function run_postprocess(actor, npc, p) if (p[1]) then if(system_ini():section_exist(p[1])) then local num = 2000 + math.random(100) if(p[2] and type(p[2]) == "number" and p[2]>0) then num = p[2] end printf("adding complex effector [%s], id [%s], from [%s]", p[1], tostring(p[2]), tostring(npc:name())) level.add_complex_effector(p[1], num) else abort("Complex effector section is no set! [%s]", tostring(p[1])) end end end
function stop_postprocess(actor, npc, p) if(p[1] and type(p[1]) == "number" and p[1]>0) then printf("removing complex effector id [%s] from [%s]", tostring(p[1]), tostring(npc:name())) level.remove_complex_effector(p[1]) end end
Аргументы такие же, как и в основных функциях.
Создание complex effector Отдельный урок в отдельном спойлере тут не нужен, думаю. Давайте сделаем что-то:
Общая информация: После кульминации получаем бонус xrdemo - формат, который почему-то многие модмейкеры обходят стороной, хотя он позволяет легко делать облеты камеры. Правда, немного особенные: камера в конце летит обратно к ГГ.
Что это может быть:
Любой полет камеры demo_record
Как это сделать? Легко. Прямо в игре вводим в консоли команду:
Код
demo_record название_записи
Летаем, пробелом (Space) отмечаем ключевые точки. В конце жмем Esc. Получаем в profiles/savedgames файл название_записи.xrdemo. Теперь его можно смотреть В консоли пишем:
Код
demo_play название_записи
Скриптовые функции? Действительно, а что, если нужно запустить скриптом? Функции отдельной не существует...Но подождите, мы ведь можем обращаться к консоли через скрипты! В общем, ребята, дарю вам свою функцию:
Код
function run_xrdemo(xrdemo) if xrdemo ~= nil then get_console():execute("demo_play "..xrdemo) end end