
Глава 13
Производственный процесс
В нынешние времена вы не продвинетесь далеко в мире персонажного риггинга, если ничего не слышали о производственном процессе. С годами продукция компьютерной графики расширялась все больше и больше, и нужда в организации огромного количества данных стала первостепенной. В трилогии «Властелин колец» задействованы тысячи компьютерных солдатов и существ, которых нужно было построить, сделать риггинг и анимировать. Управление всем этим требует организации производственного процесса, или стандартизированного процесса, для создания и подготовки цифровых данных.
Термин производственный процесс (pipeline) это очень широко используемый термин, охватывающий почти все аспекты производства в сфере компьютерной графики. Соображения относительно производственного процесса могут касаться риггинга персонажей, именования узлов, местоположения и формата файлов, процесса рендеринга. Так как в этой книге внимание сконцентрировано на персонажном риггинге, мы рассмотрим сферы производственного процесса, которые напрямую к нему относятся.
Структуры файлов
Один из основных аспектов производственного процесса – это файловая структура. Выбор нужной структуры поможет организовать данные проекта и сохранить синхронность действий.
Maya дает базовую файловую структуру в форме рабочих областей. Для многих проектов, особенно небольших, такая структура подходит отлично. Однако когда масштаб проектов начинает расти, от структуры в стиле Maya обычно отходят. В сфере производства интерактивных развлечений, например, организация данных обычно выражается в отдельном расположении текстур и других данных, отдельно от самих персонажей.
Несмотря на то, что файловые структуры исходя из нужд проекта часто меняются, есть несколько принципов, которые могут помочь в планировании производственного процесса. Один из этих принципов – организация персонажей как завершенных объектов. В стандартном проекте Maya есть директория со сценами, директория для текстур и так далее. Они содержат все необходимые для персонажа данные. Но если этот персонаж нужно переместить или обновить, то художнику придется искать в нескольких папках, чтобы найти нужные для редактирования данные. Если нужно сделать резервную копию персонажа или дублировать его, чтобы создать основу для другого персонажа, то файлы придется разыскивать заново.
Вместо этой несоизмеримой схемы есть эффективный способ организации персонажей: делать собственную структуру директорий для каждого персонажа. Директория верхнего уровня – это имя персонажа. Ниже расположены директории для модели, для сборки, для текстур и анимации персонажа и для любых других данных. Потом, если персонаж нужно переместить или дублировать, копируется сразу вся информация по персонажу. На рис. 13.1 показан пример иерархии.
@Рис. 13.1. Образец иерархии производственного процесса
Структура очень похожа на способ организации игровых данных: персонаж, как правило, – это отдельная единица со своими данными анимации, сборки и модели, которые все хранятся вместе. Инкапсуляция данных текстуры – дополнительный шаг, и выполнять ее не обязательно, но можно, в зависимости от применяемой программистами стратегии управления этими данными.
В любом производственном процессе обычно есть две стороны, зеркально отражающие одна другую: создание и экспорт. Создание обычно включает в себя модели, сборки, текстуры и так далее – все, что составляет анимированную сцену. Экспорт подразумевает обработанную анимацию, результаты имитации мышц и т. п. Это данные высокого разрешения, и обычно ими оперируют подобно данным финального рендеринга: симуляция уже проиграна и результаты кэшированы, анимация засушена на скелетах и так далее. Эти файлы хранятся на случай незначительных изменений или ре-рендеринга. Если в сцене пять персонажей, а анимацию нужно изменить только у одного, то нет смысла запускать имитацию ткани/мышц заново на тех персонажах, которые не меняются.
В интерактивных приложениях сторона экспорта часто представляет собой компилированные или экспортированные данные, готовые для считывания в игровом движке. Часто эта структура содержит файлы, конвертированные программным обеспечением в различные форматы. В производственных процессах такого типа выгодно обрабатывать экспортированную анимацию как отрендеренную и хранить копию «засушенной» анимации, состоящую лишь из сочленений и модели в доэкспортном состоянии. В таких случаях эффективно экспортировать анимацию дважды: один раз в файл, в котором есть только сочленения и модель, а оттуда – в дополнительный, подготовленный для движка двоичный формат. Это может показаться излишним, но как бы то ни было, в результате появляется понимание проблем, которые могут возникнуть в процессе экспорта. Такой тип производственного процесса может также облегчить управление несколькими персонажами в кинематографических сценах.
При планировании производственного процесса самое простое решение часто бывает самым лучшим, и в таком случае структуры директорий источника и экспорта должны как можно точнее повторять друг друга. Например, если вы применяете обсуждавшуюся ранее схему директорий для персонажа, то в его экспортированной версии должны быть директория для игровой модели, директория с обработанными текстурами (или с текстурами сниженного разрешения), директория с внутреигровой анимацией и т. д. Такая структура значительно снижает количество работы, необходимой для разработки инструментов импорта, экспорта и другого управления данными. Устанавливая сходные файловые структуры, можно воспользоваться скриптовой поддержкой, для управления импортом/экспортом файла. Освобождение файла от лишних функций с помощью скрипта может упростить производство и исключить ошибки со стороны человека.
Первый компонент
производственного процесса – простая
функция, получающая путь экспорта для
данных, с которыми вы работаете. Вы
можете запросить путь любого файла
сцены, воспользовавшись MEL-командой
file
–q
–sn.
Эта команда возвращает строку с полным
путем файла и его полным названием,
что-то вроде такого:
C:/topDirectory/project/scenes/source/characters/char1/char.mb
Врезка. В Maya в системах Windows, IRIX и Linux файлам даются названия с прямым слэшем, что делает возможным их перенос и устраняет неприятную необходимость избегать обратного слэша в строчках.
Если простая отраженная структура уже есть, то этот путь можно использовать для получения подходящего пути назначения. Приведенный ниже скрипт есть в файле getDestPath.mel на сайте http://www.courseptr.com/downloads. Давайте пройдем его шаг за шагом:
global proc string getDestPath(string $source, string $dest)
{
string $sourceFile = `file –q –sn`;
Результат команды file – полный путь к текущей сцене, включая ее название. Так как нам нужна только директория назначения, то для удаления имени файла из пути можно применить команду dirname.
string $sourcePath = dirname($sourceFile);
Теперь в скрипте можно использовать установленную структуру директорий. Для замещения тех частей структуры директорий, которые нужно изменить, примените команду substitute.
if(!`gmatch $sourcePath (“*”+$source+“*”`)) error (“Source dir not in file path”);
string $newPath = `substitute $source $sourcePath $dest`;
Вот место где работа заканчивается: директория, переданная $source, меняется на директорию, переданную через $export. Обратите внимание на выражение if с командой gmatch. При обращении к несуществующей в пути сцены исходной директории команда substitute не сработает. Скрипт возвратит название исходной директории. Если вы применяете этот скрипт для экспорта данных, то можете завершить его, переписыванием оригинального файла. Лучше выловить подобную ошибку, чтобы она не возникла в скрипте.
Этот код довольно полезен, но можно еще больше расширить его применение. Если вы запустите его с файлом, не имеющим отраженного пути, то Maya выдаст ошибку при сохранении в несуществующую директорию назначения. Чтобы автоматически создать директорию назначения, если таковой не существует, можно добавить в скрипт getDestPath небольшую операцию. Для этого добавьте перед выражением return следующую команду:
If(!`filetest –d $newPath`)
sysFile –md $newPath;
return $newPath;
}
Получившаяся строка – полный путь и название экспортируемого файла. Так как мы не работаем с экспортером, команда file послужит заменителем. Особые нужды производственного процесса могут потребовать изменения самого имени файла. Для этой цели отлично подходит команда substitute. Уделите время проверке вашего скрипта.
На одном из локальных жестких дисков создайте директорию под названием samplePipeline. В ней создайте директорию sampleSource, в которой, в свою очередь, директорию sampleChar. Наконец, создайте директорию sampleAnim.
Откройте в Maya Script Editor и скрипт getDestPath.mel – тот, который мы только что написали. Файл можно найти на http://www.courseptr.com/downloads.
С помощью команды Create → Polygon Primitives → Cube (Создать → Полигональные примитивы → Куб) создайте полигональный куб.
Примените команду File → Save As (Файл → Сохранить как), чтобы сохранить сцену как testAnim.ma в директории samplePipeline/sampleChar/sampleAnim. Структура файлов должна соответствовать рисунку 13.2.
@Рис. 13.2. Пример файла персонажной анимации в образце организации производственного процесса
После сохранения файла введите в командной строке следующую команду:
getDestPath(“sampleSource”, “sampleExport”);
В Script Editor вы должны увидеть такую строку:
C:/samplePipeline/sampleExport/sampleChar/sampleAnimation
Это строка, возвращаемая при выполнении команды. Обратите внимание, что путь тот же самый, за исключением того, что директория sampleSource заменена на sampleExport. Если вы откроете файловый браузер, то увидите созданные директории экспорта.
Врезка. Maya чувствительна к регистру, несмотря на то, что операционная система Windows – нет. Если вы напишете в команде «samplesource», то она выдаст ошибку.
Врезка. Скрипт getDestPath.mel не удаляет и не переписывает уже существующие директории.
Скрипт getDestPath.mel можно включить в простой скрипт экспорта. Вообще, при экспорте анимационной сцены, как для интерактивных, так и для повествовательных целей, вам необходимо извлечь имя файла назначения, пути назначения и запустить, какого-нибудь рода функцию экспорта. В следующем примере скрипт экспорта строится с применением команды file для экспорта данных.
Первая часть, конечно же, – объявление процедуры. Переменные $source и $export здесь для того, чтобы скрипт был более универсальным: они задействованы в процедуре getDestPath.
global proc exportCurrentScene(string $source, string $export)
{
В следующей строке скрипт getDestPath.mel используется не только для построения пути экспорта, но и для его возвращения для команды export.
string $exportPath = getDestPath($source, $export);
Следующий шаг – получить имя файла для экспорта. В Maya для извлечения имени файла из полного пути существует команда basename.
string $exportFile = basename(`file –q –sn`,“”);
Наконец, команда экспорта использует путь и имя файла для экспорта данных.
file –op “v=0” –typ “mayaAscii” –pr –ea ($exportPath+“/”+$exportFile);
}
Теперь опробуйте новый скрипт. Введите его в Script Editor или возьмите из файла exportCurrentScene.mel с http://www.courseptr.com/downloads.
Откройте файл /samplePipeline/sampleSource/sampleChar/sampleAnimation/testChar.ma из предыдущего упражнения.
В командной строке введите следующую команду:
exportCurrentScene(“sampleSource”, “sampleExport”);
Через меню File → Open (Файл → Открыть) откройте экспортированный файл /samplePipeline/sampleSource/sampleChar/sampleAnimation/testChar.ma. Файл должен располагаться в директории экспорта, как на рис. 13.3.
@Рис. 13.3. Путь экспорта, созданный скриптом getDestPath
Команду exportCurrentScene из этого упражнения нельзя скопировать на кнопку на полке, с целью применения к какому то объекту. В интерактивном игровом проекте команду file можно заменить вызовом собственной команды экспорта.
Упрощенная файловая структура может сохранить много времени, которое тратится на поиск по директориям, и позволяет создавать небольшие утилиты для помощи художникам в их работе. Перекладывая задачу определения пути экспорта на скрипт, вы также предотвращаете ошибки со стороны человека, которые удивительно часто возникают в проектах, где работа заканчивается в 2 часа ночи.
Файловые ссылки
Файловые ссылки в Maya – это мощная возможность, которую многие применяют с трепетом. Файловые ссылки, в сущности, сложны, что может отпугнуть от поиска ошибок, сопровождающих их. В 6.0 функция ссылок была исправлена и улучшена. Она используется в производственных процессах фильмов и интерактивных приложений.
Файловые ссылки применяются, в основном, для облегчения обновления. Допустим, ссылки на модель и ее сборку проставлены для анимации во многих эпизодах. Аниматоры начинают работать над сценами с этим персонажем. Уже потом определяется, что некоторые аспекты персонажа нужно изменить. Так как во всех случаях анимация ссылается на один и тот же файл сборки и модели, любые изменения в этом файле распространяются из-за определенной организации производства на каждую сцену, ссылающуюся на него, когда ее открывают в следующий раз. Такое упрощение редактирования и внесения всеобщих изменений – ключевые элементы функции ссылок.
У этой функции есть и другая выгода. Когда на файл дается ссылка, Maya загружает в память read-only копию (только для чтения). Когда текущая сцена сохраняется, данные, на которые она ссылается, не сохраняются вместе с ней: сохраняется только ссылающийся файл. Например, если прошедший риггинг персонаж загружен в сцену и анимирован, то при сохранении сцены модель, сборка и анимационные кривые будут записаны в файл. Если на персонаж и сборку делается ссылка, Maya сохранит в файле только анимационные кривые. В результате размеры файлов уменьшаются, а время экономится.
Еще одна выигрышная сторона: все узлы в файлах-источниках – только для чтения. Это означает, что никакой узел из такого файла нельзя удалить. Кроме того, заблокированные в файле-источнике узлы нельзя разблокировать, и возможность установки ключевых кадров атрибутов нельзя изменить. В системе файловых ссылок нет абсолютной «защиты от дурака», потому что разбить соединения все-таки можно. Если соединенные атрибуты не обладают возможностью установки ключевых кадров, то их нельзя разбить через Channel Box, но все же можно удалить в Hypergraph. Тем не менее, большей части случайных удалений, таких как уничтожение всех Set Driven Keys операцией Delete → All By Type → Channels (Удалить → Все по типу → Каналы), можно избежать. Если есть желание, файл ссылки можно импортировать, и в этом случае все узлы можно будет полноценно редактировать.
Ссылку можно создать с помощью команды Create Reference в меню File. Следующее упражнение научит вас делать ссылки.
Создайте в Maya новую сцену.
В меню File выберите блок опций Create Reference. В диалоговом окне Reference Options (Опции ссылки) выберите Edit → Reset Settings (Редактировать → Сбросить настройки), чтобы убедиться, что опции ссылки установлены по умолчанию.
В браузере файлов выберите pigGoblin_low_res.ma. Этот файл можно найти на http://www.courseptr.com/downloads в архиве sampleAnim.zip.
Должен появиться персонаж, как на рис. 13.4.
@Рис. 13.4. Файл - ссылка
Обратите внимание: пиктограммы в Outliner немного изменились. На каждом узле в Outliner вы увидите небольшой квадрат с «R» внутри. Это означает, что узел только для чтения (Read-only), и его нельзя удалить. Вы также заметите, что к имени каждого узла добавлен префикс с именем файла и двоеточием. Это показывает, что узел использует функцию namespaces (разделение имен). Разделение имен – это как распределение, в котором все имена узлов должны содержать префикс и двоеточие. Использование разделения имен упрощает отслеживание узлов, созданных с помощью файловой ссылки. К любому файлу со ссылкой будет прикреплен префикс: либо имя файла, либо префикс заданный пользователем.
Файловые ссылки, в отношении переименования, сильно влияют на производственный процесс. По ходу всей этой книги большое внимание уделяется проверке уникальности названий узлов в каждой сцене. Это важно держать в уме, ведь для многих разработчиков интерактивного контента названия сочленений персонажа существенны, так как применяются различным образом в игровых движках, например, в прикреплении объектов или во время пробного прогона.
При использовании этого инструмента для управления сценами с несколькими персонажами специфическая необходимость присоединения строчного значения в начале имен всех узлов файла-источника может быть действительно полезной, особенно как во многих играх, где один персонаж многократно дублируется. Когда дается ссылка на файл, Maya прикрепляет к каждому из узлов имя файла или другое строчное значение. Если файл-источник используется еще раз для нового персонажа, то ту же самое строчное значение для ссылки на персонаж применить нельзя. Поэтому, когда значение меняется, двух персонажей легко держать отдельно, потому что все их узлы имеют различные префиксы.
Такие принципы
присваивания имен механизма файловых
ссылок позволяют легко выделять объекты
из файла-источника. Так как уникальный
префикс гарантирован, команды,
использующие его как групповой символ,
могут применяться для выделения узлов
определенного типа. Например, если
файлу присвоен префикс «char1_»,
а названия всех его анимационных
контроллеров оканчиваются на «_ctrl»,
то команда `select
–r
“char1_*_ctrl”`
выделит все контроллеры этого файла.
При работе над интерактивными проектами правила присваивания имен, если их не принимать во внимание, могут быть помехой в производственном процессе. Во многих случаях персонажи имеют один и тот же скелет, и поэтому названия должны быть идентичны. Если применяются ссылки на файл, то сочленение shoulder превращается в prefix_shoulder. Если в одной сцене у нескольких персонажей одинаковый скелет, то префиксов может быть несколько: «prefix1_», «prefix2_» и так далее. Чтобы сохранить порядок в именовании сочленений, нужно некоторым образом подготовить файлы, предназначенные для экспорта в интерактивный движок.
В следующем упражнении мы рассмотрим добавление файла-ссылки, его импортирование и извлечение из него имен. В этом разделе будет применяться процедура stripPrefix, которую можно найти в файле stripPrefix.mel. Команда stripPrefix пройдет через все узлы сцены и вычислит первый аргумент, предшествующий нижнему подчеркиванию или двоеточию.
Скачайте и разархивируйте файл sampleAnim.zip с http://www.courseptr.com/downloads. Откройте файл sampleAnim.ma. Вы увидите анимированную версию персонажа PigGoblin (рис. 13.5). Оба файла – sampleAnim.ma и pigGoblin_low_res.ma – должны находиться в одной директории.
@Рис. 13.5. Персонаж PigGoblin, открытый по ссылке. Обратите внимание на флажки read-only на пиктограммах узлов
Откройте Outliner. Удерживая клавишу Shift, щелкните на значке [+], чтобы открыть иерархию. Обратите внимание, что имена всех узлов имеют префикс «def_».
Из меню File откройте Reference Editor. Reference Editor показывает все файлы-ссылки в текущей сцене. В его окне вы увидите запись «defRN». Это узел, который Maya использует для отслеживания файлов-источников и их соединений.
Выделите узел defRN. Поля в Reference Editor должны измениться, показывая путь файла-ссылки.
В меню Reference Editor выделите Edit → Import Reference (Редактировать → Импортировать файловую ссылку).
Откройте Outliner. Вы увидите, что на узлах нет тэгов read-only: они импортированы, и теперь их можно редактировать и удалять.
Загрузите скрипт stripPrefix.mel. В командной строке введите stripPrefix. Вы увидите, что все узлы переименованы, а префикс исчез.
На этом этапе файл готов для экспорта. Но этот процесс довольно трудоемок и для среды производства слишком объемен, так что посмотрим, как его можно автоматизировать. В этом примере, где на каждый файл по одной ссылке, его довольно просто конвертировать с помощью Maya и некоторых небольших скриптов.
Первая часть скрипта экспорта – объявление. Отметьте, что здесь, как и в предыдущем скрипте экспорта, используются переменные $source и $export типа string. Добавлена еще одна переменная string – $prefix, сообщающая функции префикс, который нужно вычислить из названий.
Global proc importRefAndRename()
{
string $refFiles[] = `file –q –r`;
for($file in $refFiles)
file –ir $files;
Команда file возвращает string-массив файлов, на которые даны ссылки. В данном случае множество состоит из одного объекта. Следующий шаг – импорт, устраняющий защиту и делающий возможным редактирование узлов источника. Еще один шаг – удаление префикса.
stripPrefix();
}
Давайте опробуем скрипт:
Откройте файл cubeAnim.ma из архива cubeAnim.zip с Web-сайта http://www.courseptr.com/downloads. Вы увидите анимированный куб. Куб был открыт из файла ссылки, и в этом файле к нему добавлена анимация.
В командной строке введите следующее:
importRefAndRename;
Вы увидите, что куб теперь можно редактировать и переименовывать. Команда stripPrefix пройдет по циклу через все узлы сцены, перескакивая через те из них, в названиях которых нет подчеркивания или двоеточия. Она удалит префиксы вне зависимости от того, был ли источник для ссылки импортирован с помощью опции namespaces или нет.
Построение производственного процесса с файлами разного разрешения
Один из самых очевидных способов встроить механизм ссылок в производственный процесс – создать файлы со сборкой и с моделью персонажа и применять их как ссылки для загрузок в сцены с анимацией. Это хороший метод, но, на этой базе, механизм ссылок позволяет сделать кое-что более полезное.
Повторное использование – один из основных аспектов современного 3D производства. Особенно это касается интерактивного контента. В ограничении типа и количества разнообразных скелетов в области создания игры нет ничего необычного. Так как данные о скелете и анимации персонажа потребляют большой объем оперативной памяти, имеет смысл использовать один и тот же скелет для управления множественными персонажами. Таким образом, разнообразие совмещается с минимальным потреблением оперативной памяти.
В более традиционно организованном производственном процессе были бы задействованы несколько файлов: для каждого варианта персонажа были бы свои файлы модели и сборки. Был бы один «главный» персонаж, использующийся для внутриигровой анимации, с некоторыми добавлениями, для достижения различных вариантов. С ссылками такая система приобрела бы дополнительные преимущества: ссылки можно заменить. Так что если вы используете один и тот же скелет для анимации варвара и мага, то ссылка варвара может быть заменена, чтобы увидеть ту же анимацию персонажу мага.
Такая организация производственного процесса определенно работает, но она ограничивает аниматора. И если персонаж нуждается в обновлении, то тут возникают проблемы. Многие кинематографические секвенции генерируются из внутриигровых данных, так что модели обновляются, и появляется множество персонажей и сборок. Возможно, производство в большей степени зависит от ролика: может существовать несколько уровней детализации персонажа. Например, у вас может быть схематическая версия низкого разрешения, версия более высокого разрешения для эпизодов среднего плана и полностью детализированная версия мышечной системы. Для ускорения процесса анимации было бы очень удобно анимировать версию персонажа с самым низким разрешением, потом перенести анимацию на версию с более высоким разрешением и опять вернуться к самой простой версии.
Файловые ссылки можно применить для разделения различных уровней данных. Основная идея – отделить анимационные контроллеры от текущей модели. Для этого мы создадим два отдельных скелета: один для модели, деформируемый, а другой – скелет сборки, соединенный с анимационными контроллерами. Мы создали эти отдельные объекты, и теперь у нас есть файл, который можно использовать для анимации, в то время как моделирование и тонкая настройка деформаций делаются в другом файле. Механизм файловых ссылок поддерживает обновление их обоих. Кроме того, становится проще задействовать альтернативные анимационные сборки для особых эффектов.
Следующее упражнение иллюстрирует создание файловой ссылки.
Создайте в Maya новую сцену.
Примените команду File → Create Reference и откройте окно опций. В секции Name clash options: измените выпадающие списки на Resolve all nodes with this string:. Введите def в качестве префикса. Убедитесь, что опция Use Namespaces (Использовать разделение имен) включена.
Нажмите на кнопку Reference и выберите файл pipeline/source/characters/pigGoblin/deform/med_res.ma. Можете скачать структуру директорий с http://www.courseptr.com/downloads. Вы должны увидеть модель и скелет персонажа в одной сцене. Персонаж связан со скелетом деформаторами. По умолчанию строка «def_» должна быть присоединена к названиям узлов.
Врезка. Когда Maya использует функцию разделения имен, она присоединяет название разделения к имени каждого узла, отделяя его двоеточием вместо подчеркивания. Если вы применяете файловые ссылки в интерактивных разработках и предпочитаете не удалять префикс, то вам, возможно, захочется избавиться от разделения имен, так как двоеточие может не работать с анимационными экспортерами.
Примените команду File → Create Reference и установите опцию Resolve на «all nodes» с «the string», и в качестве строки возьмите «rig». Нажмите на кнопку Reference и выделите файл pipeline/source/characters/pigGoblin/rig/rig_pigGoblin.ma. Вы увидите анимированную сборку персонажа.
Загрузите скрипт connectRig.mel. В командной строке введите следующее:
connectRig(“rig_”, “def_”);
Нажмите клавишу Enter. В Script Editor вы увидите список узлов. Выделите один из анимационных контроллеров и переместите его с помощью инструмента Move. Модель должна двигаться вместе со сборкой. Также в этой сцене должен появится новый узел под названием constraints (рис. 13.6).
@Рис. 13.6. Открытая по ссылке сборка, соединенная с открытым по ссылке скелетом
Выделите узел rig:ctrl_arm_L и переместите его с помощью инструмента Move. Вы увидите, что деформационный скелет двигается вместе с анимационной сборкой.
Работая таким образом, вы, возможно, захотите применить опцию отключения шэйдинга форм, которое используется для выделения сочленений. Чтобы сделать это, нажмите правую кнопку мыши над слоем rig_mdl_prxy_PG и выберите в контекстном меню опцию Attributes. В Attribute Editor проверьте, что пункт Shading не отмечен. Теперь формы сочленений рендерятся в качестве каркасов, позволяя аниматору видеть модель для деформации более отчетливо, не теряя возможность выделять контроллеры.
Теперь можете сохранить получившийся базовый файл персонажа. Его можно использовать в анимации. Его сохраненная версия находится в директории pipeline/source/characters/pigGoblin/character.
Врезка. Эти упражнения настроены под использование структур директорий архива pipeline.zip с Web-сайта http://www.courseptr.com/downloads. Скачайте этот архив и извлеките файлы на свой жесткий диск.
Деформационная сборка прикреплена к анимационной сборке ограничителями. Так как оба скелета имеют одни и те же сочленения, но с разными префиксами, MEL-скрипт просто проходит через каждое сочленение в деформационном скелете и соединяет его с аналогичным сочленением скелета сборки. Обратите внимание на созданный в Maya новый узел под названием constraints. Одно из ограничений файловых ссылок состоит в том, что иерархия ссылок должна оставаться нетронутой. Любой узел, подчиненный иерархии файловой ссылки, помешает применению функции замены ссылки. По умолчанию ограничители подчинены ограничивающему узлу. Скрипт connectRig захватывает ограничители при создании, и вытаскивает их из иерархии файловой ссылки.
Скрипт connectRig – очень хорошее начало, но тот факт, что он полностью опирается на имена, может вносить некоторые ограничения. А так же могут быть и другие контроллеры, помимо тех сочленений, которые необходимо прикрепить, и другие атрибуты, помимо перемещения, вращения и масштабирования, которые нужно подключить для собственных деформаций, например, лицевых. Чтобы облегчить включение этих узлов, скрипт connectRig усовершенствован до connectFull. Этот скрипт не только привязывает узлы def с одинаковыми именами, но и соединяет все дополнительные атрибуты узлов def с атрибутами узлов сборки.
Собственные атрибуты в системе сборки нужно применять с большой осторожностью. Система работает таким образом, что при переключении на деформационный скелет с меньшим количеством атрибутов данные сохраняются.
Можно сделать несколько уровней разрешений деформирующейся модели, от самой легкой схематичной модели и до модели с полной имитацией мышечной системы. Обмен между ними можно совершить с помощью скрипта или простым переключением файловых ссылок в Reference Editor. Следующее упражнение показывает, как переключать разрешения деформационных моделей.
Откройте файл pipeline/source/characters/pigGoblin/character/pigGoblin.ma или, если у вас есть файл из предыдущего упражнения, можете использовать его. Можете скачать этот файл с Web-сайта http://www.courseptr.com/downloads.
Через меню File примените команду Reference Editor, чтобы открыть окно Reference Editor. Вы должны увидеть две ссылки в сцене. Первая часть списка ссылок – это префикс и буквы «RN», а вторая часть – имя файла.
Выделите листинг ссылки defRN. Вы должны увидеть различные поля файла-ссылки, содержащие путь к файлу-источнику.
В меню Reference выберите команду Replace Reference (рис. 13.7). В файловом браузере выберите файл pipeline/source/characters/pigGoblin/deform/hi_res.ma.
Файл деформации высокого разрешения должен заменить файл среднего разрешения.
@Рис. 13.7. Замена файла-источника в Reference Editor
В дополнение к замене деформационных сборок, можно избавиться от деформационного скелета. Когда ссылка отгружается, узлы этого файла удаляются из среды Maya, но Maya сохраняет в памяти данные о них. Удаленный файл-источник не занимает никакой памяти и не загружает ЦП, и в любое время его можно вернуть обратно в среду. Это позволяет аниматору работать только с легковесным анимационными сборками, максимизируя работу процессора и оперативной памяти рабочей станции. Следующий пример иллюстрирует процесс отгрузки ссылок.
Если у вас все еще открыт файл из предыдущего примера, то оставьте все как есть. Если нет, откройте файл character.ma.
Активируйте Reference Editor из меню File. Вы увидите листинг для сборки и деформационной модели. Рядом с каждым есть флажок.
Снимите галочку с флажка деформационного скелета, узла defRN (рис. 13.8). Вы увидите, что деформационный скелет исчез из сцены.
@Рис. 13.8. Деформационный скелет удаляется с помощью Reference Editor
Когда файл-ссылка удаляется, Maya запоминает все его соединения. Например, если вам нужно было анимировать персонаж PigGoblin, а потом убрать ссылку на сборку, то деформационный скелет двигаться больше не будет. Когда сборка-ссылка загружается заново, Maya снова присоединит к неё узлы-ограничители и анимационные кривые, и персонаж снова сможет двигаться.
Ключ к этой системе – скелет: скелеты двух сборок должны совпадать, и не только по именам, но и по ориентации сочленений. В случае с образцом персонажа названия всех сочленений сборки, которые должны быть подсоединены, начинаются с «bn_», так же как и названия всех сочленений деформационного скелета. Если скелеты теряют синхронизацию, то можно настроить систему прикрепления, но это нежелательно, потому что создает новый очаг сбоев производственного процесса. В любом случае нужно, чтобы все данные работали как можно более согласованно. Вы должны стремиться к тому, чтобы не было никаких исключительных моделей или сборок. Скорее всего они появятся, но постарайтесь минимизировать эту вероятность и, если что, документируйте как можно более подробно.
Теперь этот файл можно сохранить и использовать как базовый файл анимации персонажа. Для обновления деформационной модели можно использовать Reference Editor. Так аниматор сможет проверять различные деформационные эффекты поз. Кроме того, к сборке можно подсоединить много разных деформируемых моделей, позволяя моделям разнообразных персонажей использовать один и тот же скелет сборки. Когда приходит время экспорта анимации для рендеринга, её можно засушивать на сочленениях деформационной системы.
Создавая файл, в котором даны ссылки на сборку и модель, проверьте, что сохраняете его в формате ascii. Если пути к файлам-ссылкам меняются, то это может сэкономить очень много времени. При перемещении файлов их пути можно редактировать в файле .ma, чтобы восстановить ссылку. Альтернативный метод – загрузить файл, при этом Maya спросит, что делать, если нельзя найти файловую ссылку. Тогда вы укажете на нужный файл и Maya загрузит его, но не запомнит новый путь до тех пор, пока вы не замените ссылку в Reference Editor.
Подводные камни механизма ссылок
Несмотря на то, что файловые ссылки – мощный инструмент, во избежание неполадок важно понять, как он работает. Редактируя файл, на который дана ссылка, для сохранения целостности производственного процесса важно знать, какие редакции будут приняты системой ссылок, а какие вызовут недопустимые сбои.
Механизм ссылок во многом опирается на именование узлов. Допустим, вы используете в анимации ссылки на персонаж и его сборку. Когда загружается файл, содержащий анимацию, Maya читает файл-источник и создает в анимационной сцене копию только для чтения. После этого все анимационные кривые, управляющие каналами, соединяются с узлами только для чтения. Если есть такие каналы, которые нельзя подсоединить, Maya выдаст предупреждение или сообщение об ошибке. Из-за этого процесс может стать непредсказуемым.
Ключевой момент здесь в том, что файловые ссылки работают вне соединений. Если между файлом-ссылкой и узлами в анимационной сцене, которые пытаются с ним соединиться, есть какое-то несоответствие, то возникнут проблемы. В случае с нашей гипотетической анимацией это означает, что изменение названия любого из узлов сборки, анимированной в той сцене, вызовет ошибку и, возможно, неопределенное поведение. Если файл персонажа открыт, а его модель меняется, то это не окажет никакого влияния на анимацию. Пока все узлы и атрибуты существуют в модели-ссылке, механизм будет работать без осложнений.
Другой проблематичный аспект файловых ссылок касается перемещения исходного файла. Когда Maya пытается загрузить нужный файл, но не может его найти, появляется диалоговое окно, где пользователю задается вопрос, что делать дальше. Чтобы загрузить файл, нажмите на кнопку Browse (Обзор) и выберите нужный файл. Maya продолжит загружать сцену. Но при этом Maya не запомнит новое положение файла-источника. Чтобы сохранить данные о новом пути, нужно открыть Reference Editor, применить команду Replace Reference и выбрать файлы.
Работа с множественными персонажами
Организация производственного процесса с файловыми ссылками хорошо подходит для работы с множественными персонажами. Создавая такую сцену, важно иметь хороший план. Количество персонажей имеет решающее значение, так как механизм ссылок в Maya во многом опирается на именование. Если в сцене два или более персонажей, то они не должны иметь одинаковые имена. Из-за этого ограничения к именам персонажей в такие сцены добавляются определенные префиксы (когда они используются в механизме ссылок). В следующем примере показана работа с несколькими копиями одного и того же персонажа в одной сцене.
Создайте в Maya новую сцену. Импортируйте в нее две версии персонажа PigGoblin и настройте их для анимации.
Примените команду File → Create Reference и откройте опции. Установите ссылку на «Resolve all nodes with the string» и введите в качестве строки «rig1». Убедитесь, что флажок Use Namespaces отмечена.
Нажмите на кнопку Reference и выберите файл /character/rig/rig_pigGoblin.ma. Должен загрузиться анимационная сборка, и названия всех его узлов должны иметь префикс «rig1_».
Повторите шаги 2 и 3, но в настройках Resolve замените «rig1_» на «rig2_». Теперь у вас должны быть две версии сборки pigGoblin, каждая со своими префиксами.
Откройте настройки команды File → Create Reference.
Установите разрешение имен, чтобы отметить все узлы со строкой def1. Нажмите на кнопку Reference и выберите файл /model/mid_res.ma, чтобы поставить ссылку на деформационную модель персонажа pigGoblin.
Повторите предыдущий шаг с def2 вместо def1 в диалоговом окне настроек меню Create Reference. Теперь у вас должны быть два деформационных скелета с разными префиксами.
В командной строке введите следующее:
connectRig(“rig:”, “def:”);
Деформационная сборка должна выравниваться по анимационной сборке rig1.
Введите в командной строке следующее:
connectRig (“rig1:”, “def1:”);
На этом этапе оба деформационных скелета должны быть присоединены к соответствующим сборкам (рис. 13.9).
@Рис. 13.9. Множественные файловые ссылки в одной сцене
Как видите, организация производственного процесса с файловыми ссылками требует немного больших усилий: файлы персонажей нельзя просто импортировать или установить на них ссылки. Но выстроив их в схеме сцены, вы можете сохранить функциональность обмена деформаций. В дополнение к этому, все возможности механизма файловых ссылок в Maya (загрузка и отгрузка) остаются невредимы.
Экспорт деформационного скелета
В предыдущем разделе модель и сборка персонажа находились в одном файле, с целью создания простого пути экспорта. При более продвинутой организации производства процесс экспорта нужно пересмотреть, для управления множественными файловыми ссылками в одной сцене. Экспорт анимации со ссылками зависит от цели. Для рендеринга персонажную анимацию можно оставить в анимационной сборке и отправить файл на рендеринг как есть. Чтобы оптимизировать процесс, анимацию можно засушить на скелете-ссылке.
После того, как система сборок была создана и анимирована, экспортировать анимацию в деформационный скелет довольно просто. Когда анимация готова, выделите корневой узел деформационного скелета и примените команду Edit → Keys → Bake Simulation (Редактировать → Ключи → Засушить анимацию), чтобы засушить анимацию на деформационном скелете. Убедитесь, что опция Hierarchy (Иерархия) установлена на Below (Ниже). После завершения выполнения команды удалите constraints узел, чтобы отделить деформационный скелет от его анимационной сборки.
Для интерактивных приложений требуется бóльшая подготовка. Несмотря на то, что анимацию можно засушить на деформационном скелете, многие игровые движки используют именование сочленений для упорядочения данных. В таком случае сочленения для экспорта можно переименовать, что требует дополнительной работы.
Существуют два типа анимации для интерактивных приложений: внутриигровая (in-game) и кинематографическая (cinematic). Внутриигровая анимация напоминает алгоритм: циклы бега и ходьбы, моменты бездействия и атаки – некоторые из них. Кинематографическая анимация более традиционна и повествовательна. В большинстве случаев персонаж имеет скелет с определенными названиями сочленений. В сценах с множественными персонажами возникают трудности из-за требования именования их по-разному.
Для решения этой проблемы создается скрипт, подготавливающий скелет для экспорта. При этом импортируется файл-ссылка деформационного скелета, на нем засушивается анимация, его узлы переименовываются. Потом он экспортируется во вторичный файл, который затем переходит к экспортеру. При такой системе возможно любое количество сходных персонажей в сцене для экспорта в скелет с одним набором имен.
Чтобы упростить организацию такого производственного процесса, необходимо, во-первых, подготовить файлы деформационного скелета. Так как ссылки на несколько файлов делаются одновременно, Maya не сможет узнать, какой из файлов – экспортируемый деформационный скелет, а какой – анимационная сборка. Несмотря на то, что вы можете провести много времени за написанием кода для поиска кожных кластеров в файле, нет никакой гарантии, что их может не быть в файле сборки. Деформационный скелет должен быть сгруппирован под одной трансформой, и у этой трансформы должен быть атрибут под названием skeleton, который потом будет использован в скрипте для его экспорта. В следующем упражнении показан алгоритм настройки деформационного скелета. Это упражнение делать не обязательно: если вы чувствуете, что уже усвоили подготовку деформационного скелета, то можете спокойно пропустить его. Со сборкой нужно сделать то же самое, но только атрибут называется rig, и его нужно добавить к высшему узлу иерархии сборки.
Откройте файл /pipeline/source/characters/deform/test.mb.
Вы увидите, что в деформационной модели два узла верхнего уровня: pgSkeleton и MeshChar_PigGbln. Для простоты производственного процесса вам в сцене нужен только один узел верхнего уровня. Выделите оба узла, сгруппируйте их, нажав Ctrl+g, и назовите узел pgDeform.
Откройте Attribute Editor и примените команду Add Attribute, чтобы создать атрибут под названием skeleton. Тип этого атрибута значения не имеет, так как ключевые кадры ему назначаться не будут. Установите его тип на boolean и уберите отметку с флажка Make Attribute Keyable (Назначать Атрибуту Ключевые кадры).
Сохраните файл.
Теперь, когда атрибут добавлен, нужно создать скрипт, который изолирует деформационные скелеты и подготовит их для экспорта. Когда персонаж нужно экспортировать, проверяются все узлы верхнего уровня. Тот из них, который имеет атрибут skeleton, будет засушен и экспортирован. Это будет сделано с помощью такого MEL-кода:
global proc string[]
{
string $result[];
string $assemblies[]= `ls –as`;
for($node in $assemblies)
{
if(`objExists ($node+“.skeleton”)`)
$result[size($result)] = $node;
}
return $result;
}
Этот MEL-скрипт возвращает названия деформационных скелетов. После того, как они установлены, скелеты можно выделить и засушить на них результаты анимации с помощью следующего скрипта:
global proc string[] bakeSkeletons(string $skeletons)
{
float $startTime = `playbackOptions –q –min`;
float $endTime = `playbackOptions –q –max`;
bakeResults –simulation true –t ($startTime+“:”+$sendTime) –hierarchy below –sampleBy 1 –preserveOutsideKeys true –sparseAnimCurveBake false –controlPoints false –shape false $skeletons;
return $skeletons;
}
Ещё одна последняя функция, необходима этому скрипту для удаления из сцены перед экспортом информации сборки. Это достаточно просто: цикл проходит через все сборки, и если у них есть атрибут rig, то они удаляются.
global proc deleteRigs()
{
string $assemblies[] = `ls –as`;
for($node in $assemblies)
if(`objExists ($node+“.rig”)`)
delete $node;
}
Последний кусочек в этой мозаике – MEL-код, который и будет осуществлять экспорт. Этот скрипт должен будет импортировать файл-ссылку засушенного деформационного скелета. После импортирования узлы можно переименовать, чтобы их имена совпали с именами первоначальных узлов деформационного скелета. На http://www.courseptr.com/downloads есть несколько вспомогательных функций, которые упрощают эту задачу: первая – это скрипт importReference.mel, импортирующий ссылку любого выделенного узла. Второй скрипт – getPrefix.mel, который возвращает префикс ссылки, чтобы упростить переименование.
Чтобы совместить все эти элементы, можно сделать такой скрипт:
global proc exporter(string $source, string $export)
{
string $originalFile = `file –q –sn`;
string $exportPath = getDestPath($source, $export);
string $exportFile = basename(`file –q –sn`,“”);
Эти первые строчки получают путь оригинального файла и создают путь для экспорта этой сцены. Имя файла извлекается вызовом basename.
string $temp = `internalVar –utd`;
file –rn ($temp+“temp.ma”);
Эти две строки – что-то вроде меры предосторожности. Команда internalVar возвращает временную или рабочую директорию пользователя. Вызов команды file переименовывает текущую сцену в temp.ma. Это сделано для того, чтобы такое нежелательное событие, как ошибка, не остановило работу скрипта. Из-за этого файл не сохранится поверх оригинала.
string $exportNodes[] = getExportNodes();
$exportNodes = bakeSkeleton($exportNodes);
Эти две строки – для получения всех деформационных скелетов сцены и засушивания анимации из сборок на сочленениях деформационного скелета.
if(`objExists constraints`) delete constraints;
Эта строка – просто формальность: теперь, когда анимация засушена на сочленениях, ограничители больше не нужны.
importRefAndRename();
stripPrefix();
Эти две строки уже встречались в предыдущих упражнениях. Они нужны для импорта ссылок и извлечения префиксов из их имен.
$exportNodes = getExportNodes();//названия изменились
deleteRigs();
file –op “v=0” –typ “mayaAscii” –pr –ea ($exportPath+“/”+$exportFile);
Так как имена изменились, с еще одним вызовом getExportNodes захватываются все родительские узлы деформационных скелетов. С вызовом deleteRigs удаляются все контроллеры сборки, остаются лишь экспортируемые деформационные скелеты.
file –f –open $originalFile;
}
Последняя строка скрипта заново открывает оригинальный файл. Метод обращения экспортера с файлами можно настроить. Вы можете всегда сохранять сцену перед экспортом или автоматически открывать экспортированный файл после завершения экспорта. Эти решения, как правило, согласуются аниматором и техническим директором.
Теперь давайте испытаем наш скрипт:
Откройте файл chapter13/scenes/pipeline/source/characters/pigGoblin/anim/anim.ma. Вы увидите простую анимацию персонажа pigGoblin.
В командной строке введите следующее:
exporter(“source”, “export”);
Модель должна пройти процесс засушивания.
Откройте файл /chapter13/pipeline1/export/characters/pigGoblin/anim/anim.ma. Вы увидите деформационную модель с засушенной на ней анимацией.
Откройте файл chapter13/pipeline1/source/characters/pigGoblin/anim/anim.ma и запустите скрипт exporter. Вы увидите, что модель прошла засушивание, и по его завершении на деформационный скелет больше нет ссылки, и префикс «def_» так же исчез. Все, что остается – экспортировать деформационный скелет в файл. Вот где пригодятся отраженная система файлов и скрипт getDestDir.mel. Скрипт getDestDir поменяет текущую открытую директорию файлов на экспортную директорию и даже в случае необходимости создаст недостающие поддиректории. В нашем примере путь к файлам-источникам персонажа выглядит как-то так:
C:/…/chapter13/pipeline1/source/characters/pigGoblin/anim/anim.ma
Путь назначения для экспорта – поддиректория export:
C:/…/chapter13/pipeline1/export/characters/pigGoblin/anim/anim.ma
Не имеет никакого значения, находятся ли эти директории в папке проекта или на жестком диске С:. Важно лишь то, чтобы путь перед директорией /source/ был одинаковым. Тогда директория export будет размещена в той же папке, что и директория source, а путь от нее вниз будет скопирован.
Решение проблем механизма ссылок
Итак, производство с использованием файловых ссылок организовано. Все идет хорошо до тех пор, пока не обнаружатся проблемы: возможно, узел был назван неправильно, и это нужно изменить в скелете.
До тех пор пока на узле есть анимация, а система ссылок соединяет каналы с анимированными узлами по именам. Поэтому изменение имени в файле-ссылке побеспокоит файл анимации.
Решение – убедиться в том, что файл-ссылка содержит объект с правильными атрибутами. Когда этот файл загружается, каналы анимации соединяются с новым объектом. Потом их можно скопировать к новому объекту. По идее, после копирования анимации во все файлы оригинальный временный объект в файле-ссылке можно удалить. Очевидно, что если у вас около сотни анимационных файлов, то это не так просто. В таком случае можно применить пакетную обработку. Эта специфическая проблема рассмотрена далее в разделе «Скрипт Fixit».
Если механизм файловых ссылок дает сбой, то ведущую роль в отладке играет Script Editor. Все ошибки механизма ссылок отражаются в нем при попытке Maya сослаться на файл. Большинство ошибок связаны с несоответствием имен и/или недостающими узлами/атрибутами. Эти ошибки легко находятся и исправляются с помощью Script Editor.
Применение скрипта Fixit
Одно из преимуществ организации производственного процесса с использованием файловых ссылок – возможность поддерживать их с помощью скриптовых узлов. Так как персонаж ссылается на один и тот же базовый файл, мы можем внести изменения в этот файл и распространить их на всю систему. Иногда необходимые изменения не так уж просто сделать, лишь поменяв объекты и соединения в файле-ссылке: существует уже упоминавшаяся ранее проблема переименования анимированного узла. Система, в которой используется ссылка, не может узнать, как соединить переименованный узел с уже созданными анимационными кривыми. В подобных случаях для исполнения скриптовых команд, исправляющих проблему в файле-ссылке, можно применить скриптовые узлы. Следующее упражнение продемонстрирует, как можно применить скрипт fixit в файловых ссылках:
Откройте файл cubeAnim.ma. Его вы найдете в архиве cubeAnim.zip на Web-сайте http://www.courseptr.downloads. Вы увидите анимированный куб. Куб ссылается на файл cube.ma.
Откройте файл cube.ma. Выделите узел pCube1. Переименуйте его в polygonCube. Сохраните файл.
Снова откройте файл cubeAnim.ma. Вы увидите такое сообщение об ошибке:
// Error: line1: Could not make connection; could not find destination plug ‘cube_pCube1.v’ // (невозможно создать соединение; не найден назначенный канал ‘cube_pCube1.v’)
Файловая ссылка не смога нормально функционировать, так как узел был переименован.
Снова откройте файл cube.ma. Примените команду Create → Locator, чтобы создать трансформу. Переименуйте трансформу в pCube1.
Выделив узел pCube1, нажмите Ctrl+g, чтобы создать дополнительную группу. Переименуйте эту группу в node_remapping.
Снова откройте файл cubeAnim.ma. Никаких ошибок быть не должно. Кроме того, локатор должен иметь такую же анимацию, что и куб.
Выделите узел pCube1. Примените Edit → Keys → Copy Keys (Редактировать → Ключи → Копировать ключи), чтобы скопировать ключи в буфер обмена.
Выделите узел polygonCube и примените опции команды Edit → Keys →Paste Keys (Редактировать → Ключи → Вставить ключи). Установите Time Range на Clipboard. Щелкните по кнопке Paste Keys, чтобы вставить ключи в объект polygonCube.
Активируйте воспроизведение сцены. Узел polygonCube теперь анимирован.
Так как файловая ссылка теперь работает вне имен, анимация накладывается на новый узел под названием pCube1. Так как названия узлов, названия атрибутов и их тип совпадают, механизм ссылки заново создаст соединения с новым узлом: этот узел – единственный в сцене с таким именем. Два узла в разных иерархиях вызовут трудности, так что убедитесь, что переименованный узел только один.
Проблема в данном случае решена, но в процессе производства было бы утомительно открывать каждый файл и вручную копировать ключи. Идеальное решение в такой ситуации – скриптовый узел. Скриптовый узел – это MEL-код, внедряющийся в файл. Скриптовый узле можно вызвать напрямую или активировать при определенном событии. Чтобы решить проблему с анимацией, скриптовый узел будет настроен на исполнение при открытии сцены.
Откройте файл cube.ma.
Примените команду Window → Animation Editors → Expression Editor, чтобы открыть Expression Editor.
Установите пункт меню Select Filter на By Script Node Name. Это действие настроит Expression Editor на редактирование скриптовых узлов, а не выражений, которые от них кардинально отличаются.
В поле Script Node Name введите «copyKeys».
В поле Script: введите следующее:
copyKey –option keys –hierarchy none –controlPoints 0 –shape 1 {“cube_pCube1”};
pasteKey –option insert –copies 1 –connect 1 –timeOffset 0 –floatOffset 0 –valueOffset 0 {“cube_polygonCube”};
Врезка. Эти команды были взяты из Script Editor после завершения предыдущего раздела. В команде copyKey флажок –time был пропущен. Это заставляет Maya копировать всю кривую и освобождает риггера от запрашивания начального и конечного времени анимации для команды copyKey.
Установите опцию Execute On на Open/Close.
Нажмите на кнопку Create, чтобы создать скриптовый узел.
Сохраните файл и откройте файл cubeAnim.ma. Вы увидите анимированный куб.
Каждый раз при открытии файла, ссылающегося на cube.ma, будет выполняться скриптовый узел copyKey. Если бы куб был персонажем, то так происходило бы с любой анимацией, для которой этот файл персонажа был бы источником ссылки. До тех пор, пока скриптовый узел не ссылается ни на какие собственные MEL-команды, файл легко распространять, ведь MEL внедряется в узел.
Единственный недостаток этого метода состоит в том, что механизм файловых ссылок не позволяет нам удалить узел pCube1 после того, как он выполнил свою задачу. Для ясности он хранится в группе nodeRemapping. Это небольшая плата за функциональность самоисправления файлов.
В приминении скрипта fixit нет никаких ограничений. Так как он находится в файле, на который ставится ссылка, есть только один источник может указать нуждается ли скрипт в редактировании. Это способствует сохранению порядка в производственном процессе и предотвращает особые случаи, когда файл может стать ночным кошмаром для любого участника производства.