Graff46 598 Опубликовано 24 Июля 2021 Автор: FantomICW Источник (архивная версия, браузер может ругаться): http://old.ap-pro.ru/forum/116-10860-1 Скрытый текст Общая информация: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);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, number, boolean); level.remove_pp_effector(number); level.set_pp_effector_factor(number, number, number); level.set_pp_effector_factor(number, number); Теперь давайте разберем их предназначение и аргументы. В принципе, с первыми двумя все понятно: одна функция запускает эффект, а другая - останавливает.Аргументы level.add_pp_effector string - путь к ppe-файлу от папки anims. number - временный story_id эффекта, любое произвольное число. boolean - true/false - играть зациклено/не зациклено. К примеру, эффект ПНВ проигрывается закциклено, а контузия от удара - не зациклено. Пример: level.add_pp_effector("radiation.ppe", 150, true) --запускаем ппе радиации Аргументы level.remove_pp_effector number - тот самый временный story_id эффекта, который был запущен. Пример: level.remove_pp_effector(150) --отключаем ппе Выходит, что мы задаем эффекту свой номер, а потом по этому номеру останавливаем эффект. Все просто, не так ли? С другими двумя функциями все чуть сложнее. По неведомым причинам, разрабы решили назвать две функции одинаково. Единственное их отличие - количество аргументов: 3 и 2. Давайте глянем в исходники движка: def("set_pp_effector_factor", &set_pp_effector_factor), def("set_pp_effector_factor", &set_pp_effector_factor2), Как видим, в самом движке одна функция называется set_pp_effector_factor (3 аргумента), а другая - set_pp_effector_factor2 (2 аргумента). Обе как бы задают интенсивность эффекту. Смотрим аргументы.Аргументы level.set_pp_effector_factor (3 аргумента) number (int) - story_id нашего уже запущенного эффекта. number (float) - число от 0 до 1 (дроби, разумеется, поддерживаются), которые означает саму интенсивность. number (float) - вероятно, скорость перехода от текущей интенсивности к новой, которая указана во втором аргументе. Число от 0 до 1. Параметр изучен мало. У второй одноименной функции первые два аргумента совпадают, а третий отсутствует. level.set_pp_effector_factor(1001, 0.5, 0.3) level.set_pp_effector_factor(118713, 0.5) Хочу заметить, что разработчики пользовались функцией с двумя аргументами почти во всех случаях. Однако, есть исключение (см. sr_deimos.script, xr_detector.script).Скриптовый метод создания/запуска эффекта Признаюсь, я этим методом никогда не пользовался, так как не вижу особого смысла. Тем не менее, знать о том, что такой существует - не лишнее. Скажем спасибо Маландринусу и другим ребятам, которые создали по этому делу справку:АМКПроцесс создания PPE-файла, статьи Да, это самое сложное для понимания.Утилиты: SDK Postprocess Editor. Увы, по нему уроков я не встречал. В будущем ждите разбор этого редактора от меня. Честно говоря, я хоть и научился там создавать практически юбой эффект, для меня там много чего до сих пор на уровне интуиции и методы тыка. Совет: просматривайте оригинальные файлы, смотрите на значения, смотрите градиенты постпроцессов, смотрите эффект в игре. Скрытый текст Создание градиента Платформа: AllАвтор: FantomICW [Смерти Вопреки]Инструменты: Adobe Photoshop (у меня версия CC 2014) X-Ray SDK 0.7 Файл для пробы градиентаВведение Приветствую! Этот небольшой урок будет посвящен созданию градиента для файла PPE. Данный вопрос поднимался, как мне кажется, очень редко, так что мини-урок должен пригодиться. Сегодня мы также будем использовать файл для проверки градиентов из ресурсов документации для Сталкер ЗП. Перед тем, как начать урок, я также хотел бы, на всякий случай, сказать, что новый градиент можно создать на основе уже имеющихся в папке textures/grad. Звучит крайне очевидно, но мало ли http://s53.ucoz.net/sm/23/smile.gif Ладно, приступим. 1. Запускаем ФШ, можем сразу открывать файл для пробы градиентов. Далее создаем пустой документ с размерами 256x2 px. http://images.gameru.net/thumb/ed0d84d4b5.png 2. Теперь переходим на панель слоев и создаем новый слой-градиент. http://images.gameru.net/thumb/26ea16f35f.png 3. Зададим первоначальные настройки градиенту. "Стиль" - "Линейная", Угол - 0. После этого кликаем на поле цвета градиента. http://images.gameru.net/thumb/55f9fdba81.png 4. Итак, можем регулировать градиент так, как пожелаем. Кликаем на квадратик, дальше на поле "Цвет", выбираем цвет. Регулируем ползунками прозрачность, интенсивность и прочее. http://images.gameru.net/thumb/52a2df3582.png 5. К примеру, у меня будет один из градиентов для токсических аномалий, мутно-зеленоватый. Градиент нужно добавить в список стандартных, если нам его нужно позже просмотреть в файле для пробы В таком случае, нажимаем на кнопку "Новый". В поле "Наборы" должна появиться превью-картинка нового элемента. http://images.gameru.net/thumb/771039908f.png 6. По сути, работа в ФШ на этом закончена. Осталось только сохранить и зарегистрировать текстуру в СДК (сделать ей thm-файл). Позже мы вернемся к ФШ для просмотра градиента. Сохраняем текстуру в папку editors/import формате tga 32 bit, но прежде позаботьтесь, чтоб у текстуры был альфа-канал. Название желательно сделать grad_текстура. Запускаем Actor/Shader/Particle/Level Editor. Жмем Images-->Check new textures и начинаем настраивать текстуру: "Format" - 32 bit (8:8:8:8). Градиент - элемент худ-графики, так что мип-мапы и бампы отключаем. Нажимаем на "Ок". Текстура готова ко включению в постпроцесс. http://images.gameru.net/thumb/66a7558553.png 7. Как уже было сказано, мы можем вернуться к превью градиента в ФШ. В файле-исходнике дублируем любой слой и два раза кликаем на "кружочек" градиента. Из списка выбираем наш градиент. Не забудьте также сделать слой видимым. http://images.gameru.net/thumb/8a075b8854.png На этом все, спасибо за внимание! Работа в X-Ray SDK Postprocess Editor Платформа: по сути, универсальноАвтор: FantomICW [Смерти Вопреки], использован справочный материал от Malandrinus'а и коИнструментарий: X-Ray SDK 0.7 (Postprocess Editor) Скрытый текст Введение Итак, знакомьтесь: это Postprocess Editor, и здесь создаются PPE. В принципе, программа не очень сложная, но нужно немного посидеть над ней, чтобы уловить основные моменты, понять принцип работы. Для начала ознакомимся с общим интерфейсом. http://images.gameru.net/thumb/fb7b46f2d7.png Сверху - панель файла. Снизу - список вкладок, панель различных параметров, которые немного меняются (в зависимости от вкладки). По центру - график вкладки. Теперь давайте разбирать предназначение и параметры самих вкладок. Скриншоты, думаю, не нужны в этот раз.Универсальные параметры/кнопки+ - кнопка добавляет новый ключевой кадр. • - - кнопка удаляет выбранный кадр. • Clear - кнопка удаляет все кадры из списка. • Copy from - кнопка позволяет скопировать ки-фреймы (ключевые кадры...и да, произноситься именно "ки" а не "кей", если что http://s53.ucoz.net/sm/23/smile.gif ) из другого списка. При этом, стоить заметить, значения цвета не сохраняются. • Key Time (sec) - в поел можно выставить время выбранному кадру из списка. • RGB - значения цвета по схеме RGB. Напоминаю, сам цвет подбирается в палитре (нажмите на кнопку ниже).Add color Заливает картинку непрозрачным цветом RGB поверх всего.Параметры: • УниверсальныеBase color Заливает картинку полу-прозрачным основным цветом. Белый/черный отображает, как Add Color.Параметры: • УниверсальныеGrey color Вкладка дополнительного серого цвета, которым можно "разбавить" основной цвет.Параметры: • Универсальные • Intensity - параметр интенсивности серого цвет, значение от 0 до 1Duality Вкладка раздвоения экрана. Можем наблюдать такое в постпроцессе опьянения, к примеру.Параметры: • Универсальные, но без RGB • Duality-H - параметр раздвоения по горизонтали, значение от -1 до 1 • Duality-V - параметр раздвоения по вертикали, значение от -1 до 1 У последних двух параметров значение смещение берется, судя по всему, относительно экрана. Если ставим 0,5, то "копия изображения" сместится на половину экрана. Минусовое значение нужно для движения влево/вниз.Noise Вкладка параметров шума. Шум наблюдаем во многих постэффектах, включая ПНВ и радиацию.Параметры: • Универсальные, но без RGB • Noise Intensity - интенсивность шума, значение от 0 до 1 • Noise Grain - размер зерна, значение от 0 до 1 • Noise FPS - частота "смены" шума. Только глаза не убейте, если большое значение выставите http://s53.ucoz.net/sm/23/smile.gifBlur Вкладка размытия экрана. Наблюдаем все в тех же эффектах, когда ГГ "дают по голове".Параметры: • Универсальные • Intensity - интенсивность размытия, значение от 0 до 1ColorMapper Вкладка для градиента постпроцесса. В ЗП многие эффекты на этом и юазируются.Параметры: • Универсальные, кроме RGB • Influence - непрозрачность ("влияние") градиента, значение от 0 до 1 • Поле для ввода названия текстуры градиента (обычно это grad/grad_текстура) Первый урок закончен. Скрытый текст Введение Основы интерфейса усвоили, а значит можем прочитать пару PPE-файлов. Файлы берем из чистого ЗП. Поехали. Практика Давайте начнем с простого: постэффект обычного ПНВ. Открываем файл anims/nightvision_1.ppe. У него все вкладки пустые, кроме шума и градиента. Смотрим шум (Noise): http://images.gameru.net/thumb/12df8a3bca.png Анализируем: • Есть два ключевых кадра (0 сек. и 5 сек.) • И там, и там одинаковое значение для размера зерна и для интенсивности • И там, и там 25 ФПС Хорошо, теперь смотрим вкладку ColorMapper: http://images.gameru.net/thumb/51acd1d6cc.png Видим, что ключевые кадры совпадают с шумом. Выставлен градиент. Кстати, особенность этой вкладки в том, что в поле вводится название градиента один раз для всех кадров. Теперь можем сделать вывод: имеем простой постэффект с цветным градиентом и средним шумом. Заметьте, что значение для шума совпадает в обоих кадрах (в нулевом и пятисекундном). Что это может значить? А значит это то, что постэффект сделан специально для зацикленного проигрывания. Возьмите себе на заметку, что для цикличного постпроцесса нужно сделать нулевой кадр и второй кадр с каким-то значением времени, где значения параметров совпадают. По такой же схеме работают и другие постпроцессы. К примеру, давайте откроем black.ppe. У него заполнена только вкладка Base Color: http://images.gameru.net/thumb/d2d12be42e.png Как видим, и в нулевом кадре, и в кадре 3-й секунды выставлен черный цвет. То есть изображение зациклено черное. Да, все логично. Давайте, напоследок, рассмотрим часть более динамичного постпроцесса - fade_in_out.ppe, у которого рабочая только вкладка Add Color. Смотрим: • На нулевом кадре установлен нейтральный цвет (по сути - никакого цвета). • По достижению постпроцессом 1-й секунды экран становится полностью черным. • На кадре 4-й секунды все тот же черный цвет. • Кадр 5-й секунды цвета не имеет, как и нулевой кадр. Вывод: через одну секунду после начала действие эффекта экран становится черным и остается таким в течении 3 секунд (4 - 1 = 3). Но уже на 5-й секунде чернота пропадает. На этом "теоретическая практика" закончена. Скрытый текст Введение Сделаем два варианта постпроцесса: полу-прозрачный и непрозрачный. Суть такова: постпроцесс будет через каждый две секунды заливать экран очередным цветом радуги. При этом, красным (первым цветом) экран станет на 1-й секунде. Вспоминаем: Каждый охотник желает знать, где сидит фазан. Практика: непрозрачный 1. В редакторе нажимаем на кнопку "New". Уже договорились, что постэффект будет переливаться цветами радуги, которых есть семь. Добавляем сюда еще нулевой кадр и финальный кадр, в целом выходит 9 кадров. Эффект полу-прозрачный, значит работаем с Add Color. 2. Тогда создаем нулевой кадр и в Key Time устанавливаем 0,00. 3. Далее создаем первый цветной кадр. Ему автоматически будет выставлено время 0,01. Меняем на 1 сек. Цвет ставим красный. Далее делаем второй цветной кадр, который отобразится через 2 секунды после первого, то есть ставим ему значение 3. Цвет у кадра будет оранжевый. Продолжаем так создавать кадры с разницей в две секунды. Тогда 7-й кадр должен оказаться на 13-й секунде. Делаем последний кадр с отсутствием цвета на 15-й. http://images.gameru.net/thumb/d2031b923f.png Все, сохраняем постпроцесс.Результат: Практика: полу-прозрачный 1. Новый файл не создаем, а делаем эффект на основе уже готового. 2. Переходим на Base Color, с которым будем работать, и жмем на кнопку "Copy from"-->Выбираем Add Color. Итого мы получаем все те же ки-фреймы на нашей вкладке, но без цвета. 3. Цвет можете подбирать заново или же копировать вручную с Add Color. 4. Когда с цветом разобрались, на вкладке Add Color жмем "Clear", чтоб удалить из списка фреймы, которые нам на это вкладке не нужны. 5. Все, проверяем, сохраняем.Результат: Третий урок закончен. Скрытый текст Введение Вот мы и подошли к созданию сюжетного постпроцесса. Давайте сделаем "сценку" отравления, головокружения ГГ с потерей сознания. Практика 1. Предлагаю начать с цвета экрана. Пускай, экран будет закрашен в полу-прозрачный зеленый, как это принято в Сталкере для химических проблем ГГ (с точки зрения реализма, это абсурд, но ладно http://s53.ucoz.net/sm/23/biggrin.gif ). На Base Color делаем три поинта: • Нулевой без цвета. • 3-я секунда - цвет ближе к хаки. • 6-я секунда - более темный оттенок. Выходит, что с самого начала цвет экрана плавно станет тускло-зеленым, а потом потемнеет. 2. Далее разберемся с серым цветом и блуром...Переходим на Blur: • Нулевой кадр без цвета. • На 3-й секунде делаем Intensity 0.8 Кстати, такие же значения автоматически появляются на вкладке Gray color. 3. Duality. Делаем кадры 0, 4, 6, 8, 10. Раздваиваться изображение начнет в переходе между 4 и 6. Ниже значения раздвоения будут показаны по такой схеме: Кадр - значение Duality-H - значение Duality-V Итак:• 0 - 0 - 0 • 4 - 0 - 0 • 6 - 0,330 - 0,440 • 8 - -0,330 - -0,440 • 10 - 0,1 - 0,1 Раздвоение, как видите, будет в определенном участке симметричным (используем минус для симметрии). 4. Noise. Шум появится между 2-й и 4-й секундой, таким и останется. • На 0 и 2 ставим нулевую интенсивность, а размер зерна и ФПС - по одному. • На 4 и 10 ставим интенсивность 0,43, размер зерна - 1, а ФПС - 30. 5. Последнее - черный экран в конце эффекта. Используем Add Color. • На 0 и 9 цвета нет. • На 11 ставим черный. На этом все http://s53.ucoz.net/sm/23/smile.gifРезультат: Надеюсь, этот мини-курс вам помог. Удачи! Скрытый текст Общая информация: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.add_cam_effector(string, number, boolean, string) level.add_cam_effector2(string, number, boolean, string, number) level.remove_cam_effector(number) Хорошо, переходим к разбору функций, аргументов.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, "") --ГГ ударили прикладом Как видите, если коллбек на окончание не нужен, то ставим аргумент "".Рассмотрим пример с коллбеком: level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback") --действие анабиотика Аргументы level.add_cam_effector2 string - путь к anm-файлу от папки anims. number - временный story_id эффекта, любое произвольное число. boolean - true/false - играть зациклено/не зациклено. string - коллбек на окончание анимации камеры, очень интересная вещь. number - Fov (угол обзора) для камеры. По умолчанию - текущий игровой .Аргументы level.remove_cam_effector number - тот самый временный story_id эффекта, который был запущен. Пример: level.remove_cam_effector(3536) --отключаем анимацию камеры Функции 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() --рабочая функция, коллбек на окончание для функций запуска, указанных выше Пример запуска из логики: %=run_cam_effector(pripyat_horror:9004:false)% %=run_cam_effector_global(scenario_cam\Zaton\zat_b5_from_stalkers)% %=stop_cam_effector(4575756)% Если интересно, покопайтесь, посмотрите на аргументы функций. Пример запуска из скрипта показывать нет смысла - можно сразу запускать движковыми функциями.sr_cutscene Всем квестерам известная схема логики тоже базируется на всех тех функциях, о которых мы говорили. И, кстати, на постэффектах тоже. Давайте посмотрим на саму схему в логике: [sr_cutscene] point = test_actor_walk look = test_actor_look global_cameffect = true pp_effector = acidic cam_effector = scenario_cam\my_location\test_cam fov = 90 enable_ui_on_end = true outdoor = false Разберем параметры: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 нет. Чтобы было понятнее, давайте приведу пример: [sr_cutscene] ... cam_effector = jup_b219_descent_camera В скрипте есть таблица с таким же названием: jup_b219_descent_camera = { start = { }, idle = { {anim = "scenario_cam\\Jupiter\\jup_b219_cam_1", looped = "false", global_cameffect = true}, {anim = "scenario_cam\\Jupiter\\jup_b219_cam_2", looped = "false", global_cameffect = true}, {anim = "scenario_cam\\Jupiter\\jup_b219_cam_3", looped = "false", global_cameffect = true}, {anim = "scenario_cam\\Jupiter\\jup_b219_cam_4", looped = "false", global_cameffect = true}, {anim = "scenario_cam\\Jupiter\\jup_b219_cam_5", looped = "false", global_cameffect = true, enabled = "{+jup_a10_vano_agree_go_und} true, false"}, {anim = "scenario_cam\\Jupiter\\jup_b219_cam_6", looped = "false", global_cameffect = true, enabled = "{+jup_b218_monolith_hired} true, false"}, {anim = "scenario_cam\\Jupiter\\jup_b219_cam_7", looped = "false", global_cameffect = true, enabled = "{+jup_b218_soldier_hired} true, false"}, {anim = "scenario_cam\\Jupiter\\jup_b219_cam_8", looped = "false", global_cameffect = true}, {anim = "scenario_cam\\Jupiter\\jup_b219_cam_9", looped = "false", global_cameffect = true}, {anim = "scenario_cam\\Jupiter\\jup_b219_cam_10", looped = "false", global_cameffect = true, enabled = "true %+jup_b219_entering_underpass%"}, }, finish = { } } нимку проигрываются по очереди. Параметры в таблице:anim - файл камеры, от anims/camera_effects.looped - true/false, зациклено ли.global_cameffect - как и в самой схеме параметр.enabled - кондлист (условие) проигрывания этой камеры и действие, которые выполняется (к примеру, выдается инфопорция). В общем, если хотите создать фильм на движке X-Ray, вот это вам в помощь http://s53.ucoz.net/sm/23/biggrin.gif . Подробнее по этой системе можете узнать в 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. Статьиhttp://stalkerin.gameru.net/wiki....тсцены) - Обязательная к прочтению статья по созданию кат-сцен.Видео-туториал от Андрея Непряхина - Тоже крайне рекомендую.Статья на АМКТема на АМК - Тут довольно стремный метод правки файлов с прогой anm2ltx. Также имеется шпаргалка от stunder (2-й пост). Скрытый текст Создание анимации камеры в 3DS Max (не глобальный эффект) Платформа: AllАвтор: FantomICW [Смерти Вопреки]Благодарность: Den Stash'у за скрипты для МаксаИнструменты: 3DS Max Скрипты Дена СташаВведение Рассмотрим создание обычной анимации камеры в Максе. Анимка будет совсем простая - актер посмотрит вверх-вниз. Так как видео по скриптам и камере с канала Дениса было удалено, думаю, тутор не помешает. Практика 1. Для начала в 3DS Max создадим объект камеры и назначим ему тип Free. Рекомендуется также выставить FOV 70 (приближенно к игровому). http://images.gameru.net/thumb/c937aba958.png 2. Поставим камеру на сетку и для удобства переместим на нулевые координаты. http://images.gameru.net/thumb/d69e6896d7.png 3. С самого начала камера будет повернута вниз. Поэтому нужно установить ей поворот на 90 по оси Х. http://images.gameru.net/thumb/052437c3f2.png 4. Начинаем анимировать. Устанавливаем режим Auto Key. Далее переводим ползунок анимации на 10-й фрейм, на котором и разворачиваем камеру так, чтоб она смотрела немного вверх. Давайте сразу определим, что между изначальной точкой камеры и ее разворотом вверх/вниз будет 10 фреймов. Таким образом, между. Верхней точкой и нижней точкой, в которую мы дальше опустим камеру, 20 фреймов. http://images.gameru.net/thumb/510eae4de1.png 5. Тогда на 30-м фрейме опускаем камеру так, чтобы смотрела вниз. http://images.gameru.net/thumb/9f4e63b723.png 6. На 40-м фрейме возвращаем камеру в исходное положение (90 по Х). http://images.gameru.net/thumb/66bbbb8f2c.png 7. Если нужно, можем просмотреть движение камеры от 1-го лица через Кнопка вида-->Cameras-->Наша камера. Если все устраивает, начинаем сохранять. Нажимаем на кнопку Time Configuration. В окошке выставляем End Time 40. http://images.gameru.net/thumb/57da206955.png 8. Напоследок, экспортируем файл скриптом. Анимация простая, так что сохранять можно каждые 5 фреймов. Если сохранять каждый 1 фрейм, размер файла должен увеличиться. В принципе, такое больше нужно для анимок, где требуется "ювелирная точность". Ставим флажок напротив Camera Mode и экспортируем файл. Потом смотрим, что вышло http://s53.ucoz.net/sm/23/smile.gif http://images.gameru.net/thumb/cc32ef8d18.png Результат Удачи! Скрытый текст Создание HUD-анимации камеры в (не глобальный эффект) Платформа: AllАвтор: FantomICW [Смерти Вопреки]Инструменты: SDK Level EditorВведение Рассмотрим создание обычной анимации камеры в СДК. Я не буду особо зацикливаться на каждой кнопочке, так как, спасибо ее создателям, есть вот эта статья:http://stalkerin.gameru.net/wiki....тсцены) Простите, что посылаю вас так далеко, но надеюсь на ваше понимание: в какой-то момент справку писать однозначно надоедает. В общем, читаем статью, а потом здесь закрепляем материал. Схема примерно такая же, как и в Максе. В этот раз актер будет поворачиваться вправо/влево. Практика 1. Установим объект editor/camera на нулевых координатах. Выставим Motionable и Auto Key. http://images.gameru.net/thumb/fa67b19cca.png 2. После этого передвигаем камеру на начальную позицию (я просто поднял чуть выше). Теперь уже можно выставить время Current Frame (сколько камера будет двигаться до 2-го поинта). Важно! Только в таком порядке все делаем, иначе камера может заглючить и переместиться куда-то далеко. Кстати, двигаться камера будет до 2-го фрейма 2 секунды http://s53.ucoz.net/sm/23/smile.gif Должно сейчас быть 2 ключа, а время окончания должно быть равно текущему времени. http://images.gameru.net/thumb/cf8860de69.png 3.Оборачиваем камеру вправо с ее стороны/влево с нашей стороны. http://images.gameru.net/thumb/1274ee7729.png 4. В Current Frame вбиваем 6,000. То есть к 6-й секунде камера повернется уже в другую сторону (к третьему поинту). 5. Разворачиваем камеру в другую сторону. Далее меняем 6,000 на 8,000. http://images.gameru.net/thumb/a80d6eae0d.png 6. Возвращаем камеру на исходную позицию (4-й фрейм). Все, экспорт. http://images.gameru.net/thumb/453cdcf424.png Результат Скрытый текст Общая информация: Вот мы и подошли к кульминации всей статьи. Комплексный эффектор - это комплекс, состоящий из anm и ppe.Что это может быть: Шатаемся, все двоится Трясемся, контрик взял за мозгиСекции эффекторов Находятся они в файле configs/misc/postprocess.ltx (хотя там явно не только постпроцессы должны быть). GSC использовали комплексные эффекторы бестолково: постпроцессы оставляли постпроцессами, а камеры - камерами. В чем прикол - непонятно. Может, им удобней было вызывать не файлы, а именно секции. Ладно, давайте разбирать параметры. А нет, сначала покажу, какие эффекторы - косячные: "postprocess_base", "postprocess_anomaly", "postprocess_death", "postprocess_flame", "postprocess_fuzz", "postprocess_gravi", "postprocess_gravi_mine", "postprocess_electra", "postprocess_electra_mine", "mosquito_bald", "postprocess_gas", "_actor_death_effector", Они по какой-то другой системе делались. А теперь параметры: [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 эффекта, любое произвольное число. level.add_complex_effector("fade_in", 9789) --экран тухнет Аргументы level.remove_complex_effector 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 Аргументы такие же, как и в основных функциях.Создание complex effector Отдельный урок в отдельном спойлере тут не нужен, думаю. Давайте сделаем что-то: [problems] pp_eff_name = psi.ppe pp_eff_overlap = true pp_eff_cyclic = 1 cam_eff_name = camera_effects\surge_01.anm cam_eff_cyclic = 1 ГГ будет жестко контузить. Кульминация окончена. Скрытый текст Общая информация: После кульминации получаем бонус http://s53.ucoz.net/sm/23/smile.gif xrdemo - формат, который почему-то многие модмейкеры обходят стороной, хотя он позволяет легко делать облеты камеры. Правда, немного особенные: камера в конце летит обратно к ГГ.Что это может быть: Любой полет камеры demo_recordКак это сделать? Легко. Прямо в игре вводим в консоли команду: demo_record название_записи Летаем, пробелом (Space) отмечаем ключевые точки. В конце жмем Esc. Получаем в profiles/savedgames файл название_записи.xrdemo. Теперь его можно смотреть http://s53.ucoz.net/sm/23/smile.gif В консоли пишем: demo_play название_записи Скриптовые функции? Действительно, а что, если нужно запустить скриптом? Функции отдельной не существует...Но подождите, мы ведь можем обращаться к консоли через скрипты! В общем, ребята, дарю вам свою функцию: function run_xrdemo(xrdemo) if xrdemo ~= nil then get_console():execute("demo_play "..xrdemo) end end Аргумент - название записи. На этом конец. Всем спасибо и удачи! 1 2 7 Поделиться этим сообщением Ссылка на сообщение