вернуться на beanet.ru вернуться к списку проектов вернуться на главную страницу сборника

Тема: Сложные скриптовые сцены (choreographed scenes) в редакторе FacePoser


Ключевые слова: создание сцены с несколькими NPC, создание продвинутой анимации

См. также: logic_choreographed_scene, scripted_sequence
Список используемых понятий, сокращений и обозначений

перейти к общему списку

Замечание: Несмотря на обилие информации, освоить FacePoser очень легко, т.к. большинство операций весьма наглядны.


Содержание



Введение

Используя энтити scripted_sequence, можно задавать для NPC лишь отдельные заранее заданные анимации, которые к тому же будут смотреться несколько "кустарно" - в том плане, что каждый NPC действует обособленно. Безусловно, можно отчасти разнообразить подобные скриптовые сцены триггерами, но гораздо эффективнее будет создание комплексной интерактивной сцены в редакторе FacePoser. Впоследствии такую сцену можно добавить на карту с помощью энтити logic_choreographed_scene.

FacePoser позволяет разнообразить сцену мимикой "актёров" (Actors), может заставить NPC смотреть друг на друга либо на игрока (с поворотом головы или взгляда), ускорять/замедлять анимацию, делает удобной синхронизацию движений и действий "актёров".
Помимо этого, в Вашем распоряжении есть редактор фонем (входит в FacePoser) для добавления к звуковому файлу с речью специальных меток, управляющих синхронизацией губ любого NPC (человека), который будет произносить данную фразу.

Примечание: добавленная редактором фонем информация не искажает звук, но при редактировании полученного файла в стороннем звуковом редакторе (например, Sound Forge) эта информация теряется. Следовательно, обработка в редакторе фонем должна быть последней операцией над файлом с речью, который добавляется к игре.



Некоторые термины и замечания:

Хореография - последовательность команд (сохраненных в *.vcd-файле), задающих для подконтрольных NPC скриптовое (полускриптовое) поведение - анимации, мимику, речь, а также различные триггеры искусственного интеллекта - явно или подразумеваемые в дальнейшем на карте. Эти команды и формируют сложную скриптовую сцену (choreographed scene).
Речь - не обязательно использовать logic_choreographed_scene, чтобы NPC просто произнес определенную фразу (для таких случаев хватит и ambient_generic). Но если фразу надо произнести в определенный момент, в сочетании с некоторой анимацией - в этом случае хореография существенно облегчает синхронизацию. Формат речевых файлов должен быть *.wav (несжатый) 44100 Гц либо Microsoft ADPCM 4-бит.
Синхронизация губ - создается редактором фонем автоматически (начало и длительность каждой фонемы), тем не менее, наилучший результат дает ручная доводка полученной схемы (см. далее).
Мимика - сделана в виде набора простейших движений лица (например, улыбка или открытие/закрытие глаз), регулируемых бегунками. Анимацию мимики можно хранить непосредственно в *.vcd-файле сцены, либо в отдельном *.txt-файле (т.н. многократно используемые выражения).
Анимации тела - можно смешивать (сочетать) без пауз и резких переходов между ними, изменять интенсивность, и либо изменять скорость воспроизведения в любые моменты времени (Gestures), либо скорость выполнения анимации в целом (Sequences).
Сопрягаемые анимации - не затрагивают все тело NPC и представляют собой отдельные элементы (жесты). Подразумевают использование только в сочетании с основными анимациями (тела), добавляя "актёрам" выразительность. На основные анимации влияния не оказывают (не нарушают их).

Замечание: на данный момент лицевая мимика sneer_left, по-видимому, заменена на smile.



Ограничения и требования

Перед работой с редактором фонем крайне рекомендуется установить Microsoft Speech SDK (SAPI) версии 5.1, без которого автоматическое создание фонем будет невозможным, и Вам придется вручную расставлять команды синхронизации губ NPC для каждого нового речевого файла. Для готовых речевых файлов, созданных Valve для игр Half-Life 2 выполнять синхронизацию губ не требуется - она уже сделана.

Важное замечание: на данный момент автоматическое построение фонем в Windows Vista невозможно и всегда приводит к ошибке Last Extraction Result: An Error occurred during extraction.

Необходимо следить за соответствием анимаций NPC и интонацией произносимых ими фраз (например, радостные жесты сочетаются только с радостными фразами и возгласами). В противном случае сцена будет выглядеть рассогласованной, а действия NPC несуразными.
Вы ограничены применением лишь тех анимаций, которые были созданы Valve в серии Half-Life 2. Используя только редактор FacePoser, создать свои собственные анимации невозможно. Вам придется подбирать удачные сочетания, либо создавать новые модели NPC с добавлением новых анимаций.
Для комфортной работы с FacePoser необходимо разрешение экрана как минимум 1024х768, поскольку интерфейс редактора громоздкий (много окон). Важную роль играет размер окна для просмотра сцены - чем оно больше, тем удобнее работать.

Замечание: в связи с особенностями адаптации движка к различным платформам (кроме PC), начиная с Half-Life 2: Episode 2 (Orange Box) в игре будут доступны только те сложные скриптовые сцены (choreographed scenes), которые определены в специальном файле scenes.image.
В случае оригинальных игр Valve этот файл находится в соответствующем *.gcf-файле. Однако при создании модификаций файл scenes.image должен находиться в каталоге /scenes Вашего мода.
Если были созданы новые сцены в редакторе FacePoser, при закрытии редактора задается вопрос Rebuild scenes.image? Необходимо ответить утвердительно - файл scenes.image обновляется с учетом всех сцен в каталоге /scripts.
Если необходимо использовать в моде оригинальные сцены Valve, их можно достать из *.gcf-файлов программой GCFScape и скопировать в каталог /scripts Вашего мода (соответственно затем обновить файл scenes.image, выбрав пункт меню File -> Rebuild scenes.image… редактора FacePoser).

Важное замечание: если Вы создаете мод Half-Life 2: Episode Two (т.е. на движке OrangeBox), NPC в игре перестанут разговаривать. Причина кроется в том, любое событие, в котором NPC произносит фразу (для npc_citizen: приветствовать игрока, передать патроны, предупредить группу о появлении врагов и пр., также для других говорящих NPC), проигрывается в виде сцены (*.vcd-файла).
Естественно, при создании мода информация об этих сценах отсутствует, поэтому в игре NPC молчат.
1 решение: с помощью программы GCFScape достать файл scenes.image из файла episode two content.gcf и скопировать в каталог /scenes Вашего мода. Однако такой способ исключает добавление собственных сцен.
2 решение: с помощью той же программы достать все файлы сцен из соответствующих *.gcf-файлов, скопировать в тот же каталог. Затем выполнить Rebuild scenes.image…, после чего все оригинальные файлы сцен можно удалить, оставив лишь созданные Вами дополнительно.

Например, в файле half-life 2 content.gcf в каталоге hl2/scenes/npc находятся сцены основных фраз npc_citizen. Там есть и другие сцены, которые не обязательно включать в scenes.image. Будет достаточно папок male01 и female01. Их необходимо скопировать в каталог /scenes Вашего мода в такой же иерархии (т.е. /scenes/npc/male01 и scenes/npc/female01). Затем выполнить команду Rebuild scenes.image… в редакторе FacePoser, а в окончательной версии мода их можно удалить - все равно движок будет брать их из файла half-life 2 content.gcf.

Замечание: если планируется сделать мод независимым от наличия Half-Life 2 у игроков, в окончательной версии файлы оригинальных сцен нужно оставить.

Подготовка речевых файлов для сцены

Перед добавлением речевого файла в сцену убедитесь, что он отвечает указанным ниже требованиям:
  • формат звука должен быть Microsoft ADPCM, 4-битный, монофонический, 44100 Гц (44 кГц), естественно, *.wav-файл. Можно использовать 16-битный, PCM - это незначительно улучшит качество звука, однако размер файла вырастет примерно вчетверо.
  • рекомендуется ограничивать длительность речевого файла одним предложением средней длины (до 10 сек). Это улучшит автоматическое определение фонем, а также положительно сказывается на производительности звукового движка в игре.
    Более длительные по времени фразы можно разбить на части, а очень короткие (для одного "актёра") - объединить в один файл.
  • Для удобства работы со звуками в Source рекомендуется для каждого задавать специальный Soundscript-файл - вспомогательный описатель звука для Source, содержащий некоторые дополнительные настройки и определения звука. Soundscript-файл позволяет обращаться к звуку с указанием только его специального имени - т.е. характеризует звук к категории Game Sounds (см. Soundscripts).
  • Не следует делать длинные паузы в речевых файлах, лучше разбейте их на части; сами паузы делаются непосредственно в редакторе FacePoser.
Замечание: можно группировать звуки (речь), предназначенные для каждой сцены, в отдельных каталогах с именами этих сцен (внутри каталога /sound Вашего мода) - это облегчит поиск нужного речевого файла.


Примерный образец Soundscript-файла:
Имена звуковых файлов не должны содержать пробелов.
  <Имя сцены>.<Имя "актёра">_<имя звука>
  {
     channel    CHAN_VOICE
     soundlevel SNDLVL_TALKING
     wave       "<путь к звуковому файлу относительно каталога /sound>"
  }

Необходимо также вставить в речевой файл информацию о фонемах, чтобы вызвать (и синхронизировать) движение губ NPC во время проигрывания этого файла. Поскольку редактор фонем запускается как часть FacePoser, работа с ним будет рассмотрена ниже.



Начало работы над сложной сценой. Сохранение сцены

Запустите Source SDK, выберите конфигурацию Вашего мода, затем запустите редактор (пункт Face Poser).
Окно редактора FacePoser выглядит примерно так:

редактор FacePoser

Важное замечание: при первом запуске обратите внимание на правый нижний угол окна FacePoser - там будут находиться закладки с условными именами всех загруженных моделей "актёров". С помощью этих закладок можно добавлять и убирать 3D-модели "актёров".
Внизу слева находятся закладки окон-редакторов, встроенных в FacePoser. Двойным щелчком л.к.м. можно выводить/скрывать соответствующие окна.

Если закладки с "актёрами" отутствуют, выберите пункт меню File -> Load model…, чтобы загрузить модель "актёра" - это будет необходимо в дальнейшем для просмотра сцен.
Появится диалоговое окно Open, в котором просто выберите картинку с подходящим NPC и нажмите кнопку Open. Модель загрузится в FacePoser, а в правом нижнем углу добавится закладка для нее.
В дальнейшем, с помощью этих закладок можно выгружать лишние модели и управлять отображением в 3D-окне просмотра сцен.


Для создания новой сцены выберите пункт меню Choreography -> New… Откроется окно Сохранить как - выберите местоположение будущего файла сцены (в каталоге /scenes Вашего мода) и задайте имя сцены. Нажмите кнопку Сохранить, при этом файл не создается сразу - необходимо также добавить хотя бы одного "актёра".
Появится окошко Create Actor, в котором необходимо ввести условное имя первого (или единственного) "актёра" сцены и нажать OK (об именах актёров см. далее).
После этого можно выполнять сохранение цены (Choreography -> Save) - сначала будет выдан вопрос о том, что файл сцены с атрибутом "только для чтения", просто ответьте утвердительно, чтобы разрешить его перезапись.

Важное замечание: никогда не используйте символ " (двойная кавычка) в названиях "актёров", каналов и событий. В противном случае сцена вообще не откроется (определяется как поврежденная), и придется вручную исправлять неправильные участки (например, в программе Блокнот).

Обратите внимание, что нижняя треть редактора FacePoser содержит временнóй график, на котором будут отображаться все события сцены. Здесь можно выполнять с ними основные манипуляции.

Вверху временнóго графика находятся: полоса с бегунком (позволяет выбирать определенный момент сцены, а также запускать в прямом/обратном направлениях воспроизведение), кнопки Старт, Пауза и Остановка (управляют воспроизведением сцены), регулятор скорости воспроизведения (от 0.00 до двукратной скорости).
Далее идет информация о масштабе временнóго графика (масштаб изменяется с помощью колесика мыши), количество действий (для отмены/возврата), линия с отметками времени (в секундах для нормальной скорости воспроизведения).
Ниже начинается область "актёров", каналов и событий - основная рабочая область.

Замечание: в редакторе не определено большинство т.н. "горячих клавиш", например, сохранение через Ctrl + S не работает.



Добавление "актёров" и каналов - основных составляющих сцены

Нажмите п.к.м. на временнóм графике и выберите пункт New -> Actor… из контекстного меню. Появится окошко Create Actor, в котором надо ввести условное имя "актёра" сцены и нажать OK.

Важное замечание: если Вы хотите, чтобы в качестве "актёров" можно было указывать любых NPC (людей), имена "актёров" необходимо задавать как !targetN, где N - число от 1 до 8. Для энтити logic_choreographed_scene в этом случае определяются атрибуты Target 1…Target 8 (по числу "актёров").
В противном случае сцена будет выполняться только с теми NPC, чьи имена (атрибут Name) совпадают с соответствующими именами "актёров", и атрибуты Target 1…Target 8 энтити logic_choreographed_scene определять не нужно.

Также имя "актёра" можно задать как !picker, в этом случае во время игры действия этого "актёра" будет выполнять тот NPC, на которого смотрит игрок. Но здесь уже необходимы триггеры.


Теперь для созданного "актёра" нужно добавить канал. Именно внутри канала можно добавлять необходимые элементы сцены.
Для создания канала нажмите правую кнопку мыши внутри прямоугольника, которым ограничена область созданного "актёра".

Пример: для новой сцены и созданного единственного "актёра" с именем !target1 искомая область показана на рисунке (т.е. нажать п.к.м. внутри нее)

область 'актёра'

В контекстном меню выберите пункт New -> Channel… - появится окно Create channel, в котором нужно задать имя канала (если "актёров" несколько, также можно выбрать из списка нужного "актёра"). Введите имя канала (например, Speech - если в этом канале будут речевые файлы).


Подавляющее большинство элементов сцены добавляется только внутри каналов.


Замечание: с помощью каналов удобно разбивать сцену на отдельные части, каждую из которых можно активировать/отключать, чтобы переключать их влияние на сцену.

Если вы работали с редакторами изображений, которые используют слои (например, Adobe Photoshop или Paint Shop Pro), можете отождествлять каналы как раз с такими слоями.
Двойной щелчок л.к.м. на имени "актёра" или канала переключает их состояние - активен/неактивен. Щелчок по кнопке-стрелке рядом с именем каждого актёра позволяет сворачивать/разворачивать его область (вместе с каналами).




Обработка речевого файла (синхронизация движения губ NPC)

Когда Вы добавляете в сцену новый речевой файл, не из числа готовых (серии Half-Life 2), при попытке назначить его какому-либо NPC (в FacePoser или на карте через ambient_generic) Вы увидите, что звучащий файл никак не влияет на NPC, который должен его "произносить" - губы NPC остаются неподвижными.
Чтобы вызвать движение губ, необходимо добавить специальную информацию к речевому файлу - фонемы. Искомый файл должен находиться в каталоге /sound Вашего мода.

Откройте окно Phoneme Editor, внизу окна должна быть активна закладка Phonemes. Основная область окна отведена для отображения звука и добавленных в него фонем (сейчас она пуста).
Нажмите п.к.м. в основной области и выберите Load… в контекстном меню. Появится окно Открыть, в котором укажите речевой файл (в *.wav-формате) и нажмите кнопку Открыть.
В основной области появится отображение звука (аналогично звуковому редактору), а также полоса с бегунком (для перехода в произвольную точку звука) и некоторая информация о загруженном звуке. Если теперь проиграть звук (кнопка Play (SpaceBar) либо Пробел), NPC еще не будет шевелить губами.

Загруженный звук окружает прямоугольная рамка, поделенная на сегменты (временные интервалы по 0.5 сек). Нажмите п.к.м. внутри этой рамки и выберите Redo Extraction из контекстного меню. Появится небольшое окошко Word List, в единственном поле (Sentence) которого надо ввести английскими буквами транскрипцию речевого файла, т.е. его произношение на слух (например, для фразы "Так точно!" транскрипция будет "taktochna"; фраза из примера произносится быстро, поэтому пробел-пауза в транскрипции отсутствует).
Нажмите кнопку OK или Enter. Будут сформированы фонемы, при этом сверху отображения звука появятся прямоугольники со словами транскрипции, а внизу - прямоугольники с фонемами.
Об удачном завершении операции сигнализирует зеленая надпись прямо под областью звука: Last Extraction Result: successful. В противном случае будет сообщение об ошибке (красного цвета) или предупреждение (желтого цвета).

Если фонемы были созданы хотя бы частично, нажмите п.к.м. внутри рамки, ограничивающей звук, и выберите Commit extraction из контекстного меню. После этого фонемы внедряются в речевой файл, и можно проверять синхронизацию губ NPC (проиграть звук).

Если губы NPC движутся естественно в течение всей фразы - речевой файл готов к использованию и подходит для произношения его любым говорящим NPC. Еще раз нажмите п.к.м. внутри рамки, ограничивающей звук, и выберите Save из контекстного меню. Обработка речевого файла для синхронизации губ завершена.

Замечание: на время работы с редактором фонем в каталоге с речевым файлом <имя файла>.wav создается также файл <имя файла>_work.wav, который содержит все изменения. Если Ваша работа прервалась до момента сохранения готового звука, в следующий раз просто откройте этот вспомогательный рабочий файл.


Если автоматическое построение фонем оставляет желать лучшего (несоответствие фонем транскрипции, либо речь оказалась слишком неразборчивой), придется вручную корректировать результат.
В случае слишком длинного речевого файла (фонемы вообще не созданы) надо разбить его на небольшие части (до 10 сек) и каждую обработать отдельно. Не забудьте, что длинные паузы также неудобны.

Совет: если в речевом файле достаточно длинная пауза (около 1 сек и более), и автоматическое построение фонем привело к ошибке, попробуйте отменить последнее действие и снова сделать Redo Extraction, но на этот раз введите транскрипцию только для наиболее длинной непрерывной фразы. Скорее всего это даст положительный результат, а недостающие фонемы можно добавить вручную.

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

Фонемы выделяются л.к.м., снять выделение можно также л.к.м. на пустой области в пределах графика построенных фонем (см. ниже), либо нажать п.к.м. на выбранной фонеме и выбрать Deselect all из контекстного меню.

Рисунок поясняет, где проходят условные границы области редактирования фонем:

График фонем


Исправление фонем состоит из следующих способов:
  • редактирование фонемы с сохранением той области звука, в которой она выполняет синхронизацию: нажмите п.к.м. на фонеме и выберите Edit '<фонема>'…; появится окно Phoneme/Viseme Properties, в котором надо выбрать или ввести с клавиатуры нужную фонему.
  • вставка новой фонемы в самом начале либо в самом конце отдельного слова транскрипции: нажмите п.к.м. на первой или последней фонеме и выберите Insert phoneme before '<>'… (Insert phoneme after '<>'…) из контекстного меню либо нажмите клавишу Insert; остальные действия аналогичны предыдущему случаю.
    Обратите внимание, что область новой фонемы автоматически охватывает некоторую часть звука, которая может быть эквивалентна одной фонеме.
    Добавляемые фонемы не сдвигают уже существующие.
  • объединение нескольких или разделение двух смежных фонем: выберите фонемы л.к.м. и нажмите п.к.м.; выберите Merge phonemes (Separate phonemes) из контекстного меню; эта операция возможна не всегда.
    Разделение фонем означает вставку между ними промежутка, в который затем можно добавить еще одну фонему; таким образом, решается проблема вставки между двумя фонемами третьей.
    Данные операции также не сдвигают уже существующие фонемы, а только изменяют их размеры.
  • удаление фонемы или группы фонем: выделите нужные фонемы и нажмите п.к.м. на фонеме; выберите Delete phonemes из контекстного меню либо нажмите клавишу Delete.
    На месте удаленных фонем образуются промежутки, в которые также можно добавить фонемы.
    Удаляемые фонемы также не сдвигают оставшиеся.
  • для принудительной вставки паузы используется специальная фонема <sil> (пишется вместе со скобками).
  • возможна более тонкая настройка фонем: передвижение на свободное место графика - выполняется л.к.м. с нажатой клавишей Shift; изменение длины в пределах свободного места или прилежащих фонем (которые соответственно меняют свой размер) - выполняется л.к.м. с нажатой клавишей Ctrl.
Чаще всего автоматически построенные фонемы либо отстают/опережают речь, либо содержат избыток/недостаток данных. Аккуратно добавляя и удаляя фонемы, Вы легко и быстро устраните подобные случаи.

Замечание: далее по тексту выражение "добавить фонемы" не связано с редактором фонем, хотя означает, в конечном смысле, то же самое, но применительно к создаваемой сцене.




События сцены

Работая над сценой, Вы увидите, что NPC в каждый момент времени, когда для него не задано ни одного события, принимает неподвижное положение - стоя, с разведенными в стороны руками. В игре NPC будет вести себя нормальным образом, если, конечно, его не заставляют выполнить несуществующие анимации.

Примечание: любое, однажды добавленное событие, можно отредактировать, нажав п.к.м. в пределах его области на временнóм графике и выбрав самый верхний пункт - Edit Event '<имя события>'… контекстного меню. Событие также можно перемещать по графику (изменяется время его начала) и менять его длину (т.е. его длительность по времени). Некоторые события (например, звуковое) допускают только перемещение по временнóму графику.
Чтобы удалить событие, выберите его, затем нажмите клавишу Delete либо нажмите п.к.м. и в контекстном меню выберите пункт Delete event '<имя события>'.

Примечание: условное имя (Name) события не обязательно вводить вручную. Если это поле осталось пустым, при создании события (по кнопке OK) имя генерируется автоматически.



Добавление выражений (фонем)

Выражения (фонемы) - не что иное, как движения лицевых мышц NPC, используемые для имитации разговора (совместно с проигрыванием речевого файла) и выражений лица. Несмотря на это, элементы-выражения не обязательно использовать для синхронизации губ, т.к. правильно обработанный (в редакторе фонем) речевой файл сам по себе вызывает движение губ "говорящего" NPC. Выражение удобнее всего использовать, если "актёр" должен просто "шевельнуть губами" или сохранять определенную мимику в течение всей сцены.
В процессе работы над выражениями в каталоге мода создается папка expressions для каждой из загруженных моделей (NPC). В редакторе FacePoser окно Expressions позволяет просматривать существующие выражения и добавлять их в сцену перетаскиванием л.к.м. - при этом в сцену автоматически добавляется готовое выражение.
Возможно также перетаскивание выражений на треки лицевой анимации (см. ниже Добавление события "лицевая анимация" (мимика)).

Нажмите п.к.м. на временном графике, в пределах области канала, в том месте, с которого начнется движение губ "актёра". В контекстном меню выберите пункт Expression… - появится окно Create Event : Expression.
Поле Name определяет условное имя выражения, его можно оставить пустым.
В первом поле Expression из выпадающего списка выберите класс фонемы:
  • обычная (phonemes);
  • сильная, ярко выраженная (phonemes_strong);
  • слабо выраженная (phonemes_weak)
Примечание: для конкретной фонемы классы (например, нормальный и слабый) могут совпадать по создаваемым эффектам.

Во втором поле Expression (оно без заголовка, сразу под первым) из выпадающего списка выберите конкретную фонему по ее условному обозначению.

Примечание: узнать, какой эффект дает та или иная фонема, можно открыв окно Expressions (см. закладку внизу FacePoser) двойным щелчком л.к.м.

Нажмите OK (оставив все остальные настройки без изменений). На временном графике появится полоса, характёризующая созданное выражение. Ее можно передвигать и изменять длину, тем самым изменяя время начала и длительность этого выражения.

Для изменения амплитуды (ослабления) выражения служит окно Ramp, в котором строится огибающая амплитуды. Щелчком л.к.м. при нажатой клавише Ctrl добавляются узловые точки огибающей (изначально окно Ramp выглядит пустым). В дальнейшем выбранные точки можно передвигать вверх/вниз л.к.м., влево/вправо п.к.м., а также удалять клавишей Delete. Окончание выражения показано вертикальной линией.



Добавление звуковых событий

Нажмите п.к.м. на временном графике, в пределах области канала, в том месте, начиная с которого будет проигрываться звук. В контекстном меню выберите пункт WAV File… - появится окно Create Event : Speak.
Поле Name определяет условное имя звукового события, его можно оставить пустым.
Далее возможны два варианта:
  • если для звука был задан soundscript-файл, то он появится в списке Speak Sound. Для поиска по имени можно использовать поле Filter;
  • если soundscript-файл для звука не был задан, в поле Sound введите путь к нужному файлу относительно каталога /sound Вашего мода
Кнопка Play Sound (прослушать звук) либо двойной щелчок левой кнопкой мыши будет работать только для звука с soundscript-файлом, а кнопка Open Source (открыть soundscript-файл) работает правильно только для отдельно добавляемых звуков, но не для оригинальных (от Valve), которые содержатся внутри *.gcf-файлов.

Нажмите OK (оставив без изменений остальные настройки). На временном графике появится полоса с выделенными границами звука, под ней написано имя звукового события, а также некоторая дополнительная информация. Она не представляет особого интереса, поэтому во избежание нагромождения рекомендуется скрыть ее, нажав маленький треугольник в начале временного графика канала.

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



Добавление анимаций

Нажмите п.к.м. на временном графике, в пределах области канала, в том месте, с которого начнется анимация. В контекстном меню выберите пункт Sequence… - появится окно Create Event : Sequence.
Поле Name определяет условное имя анимации, его можно оставить пустым.
В поле Sequence выберите нужную анимацию.

Нажмите OK (оставив без изменений остальные настройки). На временном графике появится полоса, под которой написано имя анимации. Можно передвигать полосу и изменять ее размер.

Для изменения амплитуды (ослабления) анимации служит окно Ramp, в котором строится огибающая амплитуды. Щелчком л.к.м. при нажатой клавише Ctrl добавляются узловые точки огибающей (изначально окно Ramp выглядит пустым). В дальнейшем выбранные точки можно передвигать вверх/вниз л.к.м., влево/вправо п.к.м., а также удалять клавишей Delete. Окончание анимации показано вертикальной линией.
Для более гибкой настройки анимации рекомендуется использовать расширенную анимацию (см. далее).



Добавление расширенных анимаций

Расширенная анимация позволяет редактирование в разумных пределах - скорости и амплитуды отдельных частей и моментов. Это своего рода полуфабрикат, из которого можно сделать очень выразительные анимации.
Нажмите п.к.м. на временном графике, в пределах области канала, в том месте, с которого начнется расширенная анимация. В контекстном меню выберите пункт Gesture… - появится окно Create Event : Gesture.
Поле Name определяет условное имя расширенной анимации, его можно оставить пустым.
В поле Gesture выберите нужную анимацию.

Флажок Sync Exit tag to next gestures Entry tag вынуждает синхронизировать окончание расширенной анимации с началом следующей расширенной анимации, но только если она находится в том же канале.
Результат при установке флажка выглядит следующим образом:
  • при добавлении анимации на временной график проверяется, есть ли еще анимация, которая начинается после начала текушей. Положительный результат вызывает корректировку конца текущей анимации таким образом, чтобы произошел непрерывный переход от нее к следующей анимации.
  • если текущая анимация самая последняя (или единственная) в канале, то следующая анимация при добавлении всегда будет после начала текущей, а окончание текущей изменится, чтобы обеспечить непрерывный переход.
  • при передвижении следующей анимации длина текущей будет постоянно корректироваться; если слишком сильно сдвинуть следующую анимацию влево, то текущая также сдвинется влево - целиком, чтобы не нарушить непрерывность перехода.
  • анимация с установленным флажком при добавлении следующей анимации теряет гибкость настройки - ее окончание "привязывается" к следующей (т.е. всегда синхронизируется с началом следующей анимации, которое неподвижно во время изменения текущей анимации).
Разумеется, всё это справедливо лишь для расширенных анимаций в одном канале.

Пример: сначала создана расширенная анимация holdhands с установленным флажком Sync Exit tag to next gestures Entry tag (верхний кадр), а затем добавлена еще одна расширенная анимация give с позиции времени 3.5 сек (нижний кадр)

Синхронизация расширенных анимаций

Обратите внимание, как растянулась первая анимация (окончание), чтобы синхронизироваться со второй. Если теперь изменять вторую анимацию, первая будет корректироваться; если изменять первую анимацию, то ее окончание (end) будет неподвижным. При удалении второй анимации первая восстанавливает гибкость настроек.


Нажмите OK (оставив без изменений остальные настройки). На временном графике появится полоса, под которой написано имя расширенной анимации. Можно передвигать полосу и изменять ее размер.
Также на полосе расположены четыре треугольника, означающие условные части анимации - специально выделенные временные теги (Timing Tags): apex ("гребень"), accent (акцент - наиболее выраженная точка), loop (цикл) и end (окончание).

Как правило, в большинстве анимаций Valve использует следующие теги:
  • Event start - начинается плавный переход к тегу Apex. Интенсивность нарастает от 0 до 100%, независимо от настроек амплитуды (Ramp).
    • Apex - перемещение к первому кадру тега Accent (обычно это небольшое движение на пике анимации, придающее дополнительный акцент).

    • Accent - воспроизведение сегмента Accent.

    • Loop - анимация "замораживается" на последнем кадре сегмента Accent; соответственно, должна быть подходящая позиция анимации. Используйте Blend Gestures для добавления интереса, если планируется расширить этот промежуток.

    • End - анимация плавно затухает из последнего кадра Accent до нейтральной позиции, интенсивность уменьшается.
  • Event end

Для управления тегами служит окно Gesture. В нем отображается настройка тегов для выбранной расширенной анимации. На полосе Original Time показано оригинальное (по умолчанию) положение тегов во времени. На полосе Playback Time можно передвигать указатели тегов, изменяя таким образом их положение во время воспроизведения анимации. В результате можно изменять относительную длительность частей анимации.

Для изменения амплитуды (ослабления) расширенной анимации служит окно Ramp, в котором строится огибающая амплитуды. Щелчком л.к.м. при нажатой клавише Ctrl добавляются узловые точки огибающей (изначально окно Ramp выглядит пустым). В дальнейшем выбранные точки можно передвигать вверх/вниз л.к.м., влево/вправо п.к.м., а также удалять клавишей Delete. В этом окне также показаны теги анимации, но их нельзя передвигать. Окончание расширенной анимации показано вертикальной линией.



Добавление нулевой анимации

Нулевая анимация оставлена для обратной совместимости. Раньше это событие предотвращало взаимное усреднение анимаций (если они накладывались во времени).
В настоящее время усреднение по умолчанию отключено, но может быть добавлено при необходимости.

Нажмите п.к.м. на временном графике, в пределах области канала, в том месте, с которого начнется нулевая анимация. В контекстном меню выберите пункт NULL Gesture… - появится окно Create <NULL> Gesture : Gesture.
Нажмите OK (оставив без изменений остальные настройки). На временном графике появится темная полоса с именем NULL. Можно передвигать полосу и изменять ее размер.



Добавление события "посмотреть на актёра"

Нажмите п.к.м. на временном графике, в пределах области канала, в том месте, с которого начнется событие. В контекстном меню выберите пункт Look at actor… - появится окно Create Event : LookAt.
Поле Name определяет условное имя события, его можно оставить пустым.
В поле Look At Actor выберите "актёра" или цель, на которую посмотрит текущий "актёр". Возможные значения:

Условное имя (ключевое слово) Цель взгляда в результате
<имя "актёра"> один из "актёров" сцены, с привязкой к его имени
!player игрок
!target1…!target8 один из актёров сцены, без привязки к имени. В игре целью будет "актёр", заданный атрибутом Target 1…Target 8, соответственно.

Флажок Use Pitch/Yaw позволяет корректировать поворот головы. При этом бегунок Pitch сдвигает голову вверх/вниз (100…-100), а бегунок Yaw сдвигает голову влево/вправо (100…-100).

Замечание: если цель взгляда - игрок (!player), корректировка поворота головы не работает.


Нажмите OK (оставив без изменений остальные настройки). На временном графике появится полоса, под которой написано имя события. Можно передвигать полосу и изменять ее размер.

Допустимо изменение амплитуды события (окно Ramp). Чем больше амплитуда, тем выразительнее поворот головы "актёра". На движение глаз амплитуда не влияет.


Обратите внимание, что взгляд подконтрольного "актёра" всегда максимально возможно поворачивается к цели. Если "актёр" расположен под большим углом к цели (от 90° и выше), эффект может быть неестественным.
Рекомендуется предварительно повернуть туловище (или всего) "актёра" с помощью события "повернуться к актёру" (Face Actor). Альтернативный вариант - настроить атрибуты Pitch и Yaw для данного события, либо скорректировать огибающую амплитуды (Ramp), смягчив эффект.


Замечание: в качестве цели взгляда можно указать произвольное имя энтити. Для этого необходимо также откомпилировать карту (полная компиляция), на которой находится данная энтити.

В принципе, необязательно (не играет роли), можно ассоциировать сцену в FacePoser c откомпилированной в *.bsp картой (команда Associate .bsp () контекстного меню временного графика). Таким образом движок "узнает", где искать энтити с указанным именем.
Если в дальнейшем понадобится отключить привязку сцены к карте, необходимо открыть файл сцены (при закрытом FacePoser) в текстовом редакторе (например, Блокнот) и убрать строку mapname "<путь к карте>" целиком. Эта строка находится почти в самом конце сцены, перед секцией scalesettings.



Добавление события "переместиться к актёру"

Нажмите п.к.м. на временном графике, в пределах области канала, в том месте, с которого начнется событие. В контекстном меню выберите пункт Move to actor… - появится окно Create Event : MoveTo.
Поле Name определяет условное имя события, его можно оставить пустым.
В поле Move At Actor выберите "актёра"-цель, к которому будет перемещаться текущий "актёр". Возможные значения:

Условное имя (ключевое слово) Цель перемещения в результате
<имя "актёра"> Один из "актёров" сцены, с привязкой к его имени.
!player Игрок.
!target1…!target8 Один из актёров сцены, без привязки к имени. В игре целью будет "актёр", заданный атрибутом Target 1…Target 8, соответственно.

В следующем поле выберите тип перемещения. Возможные значения:

Условное имя (ключевое слово) Способ перемещения в результате
Walk Ходьба.
Run Бег с заметным разгоном и остановкой.
CrouchWalk "актёр" идет, пригнувшись (т.е. крадется).

Полоса с бегунком Stop Distance определяет, на каком расстоянии от цели (в юнитах) "актёр" остановится. Дистанция, на которой "актёр" должен остановиться, должна быть не менее 33 для NPC-людей (human_hull).
Флаг Force Short Movements заставляет "актёра" уменьшать ширину шага, когда он приблизится к цели, что иногда выглядит более естественным.


Нажмите OK (оставив без изменений остальные настройки). На временном графике появится полоса, под которой написано имя события. Можно передвигать полосу и изменять ее размер.

Замечание: если цель перемещения "актёра", в свою очередь, двигается сама, то "актёр" будет следовать за целью, пока позволяет длительность события (при отсутствии прерываний движения).


Желательно, чтобы длительность события совпадала с ожидаемым временем перемещения "актёра" в игре.
Ввиду того, что актёры перемещаются, используя собственную систему ИИ, рекомендуется выставлять флажок Event must be complete for paused scene to resume (событие должно быть закончено в паузе сцены для продолжения) совместно с использованием команды Section Pause (см. далее).
Это необходимо постольку, поскольку заранее неизвестно, какое время понадобится "актёру", чтобы дойти до цели в игре. Таким образом, происходит синхронизация с остальными действиями, чтобы сцена не "разрушилась".

Замечание: в качестве цели перемещения можно указать произвольное имя энтити. Для этого необходимо также откомпилировать карту (полная компиляция), на которой находится данная энтити.

В принципе, необязательно (не играет роли), можно ассоциировать сцену в FacePoser c откомпилированной в *.bsp картой (команда Associate .bsp () контекстного меню временного графика). Таким образом движок "узнает", где искать энтити с указанным именем.
Если в дальнейшем понадобится отключить привязку сцены к карте, необходимо открыть файл сцены (при закрытом FacePoser) в текстовом редакторе (например, Блокнот) и убрать строку mapname "<путь к карте>" целиком. Эта строка находится почти в самом конце сцены, перед секцией scalesettings.



Добавление события "повернуться к актёру"

Нажмите п.к.м. на временном графике, в пределах области канала, в том месте, с которого начнется событие. В контекстном меню выберите пункт Face actor… - появится окно Create Event : Face.
Поле Name определяет условное имя события, его можно оставить пустым.
В поле Face Actor выберите "актёра"-цель, к которому повернется текущий "актёр". Возможные значения:

Условное имя (ключевое слово) Цель поворота в результате
<имя "актёра"> Один из "актёров" сцены, с привязкой к его имени.
!player Игрок.
!target1…!target8 Один из актёров сцены, без привязки к имени. В игре целью будет "актёр", заданный атрибутом Target 1…Target 8, соответственно.

При снятом флажке Lock facing (twist but don't turn) "актёр" поворачивается всем телом и остается в таком положении. При включенном - только верхней половиной туловища, а по окончании события возвращается в прежнее положение.

Нажмите OK (оставив без изменений остальные настройки). На временном графике появится полоса, под которой написано имя события. Можно передвигать полосу и изменять ее размер.

Замечание: если цель поворота "актёра", в свою очередь, двигается сама, то "актёр" будет поворачиваться вслед за ней, пока позволяет длительность события (при отсутствии прерываний движения).



Добавление события "срабатывание триггера"

Это событие позволяет добавлять определенные скриптовые действия при воспроизведении сцены в игре, аналогично энтити trigger_*, только безусловные. Суть события в том, что оно заметно расширяет возможности по созданию сцен - в точно заданное время сцены на карте будут происходить действия, которые невозможно сделать в редакторе Face Poser, но которые легко реализуемы в редакторе Hammer.
В самой сцене происходит лишь срабатывание одного из 16 триггеров, а реакция на него задается в энтити logic_choreographed_scene с помощью событий OnTrigger1…OnTrigger16.

Пример: в определенный момент сцены необходимо включить монитор, висящий на стене, чтобы NPC, находящийся рядом с игроком, мог переговариваться с NPC на мониторе.
Без использования события срабатывание триггера результата можно достигнуть такими способами как:
  • замер времени от начала сцены, когда надо включить монитор, и срабатывание включения через данное время от начала сцены в игре (неудобно также в случае, если изменится длительность первой части сцены);
  • разбивка сцены на 2 части: до и после включения монитора; соответственно, включение монитора в игре по окончании 1 части, запуск 2 части после включения монитора.
Событие срабатывание триггера упрощает дело - надо всего лишь добавить его в нужном месте сцены (например, с триггером №1), а в игре использовать событие OnTrigger1 энтити logic_choreographed_scene, по которому включить монитор.
В результате не нужно ни измерять время, ни делить сцену.


Нажмите п.к.м. на временном графике, в пределах области канала, в том месте, с которого начнется событие. В контекстном меню выберите пункт Fire Trigger… - появится окно Create Event : FireTrigger.
Поле Name определяет условное имя события, его можно оставить пустым.
В поле Scene Trigger выберите номер триггера от 1 до 16.

Нажмите OK (оставив без изменений остальные настройки). На временном графике появится небольшая вертикальная черточка, под которой написано имя события. Черточку можно передвигать.

--- Создание статической мимики лица (независимо от сцены) ---

В основном, используется для экспериментов с выражениями лица "актёра". Статическая мимика не меняется во времени, не зависит от сцены и не сохраняется вместе с ней. Это всего лишь удобное средство для подбора выражения лица.
Однако можно сохранить мимику для последующего использования (пункт меню Expression -> Save). Предварительно задать имя файла можно при создании нового выражения - командой меню Expression -> New… (в диалоговом окне Сохранить как ввести имя файла). Чтобы использовать полученные выражения в игре, надо также выполнить команду Expression -> Export to VFE для каждого из них.
В дальнейшем сохраненные выражения появляются в списках в окне Expressions, а также в списках в окне Create Event : Expression (см. выше Добавление выражений (фонем)).

Для работы со статической мимикой используйте окно Flex Sliders, предварительно расположив камеру в окне 3D-вида (3D View) напротив лица "актёра" (пункт меню Options -> Center on Face).

За имитацию отдельных мышц лица отвечает каждая из групп "флажок - полоса с одним/двумя бегунками".
Флажок отвечает за включение/выключение "мышц" лица - аналогично каналам (или слоям).
Бегунок сверху полосы (верхний бегунок) регулирует степень эффекта. Передвигается л.к.м и принимает оттенок синего цвета, в зависимости от величины эффекта. Присутствует на полосе всегда.
Бегунок снизу полосы (нижний бегунок) регулирует баланс эффекта (смещение влево/вправо). Передвигается п.к.м. и принимает оттенок красного цвета, в зависимости от смещения баланса в ту или иную сторону от центра. Присутствует на полосе только для тех эффектов, которые изначально отражаются на обе половины лица, но допускают несимметричную мимику (например, эффект "закрыть глаза" можно видоизменить на "подмигивание").

Пример: группа corner_puller ("улыбка, не разжимая губ")

группа corner_puller


Кнопка Zero Sliders сбрасывает все настройки в начальное положение.


Кнопка Get Tracks устанавливает все бегунки так, чтобы их положение совпало с уровнями соответствующих огибающих для выбранной лицевой анимации (см. далее). То есть в окно Flex Sliders копируются значения огибающих окна Flex Animation в точке, где расположен бегунок на временном графике - копирование происходит с заменой текущих значений.

Кнопка Make Keyframe производит противоположное действие - уровни всех огибающих в точке бегунка на временном графике становятся равными соответствующим значениям бегунков окна Flex Sliders. То есть в окно Flex Animation добавляются уровни огибающих в текущей точке времени (с заменой старых значений) - своего рода ключевой кадр лицевой анимации.

Другими словами, эти две кнопки выполняют синхронизацию с преимуществом лицевой анимации или статической мимики, соответственно.

Замечание: синхронизацию рекомендуется делать как можно реже и как можно аккуратнее, особенно Make Keyframe, поскольку можно легко испортить результат.


Кнопка Menu вызывает небольшое меню - Check All (включить все группы), Uncheck All (выключить все группы) и Invert Selection (выключить включенные и включить выключенные группы).


Замечание: "мышцы" лица двигаются независимо друг от друга, кроме отдельных сочетаний, так что в принципе возможно создание неестественных выражений лица.
Смешивание нескольких эффектов может дать совершенно новое выражение лица, т.е. "целое не всегда равно просто сумме частей".

Доступные виды мимики (по анализу лица Барни Калхуна) см. в следующем разделе.

Добавление события "лицевая анимация" (мимика)

Это событие реализует динамичное изменение выражения лица "актёра" - допустимы любые сочетания возможных эффектов с огибающими степени выраженности и баланса.

Нажмите п.к.м. на временном графике, в пределах области канала, в том месте, с которого начнется событие. В контекстном меню выберите пункт Flex animation… - появится окно Create Event : FlexAnimation.
Поле Name определяет условное имя события, его можно оставить пустым.

Нажмите OK (оставив без изменений остальные настройки). На временном графике появится полоса, под которой написано имя события. Можно передвигать полосу и изменять ее размер. Допустимо также изменение общей амплитуды события (окно Ramp).

Редактирование эффектов движения мышц лица выполняется в окне FlexAnimation (предварительно выберите событие л.к.м.). Это окно должно выглядеть примерно следующим образом:

окно Flex Animation

Если окно пустое, отмените выбор события (клавиша Esc либо л.к.м. в пустой области временного графика), установите бегунок перед началом события, затем выполните сброс настроек в окне Flex Sliders (кнопка Zero Sliders). Снова выберите событие лицевой анимации и перейдите в окно Flex Animation.

Сверху вниз расположены: полоса с бегунком (выбор момента анимации, а также проигрывание вперед/назад), информация о количестве действий (для отмены/повтора), название события, время начала анимации в сцене, полоса массового выделения (для выделения контрольных точек сразу всех активных эффектов на заданном отрезке времени). Далее идет список треков эффектов. Синяя вертикальная полоса означает окончание анимации.

По умолчанию все эффекты отключены (напротив названия эффекта отображается слово disabled).
Чтобы раскрыть/свернуть трек эффекта нажмите п.к.м. на названии и выберите подменю Expand/Collapse (соответственно) в контекстном меню. Раскрыть трек можно и двойным щелчком л.к.м. на его названии.
Для подменю Expand (развернуть) возможны пункты: Track '<название эффекта>' - раскрыть текущий свернутый трек; All tracks - раскрыть все треки; Used tracks - раскрыть рабочие треки (в которых были изменения).
Для подменю Collapse (свернуть) возможны пункты: Track '<название эффекта>' - свернуть текущий раскрытый трек; All tracks - свернуть все треки; All tracks except '<название эффекта>' - свернуть все треки, кроме текущего.

Трек эффекта становится активным (enabled), если начать его редактирование.
Изменять можно степень эффекта и его баланс; для этого служат два режима трека - editmode: <amount> (степень эффекта) и edimode: <left/right> (баланс эффекта). Переключение выполняется нажатием п.к.м. в окне трека и выбором пункта Edit <amount>/Edit <left/right> контекстного меню, соответственно (либо клавишей Пробел). В одно и то же время доступен только один из режимов трека.
  • В режиме <amount> щелчком л.к.м. при нажатой клавише Ctrl выполняется добавление контрольных точек для огибающей степени (ослабления) эффекта. Добавленные точки можно передвигать вверх/вниз л.к.м. и влево/вправо п.к.м. Удаление выделенной точки - клавиша Delete либо одноименный пункт контекстного меню. Серая горизонтальная полоса посередине трека означает 50%-ое ослабление эффекта.
  • В режиме <left/right> щелчком л.к.м. при нажатой клавише Ctrl выполняется добавление контрольных точек для огибающей баланса (смещения влево/вправо) эффекта. Добавленные точки можно передвигать вверх/вниз л.к.м. и влево/вправо п.к.м. Удаление выделенной точки - клавиша Delete либо одноименный пункт контекстного меню. Серая горизонтальная полоса посередине трека означает нейтральное положение баланса эффекта.
Небольшая трапеция с черной полосой, расположенная в центре снизу текущего трека позволяет изменять масштаб трека по вертикали. Горизонтальное масштабирование всех треков выполняется с помощью колесика мыши, либо выбором из контекстного меню Change scale... и вводом нужного значения в окне Change Zoom.
Можно выделять рамкой несколько контрольных точек активного трека, двигая мышь при нажатой л.к.м. Выделенную группу точек можно передвигать влево/вправо п.к.м., масштабировать (вверх/вниз) л.к.м. При масштабировании точки, достигшие границ трека, "упираются" в них, таким образом соотношение точек по вертикали нарушается.
Можно также копировать содержимое трека целиком (Ctrl + C или Copy в контекстном меню) и вставлять с заменой старых значений (Ctrl + V или Paste в контекстном меню) в другие треки.

Примечание: учтите, что именно при задании степени эффекта (<amount>) он будет виден на лице "актёра". Изменение баланса эффекта видно только в том случае, если задана огибающая степени эффекта.

Чтобы запретить отображение эффекта, нажмите п.к.м. в свободной области соответствующего трека и выберите пункт Disable '<название эффекта>' в контекстном меню. Если эффект уже запрещен, в контекстном меню отображается пункт Enable '<название эффекта>' - разрешить отображение эффекта.
Таким образом, треки схожи с каналами (или слоями) и определяют, какие эффекты движения мышц лица будут использоваться на лице "актёра".

Выделение временного отрезка для всех треков одновременно выполняется л.к.м. на полосе массового выделения. Снять выделение можно щелчком л.к.м. на свободном участке полосы.

Пример: вид окна Flex Animation при редактировании треков эффектов
Обратите внимание, что контрольные точки всех треков эффектов в пределах выделенного отрезка времени приняли красный цвет (цвет выделения).

редактирование треков эффектов

Замечание: "мышцы" лица двигаются независимо друг от друга, кроме отдельных сочетаний, так что в принципе возможно создание неестественных выражений лица.
Смешивание нескольких эффектов может дать совершенно новое выражение лица, т.е. "целое не всегда равно просто сумме частей".


Доступные виды мимики (по анализу лица Барни Калхуна):

Имя группы Описание мимики Настройка баланса
lid_raiser Приподнимаются верхние веки ("вытаращить глаза") Есть
lid_tightener Приподнимаются нижние веки (полуэффект) Есть
lid_droop Опускаются верхние веки (полуэффект - "полузакрытые глаза") Есть
lid_closer Одновременное сближение век Есть
half_closed Не оказывает видимого эффекта Есть
blink Опускаются верхние веки (полный эффект - "закрыть глаза") -
inner_raiser Брови поднимаются от центра (жалобное выражение лица) Есть
outer_raiser Брови поднимаются целиком ("удивление") Есть
lowerer Брови опускаются и сдвигаются (сердитое выражение лица) Есть
cheek_raiser Щеки и нижние веки приподнимаются ("презрительный прищур") Есть
wrinkler Щеки, нос и губы приподнимаются ("презрение", "ненависть") -
dilator Крылья носа расширяются ("раздувание ноздрей") -
upper_raiser Губы поднимаются ("получено неприятное известие") Есть
corner_puller Улыбка, не разжимая губ Есть
corner_depressor Уголки рта опускаются ("огорчение") Есть
chin_raiser Поджатие губ ("обида", "недовольство") -
part Рот приоткрывается Есть
puckerer "Сложить губы трубочкой" Есть
funneler Открытый рот округлой формы Есть
stretcher Сжатые губы Есть
bite Верхняя губа приподнимается -
presser Стиснуть губы (не зубы) -
tightener Визуально аналогично предыдущему (presser) -
jaw_clencher Стиснуть зубы (нижняя челюсть приподнимается) -
jaw_drop Нижняя челюсть сильно опускается, открывается рот ("челюсть отвисла", "удивление") -
mouth_drop Усиление эффекта jaw_drop за счет открытия рта (изменения видны только при совместном использовании) Есть
smile Обычная улыбка.
-
dimpler Уголки рта немного расходятся и опускаются (усталое выражение) Есть
cheek_puffer "Надуть щеки" ("подавление отвращения") Есть
mouth_sideways "Скривить рот", "недовольство" (для статической мимики: верхний бегунок играет роль баланса) -
jaw_sideways Смещение нижней челюсти влево/вправо (для статической мимики: верхний бегунок играет роль баланса) -
lip_bite "Закусить губу" (злобное выражение) -
lower_lip Нижняя губа опускается -
head_rightleft Поворот головы влево/вправо (для статической мимики: верхний бегунок играет роль баланса) -
head_updown Движение головы вверх/вниз (для статической мимики: верхний бегунок играет роль баланса) -
head_tilt Наклон головы влево/вправо (для статической мимики: верхний бегунок играет роль баланса) -
eyes_updown Движение глаз вверх/вниз (для статической мимики: верхний бегунок играет роль баланса) -
eyes_rightleft Движение глаз влево/вправо (для статической мимики: верхний бегунок играет роль баланса) -
body_rightleft Поворот туловища влево/вправо (для статической мимики: верхний бегунок играет роль баланса) -
chest_rightleft Поворот торса влево/вправо (для статической мимики: верхний бегунок играет роль баланса) -
head_forwardback Движение головы вперед/назад (для статической мимики: верхний бегунок играет роль баланса) -
gesture_updown Не оказывает видимого эффекта -
gesture_rightleft Не оказывает видимого эффекта -

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


Несколько полезных советов
  • избегайте крутых огибающих (с острыми углами). Чтобы движения выглядели естественными, минимальный угол огибающей должен превышать 45°.
  • чем меньше точек на огибающей, тем лучше. Лишние точки при воспроизведении анимации создают видимость "микродвижений", нарушающих естественность анимации.
  • раскрыть/свернуть (Expand/Collapse) трек не означает его включение/отключение. Эти действия выполняют пункты разрешить/запретить (Enable/Disable).
  • полезно отключить прочие движения "актёра" на время работы с лицевой анимацией. В противном случае лицо "актёра" может "выйти из кадра" в неподходящий момент. Очень легко сделать это, если любые анимации, кроме лицевых, заданы в отдельном канале (или каналах). Просто отключите на время эти каналы двойным щелчком л.к.м.
  • брови являются очень выразительным элементом. Для придания живости лицевой анимации в большинстве случаев достаточно изменить выражение бровей.
  • некоторые детали анимации игрок вполне способен домыслить самостоятельно. Если анимация кажется Вам упрощенной и неубедительной, не спешите глобально её переделывать или усложнять. При общем восприятии сцены анимация, скорее всего, будет выглядеть более слаженной и естественной.

Когда использование лицевой анимации неэффективно
  • движения головы. Большинство "актёров" не синхронизирует движения шеи с остальными мышцами, что ограничивает диапазон естественных движений головы. Также, у большинства моделей NPC есть готовые анимации движения головы, которые рекомендуется использовать вместо движений головы в редакторе лицевой анимации.
  • направление взгляда. Использование лицевой анимации не дает гарантии точности, если не задавать конкретное имя цели. Рекомендуется расположить энтити info_target или npc_bullseye на карте и назначить в качестве цели для события "посмотреть на актёра" (Look at actor) или "повернуться к актёру" (Face actor).


Добавление команды для ИИ NPC

В сцене можно управлять NPC не только прямым включением анимаций, но и косвенным - через подачу команд искусственному интеллекту. Правда, второй метод обладает существенным недостатком - NPC, в основном, не всегда реагируют на подобные команды. К сожалению, FacePoser предлагает (в выпадающем списке) все возможные варианты, и придется действовать методом проб и ошибок.
В частности, большинство команд сделаны именно для управления Аликс Вэнс (npc_alyx).

Замечание: в FacePoser реакции NPC на такое событие не наблюдается.
Можно использовать эти команды для вывода отладочных сообщений в консоли (с помощью debugtext).


Нажмите п.к.м. на временном графике, в пределах области канала, в том месте, с которого начнется событие. В контекстном меню выберите пункт Generic(AI)… - появится окно Create Event : Generic.
Поле Name определяет условное имя события, его можно оставить пустым.
Выпадающий список Generic AI Event содержит возможные варианты команд ИИ. Выберите один из вариантов:

Команда Описание
AI_BLINK Моргнуть
AI_HOLSTER Спрятать оружие в кобуру (для npc_alyx)
AI_UNHOLSTER Достать оружие из кобуры (для npc_alyx)
AI_AIM Прицелиться (навести оружие)
AI_RANDOMLOOK Случайный взгляд
AI_RANDOMFACEFLEX Случайное выражение лица
AI_RANDOMHEADFLEX Случайный наклон головы
AI_IGNORECOLLISION Игнорировать препятствия
AI_DISABLEAI Запретить ИИ

В следующем списке выберите цель команды ИИ - всегда обязательно, даже если это сам "актёр". Возможные значения:

Условное имя (ключевое слово) Цель команды ИИ в результате
<имя "актёра"> Один из "актёров" сцены, с привязкой к его имени.
!player Игрок.
!target1…!target8 Один из актёров сцены, без привязки к имени. В игре целью будет "актёр", заданный атрибутом Target 1…Target 8, соответственно.


Нажмите OK (оставив без изменений остальные настройки). На временном графике появится полоса, под которой написано имя события. Можно передвигать полосу и изменять ее размер.



Добавление события "разрешить случайное поведение"

Замечание: по-видимому, не работает в Episode One и OrangeBox. Небольшая проверка не дала удовлетворительного результата.

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


Нажмите п.к.м. на временном графике, в пределах области канала, в том месте, с которого начнется событие. В контекстном меню выберите пункт Permit Responses… - появится окно Create Event : Permit Responses.
Поле Name определяет условное имя события, его можно оставить пустым.
В поле Permit можно вводить одно или несколько правил случайного поведения, разделяя их знаком ; (точка с запятой).

Нажмите OK (оставив без изменений остальные настройки). На временном графике появится полоса, под которой написано имя события. Можно передвигать полосу и изменять ее длину.



Добавление события "подсцена" (заранее созданной сцены)

FacePoser позволяет создание сцены по принципу конструктора. Если часть рабочей сцены была создана ранее в виде отдельного файла (сцены), ее можно включить в текущую.

Замечание: поддерживается включение сцен только с одним каналом.


Нажмите п.к.м. на временном графике, в пределах области канала, в том месте, с которого начнется событие. В контекстном меню выберите пункт Sub-scene… - появится окно Create Event : SubScene.
Поле Name определяет условное имя события, его можно оставить пустым.
В поле Sub-scene введите имя сцены, либо нажмите кнопку Choose File…, чтобы выбрать файл сцены.

Нажмите OK (оставив без изменений остальные настройки). На временном графике появится полоса, под которой написано имя сцены. Полосу можно передвигать.






Команды, влияющие на сцену в целом

Есть несколько обособленных "суперкоманд", которые влияют на сцену в целом.
Они добавляются также через контекстное меню, но доступны при нажатии п.к.м. в любой точке временного графика.

В контекстном меню выберите подменю New, а затем - конкретную команду.



Секция паузы (с синхронизацией событий сцены)

Эта команда является прекрасным способом синхронизации (или прогнозирующего поведения). Чаще всего используется в сочетании с событием "переместиться к актёру", поскольку в редакторе FacePoser невозможно заранее определить время, которое понадобится "актёру", чтобы дойти до цели. Конечно, можно использовать флажок события - Event must be complete, но бывает необходимо, чтобы следующее действие началось еще до окончания текущего.
Например, если установить команду паузы за 2 секунды до окончания события "переместиться к актёру", то в игре пауза будет активирована в тот момент, когда "актёру" останется 2 секунды до указанной цели. Аналогичные действия возможны для любых событий.

Поскольку пауза влияет на сцену целиком, она приостанавливает выполнение до тех пор, пока:
  • все события, начавшиеся перед паузой,
  • все события с установленным флажком Event must be complete
не достигнут своих точек синхронизации.


Нажмите п.к.м. на временном графике, в том месте, где будет команда. В контекстном меню выберите пункт New -> Section Pause… - появится окно Add Pause Point.
В поле Name необходимо ввести имя команды.
Если необходимо, чтобы сцена автоматически продолжилась или прервалась через определенное время (независимо от процесса синхронизации), включите флажок Automatically и выберите из списка Cancel (прервать) либо Resume (продолжить). В поле after … seconds введите нужное время (в секундах). Обратите внимание, что эта настройка не повлияет на уже выполняющиеся события.

Нажмите OK (оставив без изменений остальные настройки). Сверху временного графика появится синий треугольник с идущей вниз от него пунктирной линией. Треугольник можно передвигать.

Примечание: в редакторе FacePoser сцена доходит до секции паузы и останавливается. Повторное нажатие кнопки воспроизведения проигрывает сцену далее.
В игре синхронизация выполняется правильно.



Петля сцены (зацикливание)

Команда позволяет повторить сцену с более ранней точки.
Обратите внимание, что повтор сцены с середины события или цикл между концом события и началом аналогичного события приводят к нежелательным эффектам.
Принцип установки петли - от текущей точки к более ранней.


Нажмите п.к.м. на временном графике, в том месте, где будет правая граница петли. В контекстном меню выберите пункт New -> Loop… - появится окно Add Loop Point.
В поле Name необходимо ввести имя команды.
В поле Start Time указано время, соответствующе правой границе (можно изменить).
В поле Loop to укажите время, соответствующее левой границе (по умолчанию это начало сцены).
В поле Loop Count (-1 = forever) укажите количество повторов (при этом -1 означает бесконечный повтор, 0 означает ни разу - по умолчанию).

Нажмите OK. Сверху временного графика появится розовый треугольник с идущей вниз от него пунктирной линией. Под треугольником расположены: знак правая граница(правая граница цикла) и имя команды. Треугольник можно передвигать.
В точке левой границы петли расположена короткая розовая сплошная линия с именем команды и знаком левая граница(левая граница цикла). Линию передвигать нельзя (только задавать положение редактированием петли).

Замечание: вложенные циклы срабатывают только при первом проходе, т.е. цикл внутри цикла корректно не работает.



Псевдоокончание сцены

Имитирует нормальное окончание сцены, вынуждая энтити logic_choreographed_scene реагировать на событие OnCompletion (если, конечно, такая реакция задана в редакторе Hammer). На саму сцену не оказывает никакого влияния.
Допустима установка произвольного количества таких команд, но в игре срабатывает только первая, а потом возникает ошибка Scene '<имя сцены>' with X stop point events! Вместо X будет конкретное число псевдоокончаний сцены.

Нажмите п.к.м. на временном графике, в том месте, где будет псевдоокончание. В контекстном меню выберите пункт New -> Fire Completion… - появится окно Add Fire Completion.
В поле Name необходимо ввести имя команды.
В поле Start Time указано время, соответствующе псевдоокончанию (можно изменить).

Нажмите OK. Сверху временного графика появится красный треугольник с идущей вниз от него пунктирной линией. Треугольник можно передвигать.





Статьи (рус): Подробный тутор по Face Poser'у, Звуковой кэш
Статьи (eng): http://developer.valvesoftware.com/wiki/Faceposer

перейти к общему списку

Номер статьи: 18

Сборник полезной информации по созданию модификаций на движке Valve Source Engine (игры Half-Life 2, Episode One, Episode Two)