Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Профессиональная_3D_анимация._Риггинг_и_деформа...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.46 Mб
Скачать

Глава 19

Мышечные системы и кожные решатели

Идея сохранения объема уже давно витала в воздухе, но лишь недавно технологии позволили применить математику на художественном уровне. Сейчас, используя множество техник, разрабатывавшихся годами, мы можем имитировать кожу в 3D пакетах. Мышечные системы персонажей позволяют подражать настоящей анатомии, имитируя реальность (рис. 19.1 и 19.2). Чем ближе мы к идеалу, тем реалистичнее выглядят объекты, и тут на счету любая мелочь.

@Рис. 19.1. Каркасный вид мышечной системы

@Рис. 19.2. Затененный вид мышечной системы

Чтобы прояснить мои намерения в этой главе, я хотел бы, чтобы вы знали, что я вас этому учить не буду. Объекты влияния, деформаторы тряски, имитация мягких тел и тканевые решатили – это не мышечные системы! Вы можете добиться хороших результатов с каждым из этих методов; результат их применения очень впечатляет, но это не настоящие мышечные системы. Их можно добавить к мышечным системам уже потом, чтобы усилить эффекты деформации.

Геометрические объекты влияния в мягкой привязке работают медленно и требуют бесконечных вычислений в реальном времени, поэтому в практическом отношении они сами себе мешают (рис. 19.3). То же самое можно сказать и о деформациях тряски, и об имитации мягких тел. Да, они полезны, но только не для сохранения объема. Тканевые решатели только недавно обрели способность имитировать объем кожных складок, но можно ли применять их ко всему персонажу – вопрос пока спорный.

@Рис. 19.3. Объект влияния в роли мышцы

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

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

Что такое мышечная система?

Настоящая мышечная система опирается на несколько правил, о которых нужно помнить. Подобно правилам любой другой системы, они соответствуют предъявляемым лишь к ней требованиям, и раз так, то никакой другой деформатор не может занять место мышечной системы. Соблюдая правила, вы пожнете богатый урожай, но помните, что конечная цель – создать приятную с виду модель, а правила, в случае надобности, можно и нарушить. Сначала вы должны решить, зачем нужна эта система, а потом определить, что требуется для создания персонажа, набросать части системы, создать свод правил и, наконец, соединить все кусочки мозаики вместе, с целью получения работающей кожной системы. Конечно, есть долгий период исследований и разработки, который нужно учитывать. Разработка функционирующей кожной системы может занять очень много времени (рис. 19.4).

@Рис. 19.4. Объем типичного бицепса

Цели функционирующей мышечной системы таковы:

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

  • Она должна обеспечивать обратную связь в анимации в реальном времени и быстро делать вычисления кожного решателя.

  • Она должна сохранять объем, обеспечивать напряжение мышц и предусматривать эластичность.

  • В работе мышц должно учитываться влияние динамических сил – силы тяжести и соударений.

  • Должно создаваться впечатление, что мышцы управляют костями, а не кости – мышцами.

  • Должна быть возможность исключить части модели из имитации мышц.

  • Система должна быть модульной и достаточно надежной, чтобы применять ее на любом персонаже.

Вот части, которые мы должны задействовать в нашей системе:

  • Мышцы: органы из ткани, сокращающиеся, сохраняющие объем, соединяющие кости, другие мышцы и ткани.

  • Фасция: внутренняя соединительная ткань между мышцами и сухожилиями.

  • Сухожилия: ткань, прикрепляющая мышцы к костям (для управления движениями скелета).

  • Кости: самая глубинная структура, кинематически управляющая мышцами.

  • Жир: область между мышцами, фасцией и кожей. Пустой слой будет считаться жиром.

  • Кожа: самый поверхностный кожный слой персонажа, который будет сымитирован.

Таковы правила системы:

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

  • Геометрия мускулов должна быть легкой, надежной и топологически обтекать модель.

  • Слои мышц нужно выстраивать от внутренних к наружным, от крупных к мелким.

  • Мышцы должны полностью составлять объем персонажа (с небольшим пространством между мышечной тканью и кожей).

  • Не должно быть щелей между слоем мышц, с одной стороны, и костями и внутренними органами, с другой.

  • Первый слой мышц должен прикрепляться непосредственно к костям.

  • Второй слой должен прикрепляться в промежутках между мышцами первого слоя и закрывать остающиеся части костей.

  • Третий слой и все остальные нужны для детализации, в том числе мышечных и анатомических аномалий персонажа.

Теперь у нас есть четкая формулировка целей системы, перечень ее составных частей, а также правила, которые мы будем соблюдать, по ходу создания. Следующий шаг – изучить возможности Maya. В Tippett Studio сделали одни из самых продвинутых кожных и мышечных решателей, доступных на сегодняшний день. Пол Туриот и Тодд Стинсон (Todd Stinson), разработавшие в Tippett собственные инструменты для скиннинга, потратили много времени на исследования и разработку и в результате создали похожий набор правил и целей системы. Одни продиктованы здравым смыслом, другие стали очевидными при изучения анатомии, а некоторые представляют собой результат математического выражения идей в программном обеспечении.

Начинаем с костей

Когда идеи насчет мышечной системы обрели плоть, пора начинать ее создание. Первое, о чем нужно побеспокоиться, – как мускулы будут прикрепляться к костям персонажа. Сочленения в Maya не дают нам информации, достаточной для прикрепления к ним объектов, так что нам нужна геометрия между сочленениями, которая позволил бы присоединить мышцы более чем в двух местах. Нужен внутренний скелет персонажа. Применение NURBS геометрии позволит соединить начальные точки и точки вставки мышц через узлы pointOnSurfaceInfo. На каждое сочленение или на точку артикуляции персонажа требуется одна часть геометрии. Чтобы кости имели сходство со скелетом, они должны быть соединены свободно (рис. 19.5).

@Рис. 19.5. Кости рук Свинячьего Гоблина, сделанные в NURBS геометрии.

Кости – почти самая важная часть всей системы, потому если вы начнете делать мышцы, вернуться назад и отредактировать расположение сочленений или добавить новые детали будет уже трудно. Создайте закрытые головки для верхних и нижних частей костей, и постарайтесь использовать между ними хотя бы три, четыре деления, для обозначения деталей Кости должны быть анатомическими, поэтому воспользуйтесь справочником по анатомии при определении толщины. Убедитесь, что оставили свободное место между костями около точек вращения, чтобы они могли поворачиваться, особо не пересекаясь. И помните, что в некоторых местах, в частности, в области ребер, слой ткани между кожей и костью весьма невелик, поэтому должна быть возможность прикреплять кости также и к коже. Тут детали важнее, чем, скажем, в области плечевой кости.

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

Основной мышечный объем

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

@Рис. 19.6. На мышце показаны начальная точка и точка вставки

Чтобы продемонстрировать расчет объема, мы проанализируем алгоритм и применим его к NURBS сфере в Maya.

  1. Создайте в Maya сферу NURBS по умолчанию. Назовите ее muscle.

  2. Добавьте её следующие (рис. 19.7) атрибуты:

  • Initial Volume (нет значений по умолчанию, максимального, минимального)

  • Tension (минимальное .1, максимальное 1, по умолчанию 1)

Длина в нашем случае представлена масштабированием по Y. Чтобы вывести ее, нужно найти расстояние между двумя самыми дальними точками. Самый простой способ – отметить в глобальном пространстве координаты двух локаторов, которые будут управлять объемом мышцы. Мы находим расстояние, а потом делим его на 2, чтобы получить текущий масштаб по Y, который представляет длину (рис. 19.7).

Длина = расстояние между начальной точкой и точкой вставки / 2

@Рис. 19.7. NURBS сфера с добавленными атрибутами мышечного объема

  1. Создайте узел distanceDimension и назовите его lengthCalc. Два локатора, созданные вместе с ним, будут использоваться в качестве начальной точки и точки вставки мышечного узла. Переименуйте их в origin и insertion, соответственно (рис. 19.8).

Initial Volume – результат применения алгоритма объема при создании мышцы. В нашем случае объем не является исходным математическим равенством, потому что мы не учитываем отношение высоты к ширине. Поэтому в данном случае Initial Volume представляет собой радиус.

a = (((initialVolume-length)/ratio))+(tension*.1);

b = length;

c = (((initialVolume-length)/ratio))-(tension*.1);

volume = ((4*3,14*a*b*c)/3)

Отношение – это разница между высотой и шириной. Чтобы найти ее, нужно определить длину и ширину. Ширина – это размер и по X, и по Z, а длина – размер по Y. Отдельные значения ширины по X и Z представлены увеличением давления.

@Рис. 19.8. Узел измерения расстояния как начальная точка и точка вставки

Врезка. Отношение – это сравнение двух чисел. Они, как правило, разделяются двоеточием. Допустим, нужно выразить отношение 4 и 6. Можно написать его в виде 4:6, а можно в виде дроби 2/3. И мы можем сказать, что отношение составляет четыре к шести.

  1. Создайте цепочку из трех сочленений в форме буквы L (практически представляющую руку). Она будет управлять мышечным узлом и нужна для демонстрации предназначения мышц. Создайте ИК цепочку с настройками по умолчанию между родительским и конечным сочленениями (рис. 19.9).

@Рис. 19.9. IK цепочка для управления объемом мышцы

  1. Прикрепите локатор origin к родительскому сочленению ИК цепочки точечным ограничителем. Точно так же прикрепите локатор insertion к среднему и последнему сочленениям; затем отрегулируйте веса ограничителя так, чтобы локатор приблизился к среднему сочленению. Перемещение ИК-манипулятора должно в реальном времени изменять отображаемый узел lengthCalc (рис. 19.10).

@Рис. 19.10. Установка длины для правильных вычислений

  1. Когда локаторы на месте, мышцу можно поместить в отведенное место и связать с алгоритмом объема. Сначала придайте ей форму бицепса, с полюсами и окружающими точками, сдвинутыми назад, параллельно кости, к которой она будет крепиться. Затем переместите центральную точку вращения мышцы к ее нижней центральной контрольной точке (Control Vertex). Она будет работать как точка вставки сухожилия мышцы.

  2. Прикрепите мышцу точечным ограничителем к локатору insertion и целевым ограничителем к локатору origin. Создав целевой ограничитель, измените его атрибут World Up Type на World Object Up и в соответствующем поле введите имя начального сочленения ИК цепочки. В заключение проверьте, что векторы aim и up установлены на 0,1,0 (чтобы мышца была направлена на локатор по Y с up вектором по Y) (рис. 19.11).

@Рис. 19.11. Сформированная мышца с ограничителями

  1. Для вычисления объема мы создадим систему utility-узлов. Она возникает как итог соединений utility-узлов в Maya и подходит для тех, что предпочитает применять выражения:

muscle.scaleX = (((muscle.initialVolume – muscle.scaleY)/2))+(muscle.tension*.1);

muscle.scaleY = lengthCalcShape.distance/2;

muscle.scaleZ = (((muscle.initialVolume – muscle.scaleY)/2))-(muscle.tension*.1);

string $muscle = “muscle”;

string $scales[] = {“scaleX”,“scaleY”,“scaleZ”};

for ($scale in $scales){

if ($scale != “scaleY”){

string $diff = `createNode plusMinusAverage`;

setAttr ($diff + “.operation”) 2;

string $result = `createNode multiplyDivide`;

setAttr ($result + “.operation”) 2;

setAttr ($result + “.input2X”) 2;

string $mult = `createNode multDoubleLinear`;

connectAttr ($muscle + “.initialVolume”)($diff + “.input1D[0]”);

connectAttr ($muscle + “.scaleY”)($diff + “.input1D[1]”);

connectAttr ($diff + “.output1D”)($result + “.input1X”);

string $operation = `createNode plusMinusAverage`;

if ($scale = “scaleZ”) setAttr ($operation + “.operation”) 2;

connectAttr ($result + “.outputX”)($operation + “.input1D[0]”);

connectAttr ($muscle + “.tension”)($mult + “.input1”);

setAttr ($mult + “.input2”) .1;

connectAttr ($mult + “.output”)($operation + “.input1D[1]”);

connectAttr ($operation + “.output1D”)($muscle + “.” + $scale);

}

else{

string $divide = `createNode multiplyDivide`;

setAttr ($divide + “.operation”) 2;

setAttr ($divide + “.input2X”) 2;

connectAttr “lengthCalcShape.distance”($divide + “.input1X”);

connectAttr ($divide + “.outputX”) ($muscle + “.scaleY”);

}}

  1. Подвигайте ИК-манипулятор и обратите внимание на то, как мускул поддерживает объем. Попробуйте изменить атрибуты tension и initialVolume. Если все было настроено правильно, то вы должны получить функционирующий мышечный узел, который будет поддерживать объем между начальной точкой и точкой вставки.

При перемещении ИК-манипулятора в пространстве, в результате изменения положения точки вставки, форма тела мышцы будет меняться путем изотонических сокращений. Отрегулировав атрибут tension, вы сможете управлять телом мышцы через изометрические сокращения, при которых ее общая длина не меняется. Сокращения каждого типа важны для правильной работы мышечной системы (рис. 19.12).

@Рис. 19.12. Правильно сокращающаяся мышца с faux volume.

Нужен плагин

Когда кости расставлены, можно начинать делать мышцы внутри модели. Для начала можно воспользоваться предыдущем упражнением, а можно достать плагин. Основная идея – сохранение объема и наличие давления. Этого можно добиться и без плагина, но для правильного вычисления объема и возможности соединять мышцы друг с другом нужно что-то большее. Хорошо бы также иметь возможность изменить состояние мышцы после создания, так что тут пригодятся атрибуты отношения по умолчанию и радиуса. Кроме того, нужна возможность прикреплять мышцы непосредственно к костям, а в этом случае локатор – не лучший выход. Лучше воспользоваться плагином (вероятно, через узел pointOnSurface), и в нем для облегчения создания самих мышц, скорее всего, будет предусмотрен графический интерфейс. Вы сможете сконцентрироваться на формировании и размещении, забыв о вычислении алгоритмов.

В сети, на cgmuscle.com, есть сообщество разработчиков публично доступных мышечных систем. Это значит, что вы можете бесплатно скачать их плагины и скрипты. Они постоянно обновляются; там также можно обсудить разработку и применение этих инструментов (рис. 19.13). С другой стороны, если у вас есть деньги, мы настоятельно рекомендуем DVD «Custom Character Toolkit» от Alias с мастер-класса Пола Туриота и Эрика Миллера, проходившего в 2003 г. На этом DVD показано, как создать простой плагин для мышечной системы в Maya (включая фототипию, подобную той, что демонстрировали мы), как с помощью API (Application Programming Interface) создать кожный деформатор, для соединения в модели мышц с возможностью весовой настройки.

@Рис. 19.13. Бесплатный плагин с cgmuscle.com и интерфейс для создания мышц

Соединительная ткань

Соединительная ткань, или фасция в анатомии, – это то, что не дает мышцам отделяться друг от друга. Как видно из предыдущего примера с Maya, создать один мускул довольно просто. Можно сделать так, чтобы множество мышц перекрывали друг друга, а объект при этом выглядел аккуратно. Идея состоит в том, чтобы плотно закрыть щели между мышцами и создать гладкую поверхность, с которой сможет взаимодействовать кожа (рис. 19.14).

@Рис. 19.14. Многослойная мышечная система, приближенная к конструкции модели.

Чтобы создать такую гладкую поверхность, нам нужны мышцы, способные присоединяться к другим мышцам. Как утверждалось в правилах, первый слой должен присоединяться непосредственно к костям. Вторым слоем уже можно сделать мышцы, соединяющиеся с другими мышцами. В качестве примера, чтобы дать вам представление о прикреплении одного объекта к другому, мы рассмотрим узел pointOnSurfaceInfo.

  1. Создайте в Maya NURBS-сферу и назовите ее surfaceTest.

  2. Щелкните по ней правой кнопкой мыши и выберите Surface Point (Точка поверхности); затем, удерживая левую кнопку мыши, перетащите курсор на любую точку сферы. Когда вы отпустите кнопку, Maya возвратит координаты по U и V выбранной вами точки поверхности. Отметьте (пока только мысленно), что положение точки определяется переменными $u и $v.

  3. Используя полученные переменные $u и $v, создайте узел pointOnSurface:

string $infoNode = `pointOnSurface –ch on –u $u –v $v surfaceTest`

  1. Вставьте в команду координаты U и V выбранной точки, а потом создайте узел. В Channel Box вы увидите новые данные от surfaceTest к узлу pointOnSurfaceInfo. Узел возвращает данные о положении в глобальном пространстве координат U и V поверхности, независимо от непосредственных деформаций и иерархических изменений surfaceTest.

  2. Создайте локатор и назовите его connectTest. Введите в командной строке следующее:

connectAttr ($infoNode + “.position”) connectTest.translate;

Данные о положении узла pointOnSurfaceInfo соединятся с перемещением локатора. Вращайте, перемещайте и масштабируйте surfaceTest и посмотрите на поведение локатора connectTest. Даже при деформации геометрии он все равно будет следовать за surfaceTest. Он привязан к координатам U и V.

Просто ради забавы добавим атрибуты для изменения положение узла pointOnSurfaceInfo по U и V.

  1. Добавьте в локатор connectTest атрибуты positionU и positionV.

Чтобы найти первоначальное положение, мы сначала запросим его у узла pointOnSurfaceInfo, а потом соответственно установим положение connectTest по U и V. В конце мы соединим атрибуты. Потом можно будет изменить положение локатора на поверхности по U и V, изменив значения атрибутов positionU и positionV. Для настройки и создания соединений воспользуйтесь следующим кодом:

float $u = `getAttr ($infoNode + “.parameterU”);

float $v = `getAttr ($infoNode + “.parameterV”);

setAttr “connectTest.positionU” $u;

setAttr “connectTest.positionV” $v;

connectAttr “connecTest.positionU” ($infoNode + “.parameterU”);

connectAttr “connecTest.positionV” ($infoNode + “.parameterV”);

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

@Рис. 19.15. Локатор, соединенный с узлом pointOnSurface NURBS-сферы

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

Сухожилия

В мышечной системе сухожилия – это соединения между мышцами и костями. Этот тонкий слой представлен локаторами, определяющими начальную точку и точку вставки мышцы. Сухожилия, соединяя сокращающиеся тела мышц, вызывают кинематические движения костей. Именно эти соединения заставляют кости двигаться. Сухожилия в 3D не полностью повторяют анатомию своих реальных прототипов. Они представляют собой начальную и конечную точки мышцы.

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

@Рис. 19.16. Анимационная кривая ИК-манипулятора используется для определения мышечного напряжения

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

$a = jointA.rotation end value—-start value

Чтобы правильно найти $a, нужно взглянуть на анимационную кривую и определить, где она меняет направление (положительное или отрицательное). Значение $a – это разница между текущим и конечным значениями вращения.

$b = tension attribute range (.1 to 1)

$b – это напряжение и диапазон его значений.

$time = range of $a

$time в данном случае относится к числу кадров, необходимых $a для смены направления. Если значения jointA.rotateY начинаются с 45 и заканчиваются 90, то мы знаем, что $a = 45. Если же jointA.rotateY начинается в первом кадре и достигает пика (90) в десятом кадре, то $time = 9.

$speed = $a/$time

Чтобы определить интенсивность напряжения, нужно установить скорость вращения сочленения. Если $a = 45 и $time = 9, то $speed = 5. $speed потом можно встроить в масштаб от 1 до 10, причем 10 – самое высокое допустимое значение напряжения. Его можно умножить на .1, чтобы получить необходимы диапазон $b. Окончательный результат будет выглядеть так:

$b = (current value) + ($speed * .1)

В целях анимации диапазон значений анимированного напряжения может составлять 1/10 от диапазона значений $a (для легкого сокращения). Это означает применение анимации к атрибуту напряжения за один кадр до начала вращения $a, и окончание (1/10(+1)) одним кадром позже $time.

Например, если $a начинается в кадре 1, $b – в кадре 0, если $a = 45 и $time = 20, то $speed = 2,5. $b = текущее значение + .25 в кадре 0. Через 2 кадра $b возвращается к начальному значению (2 кадра – это 10% от $time), анимация кончается кадром 3.

Если вы еще не совсем поняли, вот вам сравнение: представьте, что вы участвуете в эстафете. Когда вам передают эстафетную палочку, вы срываетесь и бежите по беговой дорожке. В конце вашего пути другой бегун ждет эстафетную палочку. Когда вы приближаетесь к нему, он начинает бежать, пока его скорость не сравняется с вашей. Вы передаете ему эстафетную палочку и медленно сбавляете скорость, а он продолжает гонку. Представьте, что напряжение – это бегун в эстафете, который во время анимации передает мышцам энергию (рис. 19.17, 19.18 и 19.19).

@Рис. 19.17. Tension начинает движение раньше, чем kinematic driver

@Рис. 19.18. Kinematic driver наверстывает разницу

@Рис. 19.19. Tension останавливается, а kinematic driver продолжает движение

Анимируя напряжение для управления кинематическим вращением сочленений в Maya, можно добиться более реалистичной имитации кожи. В настоящей анатомии мышцы управляют костями, но в 3D все наоборот. При управлении напряжением мы все еще опираемся на анимацию вращения сочленений, но применяя напряжение до вращения, можно сымитировать управление мышцами и организовать действительно реалистичную работу сухожилий.

Жировой слой

Расстояние между высокополигональной моделью и мышцами – это жир. Настоящая жировая ткань образует некоторую форму и подрагивает, но в нашем случае это всего лишь пустое пространство между двумя точками. Жир нужен для поддержания объема тела персонажа в состоянии покоя. Если мышцы присоединяются непосредственно к коже, без дополнительного расстояния, то есть вероятность, что кожа потеряет вид и присосется к телу мышцы.

Это расстояние можно вычислить в Maya с помощью техники ray-casting. Ray-casting обычно делается во время рендеринга. Если смотреть с точки зрения камеры, то луч исходит от первого пикселя в строке развертки. Через крошечное окошко (размером в один пиксель) он проходит в 3D пространство в поисках поверхности для отражения и рендеринга. Так происходит пиксель за пикселем, пока не будет закончен рендеринг изображения.

Луч – это световая волна, поэтому при столкновении с предметами он отскакивает. Raycasting с пересечениями требует использования плагина, потому что с помощью стандартных инструментов нельзя испускать лучи от одной вершины до другой. Воспользовавшись этой идеей, можно создать плагин, вычисляющий толщину жирового слоя.

Вот пример работы узла Ray Intersection в Maya (рис. 19.20). Это просто наглядный пример, а не настоящий Ray Intersection!

  1. Создайте в Maya NURBS сферу и назовите ее muscle.

  2. Создайте два локатора. Один назовите castPoint, а другой – castGoal. Подчините локатор castGoal локатору castPoint.

  3. Создайте в любой точке сферы узел pointOnSurfaceInfo и соедините атрибут его положения с перемещением локатора castPoint.

  4. Прикрепите локатор castPoint к сфере ограничителем нормалей.

  5. Создайте еще одну сферу под названием skin и отмасштабируйте её так, чтобы cast оказался внутри нее. Создайте в сцене узел distanceBetween. Прикрепите точечными ограничителями локатор начального положения к castPoint, а локатор конечного положения – к castGoal.

  6. Теперь можете спокойно перемещать castGoal по его локальной оси X, изменяя расстояние между castPoint и castGoal. Если вам понадобиться переместить castGoal так, чтобы он пересекался с кожей, то можете найти расстояние между muscle и skin.

@Рис. 19.20. Пример кожного пересечения лучей; красная окружность показывает пересечение

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

Кожные решатели

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

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

Жир нужен для определения того, насколько далеко от точки на мышце может находиться точка соединения. Это не значит, что точка А привязана в пространстве к точке В. Точкой А может быть любая точка модели, но если она соединена с точкой В, то расстояние должно быть предварительно задано. Это обеспечивает скольжение кожи без потери объема. Скольжение может быть статичным, так как расстояние встроено в мышечный узел.

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

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

Для создания функционирующего кожного решателя можно применить различные математические алгоритмы. Самый полезный из них –Метод Эйлера. В нем каждая точка подобна частице с дифференциальными уравнениями, решением которых определяется расстояние между частицами и время каждого движения. Решатель также должен предусматривать демпинг, динамические силы и эластичность. Наконец, он должен предусматривать не участвующие в вычислениях точки, такие как кисти и стопы, где удобнее использовать кожный кластер.

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

Врезка. Метод Эйлера:

Метод решения стандартных дифференциальных уравнений с помощью формулы yn+1 = yn + hf(xn, yn)

Этим шагом метода делаются вычисления через интервал h, при этом используется производная только от начала интервала.

Методы с faux–решателями кожи

Если вы всерьез рассчитываете использовать в своем персонаже мышечную систему, то должны предусмотреть и вложения в некоторые плагины с более широкими возможностями. Если вы купите DVD «Character Custom Toolkit» от Alias, то у вас будет плагин muscleSkinDeformer, который для этого DVD написали Эрик Миллер и Пол Туриот. Узел muscleSkinDeformer позволяет использовать NURBS поверхности как зоны влияния на полигон с соединениями точек через прямые расстояния, во многом подобно приведенному выше примеру с жировым слоем. Разработка собственного плагина требует навыков программирования, равно как и хорошего понимания математики. Еще одна возможность – плагин slideBulge, который, в сущности, дает полигонам действовать на других полигонах как скульптурные деформаторы. Этот плагин можно бесплатно скачать с highend3d.com в разделе Maya  Plug-ins. Это приложение потребует использования полигональных форм для мышечных объектов. С эти проблем не возникнет, так как вы учли все правила в своей системе.

Последнее, что могут найти пользователи Maya – плагин MuscleTK, обладающий многими из перечисленных выше свойств. Он включает в себя простой инструмент для создания мышц двумя щелчками мыши, совсем как в этой главе. В нем также есть инструмент для подчинения начальной точки/точки вставки мышцы непосредственно другим мышцам, так что одни мышцы могут легко управлять другими. MuscleTK предлагает собственный метод скиннинга для вычисления параметров кожи, которая накладывается прямо на обычную сглаженную кожу. Можно также настроить веса узла muscleSkin и добиться скольжения кожи. Этот плагин сейчас можно скачать с Web-сайта CGToolkit.com за $99. К нему прилагается полная документация и полный комплект мышечных плагинов.

Некоторые из этих вариантов не являются в полноценными кожными решателями, но для организации взаимодействия мышц и кожи это хорошая альтернатива деформаторам. В данный момент решатели с широкими функциональными возможностями можно, вероятнее всего, найти среди профессионального производственного инструментария. Если вы действительно хотите совсем отказаться от плагинов, то просто добавьте мышцы как объекты влияния на сглаженную кожу, а затем соответственно настройте их веса. Это медленный и тонкий процесс, но это возможно. Мы советуем вам сперва посмотреть, что можно откопать из бесплатных разработок, и только потом подумать о небольшом вложении в чей-то тяжелый труд.

Мышечные системы и кожные решатели создавать сложно; сложно и работать с ними. В настоящее время они для нас в диковинку, и мы лишь недавно получили возможность применять алгоритмы, необходимые для правдоподобных имитаций кожи и мышц. Результаты впечатляют. Разные типы мышечных систем используются во многих современных трехмерных персонажах. Создать реалистичную кожу со скольжением пока трудно, и разработка решателя для точных вычислений кожи – дело весьма непростое.

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

Благодарности 2

Брэд Кларк 2

Джон Худ 3

Джо Харкинс 3

Авторы также хотели бы отдать должное заслугам следующих людей: 3

Создание основных персонажей 4

Об авторах 4

Брэд Кларк 4

Фильмы: 4

Телевизионные проекты: 4

Сфера интерактивных развлечений: 4

Джон Худ 5

Фильмы: 5

Сфера интерактивных развлечений: 5

Джо Харкинс 5

Телевизионные проекты: 6

Введение 6

Риггер следующего поколения 6

Для кого эта книга 6

На что в Персонажных Риггерах смотрят студии 8

Будущие технические режиссеры сегодня 9