Создание скелета в 3ds max

Обновлено: 06.07.2024

В этом уроке я подробно расскажу, как правильно построить и настроить скелет. Мы рассмотрим детали этого, казалось бы, простого процесса и научимся пользоваться основными инструментами. Полученный скелет можно будет использовать для дальнейшего процесса рига или для иных целей. Так же, всё, что тут описано, являются необходимыми условиями для моего скрипта авторига (скрипт авторига гуманоидоподобных существ. Подробнее в документации скрипта). Но они при этом весьма стандартны и подойдут для других ваших целей. Все этапы снабжены сценами *.mb из maya 8.5. Так что, если вы потеряетесь, то всегда сможете свериться с ними.

Что в этом уроке:

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

Для кого этот урок:

  • новички и не совсем новички в анимации
  • те, кому не хочется тратить время на изучение рига
  • те, кому хочется сэкономить 3 - 4 дня на создание рига
  • в каком-то смысле, это ещё и урок MEL и сетапа. Мой скрипт не содержит каких-то сложных моментов, все функции описаны в help-е и их названия легко дают понять, что я использую в данный момент.

Начало. (Файл start.mb)

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


Итак, наш персонаж. Модель расположена в начале координат, направлена по оси Z. Руки и ноги немного согнуты – это необходимо для корректного задания направления для ikHandle. Либо, если конечности совершенно прямые, вам будет необходимо задавать направления вручную.


Начнём строить скелет. Что нужно помнить:

  • суставы обязаны иметь нулевые значения вращения. Никогда не вращайте суставы при построении скелета.
  • при активном инструменте создания суставов у вас есть возможность двигать текущий сустав средней кнопкой мыши. Пользуйтесь этим.
  • если вам нужно сдвинуть сустав в середине иерархии, у вас всегда есть кнопка Insert. Так вы передвинете сустав на нужное место, не затрагивая другие суставы скелета.
  • помните, что скелет – иерархия суставов. Т.е. скелет это шарниры, которые отображаются в виде шариков во вьюпорте. Треугольные соединения между ними ("кости") не играют никакой роли – они только показывают, как два сустава расположены в иерархии. Можете войти в Outliner и убедиться, что это действительно так. Поэтому, можете мысленно крутить эти шарики и, вместе с ними, соответствующую массу тела персонажа, чтобы лучше понять, где расположить сустав.

Перед построением скелета не помешает оторваться от монитора и нарисовать на бумаге своего персонажа. Схематично наметить основные кости и суставы. Представить, как персонаж будет двигаться. И только потом сесть за компьютер.


Построим сустав грудной клетки. Если вы пользуетесь моим скриптом, то хотя бы один такой сустав у вас должен быть. Или если у вашего персонажа есть грудная клетка.


Построили суставы в середине, теперь переходим к рукам.


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

Так же не забываем, что в окне перспективы можно войти в режиме wireframe или X-ray для того, чтобы рассмотреть со всех сторон сустав и массы персонажа. Это поможет вам поместить сустав на его место. Сустав плеча старайтесь расположить в центре массы плеча персонажа. Сустав локтя располагаем точно посередине лупов для сгиба.



Идём дальше. Строим суставы для пальцев. В середине ладони расположим сустав, от которого будут идти суставы пальцев. Первыми стройте суставы того пальца, который находится на одной линии с рукой. В данном случае это средний палец. Видите, у нас получилась почти прямая линия из суставов. Теперь можно взять основание среднего пальца и скопировать нужное число раз (ctrl+D). Суставы кончиков пальцев можно расположить, используя привязку к вершинам.


Суставы большого пальца можно отпарентить от общего основания и припарентить к суставу кисти (выбираем основание большого пальца – Unparent, добавляем к выделению сустав кисти – Parent).


Точно так же строим сустав таза, от которого будут идти ноги. Если вы используете мой скрипт, то совсем не обязательно наличие пальцев на ногах. Главное, чтобы была лодыжка и, так называемый, ball joint.

Итак, мы построили половину скелета. (Файл half_skelet.mb).


Но сначала самое главное – нам нужно тщательно переименовать все суставы. ВСЕ суставы, ВСЕ объекты рига, да и вообще все объекты сцены должны иметь уникальные вменяемые имена. Если это левый сустав бедра, то так и пишем “L_hip_jnt”. Никаких joint125 или sphere67.

- вы легко ориентируетесь в объектах

- вы можете писать скрипты, работающие с объектами определённым образом. У вас не будет ситуации, когда в одной иерархии будет несколько объектов с одинаковыми именами.

- соответственно, сторонние скрипты работают корректно

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

Схема того, что должно у вас получиться:


Мой скрипт поддерживает персонажей с такой иерархией суставов (ну ещё можно добавить хвост). Поэтому, если вы будете им пользоваться, то проверьте скелет персонажа.

Переименованный скелет можно посмотреть тут: (Файл half_renamed.mb).

Теперь можно заняться ориентацией суставов.



Для начала отпарентим бедро и ключицу от центрального скелета. Выберем первый сустав спины и выделим всю иерархию (select hierarcy). Запустим скрипт.

World Up Dir задаёт вектор на который будут ориентироваться локальные оси объектов.

Aim Axis – та локальная ось, которая будет смотреть на потомка.

Up Axis – та локальная ось, которая смотрит в направлении World Up Dir.


Aim Axis у нас всегда X. World Up Dir выставляем так, чтобы все суставы смогли ориентироваться этому направлению уменьшая хаотичность результата. Например, сейчас мы хотим, чтобы локальная ось Z стремилась в направлении World Up Dir. Если мы выберем ось Z в качестве World Up Dir, то в данном примере всё будет хорошо, но если у вашей модели позвоночник сильно перекручен в плоскости YZ? По этой же причине мы не выбираем ось Y. Выберем ту ось, по которой меньше всего деформаций – ось X. И все суставы своими осями Z могут единообразно стремится в этом направлении.



Скрипт позволяет вручную редактировать локальные оси. Для этого в окне Tweak наберите небольшое значение (например, 5 градусов) для нужной оси (направляющая у нас всегда X поэтому пишем в первом прямоугольничке "5"). Выделяем нужный сустав и жмём на "Manual+" или "Manual-".

Сейчас мы редактируем то, как будут гнуться суставы. Согните у себя на руке палец и представьте, что будет, если бы какой-то нерадивый вдруг сделал так, что палец теперь гнётся куда-то в бок, а не внутрь ладони. Вам бы не хотелось, правда? Поэтому повертите суставы по осям – посмотрите, туда ли они гнутся. Если нет, подправьте. Главное, не забудьте обнулить вращение, перед тем, как редактировать локальные оси.


Аналогично я повернул немного оси на суставах пальцев.

Teперь настраиваем суставы ног.


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



Этот шаг не совсем обязательный но … Мы могли в самом начале выбирать не первый сустав спины, а базовый сустав. Тогда бы все центральные суставы были соорентированы. Но вы можете захотеть оставить базовый сустав с локальными осями, совпадающими с мировыми координатами. Тогда нам нужно будет разорвать связи между базовым суставом и спиной, а так же отпарентить сустав таза. Теперь припарентим базовый сустав к тазу и ориентируем только его. Базовый сустав остаётся в нетронутом виде. Теперь восстановим связи.

Ориентированный скелет можно посмотреть тут: (Файл orientedJoints.mb)

Вот, практически всё. Теперь, у вас может возникнуть потребность разделить "кости" рук и ног на сегменты. Например, для последующего рига. Мой скрипт не оговаривает количество сегментов в костях конечностей. Но, 3 - 4 сегмента позволят растягивать конечности более корректно. То же касается поворота кистей и предплечья.

Для того чтобы ровно вставить сегменты, можно создать следующую конструкцию. Берём 2 круга и столько локаторов, сколько у нас будет сегментов. Присоеденим локаторы к кругам через pointConstraint, выставляя нужные веса. Теперь локаторы всегда ровно делят расстояние между кругами. Используя привязки, ставим круги на нужные суставы, а новые сегменты строим через insertJoint, также используя привязки.


Теперь восстановим связи конечностей и центрального скелета. Отзеркалим конечности (выделяем, например, сустав ключицы и зеркалим через Mirror joint со значениями по умолчанию. Не забудьте выставить автоматическое переименование с L_ на R_).


На этом построение скелета закончено. (Файл finalSkeleton.mb)

Можно привязать к получившемуся скелету нашего персонажа. Для скининга удобно использовать skinnyTools. Очень удобный инструмент – включает в себя как разрисовку весов, так и покомпонентную работу. Ну и много удобных вещей, собранных в одно место.

Прискиненого персонажа можно посмотреть тут: (Файл ReadyToRig.mb)


Все! Теперь вы можете начать процесс рига. Или, если вам лень, или вы не знаете как, то можете воспользоваться, например, моим скриптом авторига. Если вы сделали всё правильно, то он у вас запустится.


Полностью готовый к анимации персонаж: (Файл FIN.mb). Скрипт авторига можно взять тут: (Файл MBcatAutoRig.rar).

Спасибо halinka за помощь в оформлении. Спасибо, что дочитали до конца. Надеюсь, урок оказался полезным.

Здравствуйте! В данный момент на Хабре существует большое количество статей, посвящённых компьютерной графике и реализации различных эффектов, однако текстов на тему реализации скелетной анимации (особенно "с нуля") достаточно немного. Постараюсь восполнить этот пробел с помощью данного текста с описанием технологии и примером несложной реализации на C++ и OpenGL 4.5 (SDL2).


Введение

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

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

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

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

Иерархия частей в таком случае могла выглядеть, например, так:

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

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

Подготовка модели на этапе дизайна

Рассмотрим обзорно процесс подготовки модели к анимации на этапе дизайна.

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

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

На изображении ниже продемонстрирована структура и визуализация скелета трёхмерной модели человека (взята отсюда) при редактировании в Autodesk 3ds Max. Хотя на данной визуализации кости имеют объём, на самом деле они являются точками с привязанными системами координат, что будет более подробно описано ниже.


Как можно заметить, каждая кость скелета имеет родительскую кость. Корневая кость является исключением. Родительским объектом для неё является локальная система координат модели. Стоит заметить, что в общем случае 3D-редакторы позволяют размещать несколько моделей на сцене, но здесь системы координат сцены и модели совпадают.

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

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


Здесь стоит обратить внимание на позу, в которой скелет привязывается к модели (персонаж находится в стоящей позе, руки вытянуты в стороны). Данная поза называется T-позой (так как напоминает букву T) или bind-позой и обычно используется дизайнерами при скиннинге в силу удобства при назначении весов и дальнейшем анимировании.

Анимация модели на этапе дизайна

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

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


При перемещении, повороте, масштабировании кости меняют положение все привязанные к ней вершины в соответствии с назначенными весами, а также все дочерние кости.

Когда анимационный клип готов, его можно экспортировать вместе с геометрией модели в одном из форматов, поддерживающих скелетную анимацию, например FBX или COLLADA. Рассмотрение данных форматов не относится напрямую к данной статье. Для работы с данными форматами (и многими другими) можно использовать библиотеку assimp.

Позиционирование модели

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

С точки зрения математики кость представляет собой систему координат, заданную относительно системы координат родительской кости или модели для корневой кости. Для задания кости можно использовать матрицу или SRT-структуру (scale, rotation, translation — масштаб, поворот, перенос/позиция). Масштабирование на практике применяется к костям не очень часто, поэтому в дальнейшем будем считать, что для костей задаются только поворот и позиция относительно родителя, и будем хранить RT-структуру (без R-компонента). Для представления поворота будем использовать кватернионы.

Исходя из этого, на самом деле не очень правильно использовать в данном контексте слово "кость", так как здесь она представляет собой всего лишь материальную точку. Более правильным было бы использовать слово Joint (сустав, соединение), однако со временем данные понятия стали практически взаимозаменяемыми.

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

Обозначим матрицу перехода из системы координат кости в систему координат её родителя как , где — индекс кости, а — индекс её родительской кости. Для родителя корневой кости будем использовать индекс , символизирующий локальную систему координат модели в целом. Данную матрицу можно получить из RT-структуры как комбинацию матриц поворота и перемещения.

Другой важной характеристикой кости будет являться матрица перехода из пространства модели в систему координат кости в bind-позе (inverse bind pose matrix). Обозначим её за . Данная матрица создаётся на этапе привязки скелета и больше не изменяется.

Позицию вершины в bind-позе (xyz-вектор) обозначим за , а искомую позицию в анимированной позе — .

Рассмотрим на примере следующего скелета:


Пусть мы имеем вершину, привязанную к кости 3 и хотим её позиционировать в соответствии с положением костей. Последовательность преобразований будет выглядеть так:


Другими словами, сначача мы переводим координаты вершины в систему координат кости 3 в bind-позе с помощью матрицы , а затем последовательно применяем матрицы преобразований костей, следуя к корню скелета.

Так как на данном этапе система координат корневой кости не совпадает с системой координат модели, также требуется преобразование .

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

Для уменьшения количества матричных умножений в этом случае удобно сгенерировать так называемую матричную палитру (matrix palette), в которой для каждой кости хранится предварительно посчитанное произведение матриц bind-позы и матриц перехода. Данное произведение также представляет собой матрицу и позволяет для заданной вершины за одно умножение выполнить переход из bind-позы в анимированную позу.

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

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

Проигрывание анимации

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

Реализация

Итак, настало время переходить к непосредственной реализации. Рассмотрим структуры данных, которые можно использовать для хранения анимированной модели и для проигрывания анимации.

Для работы с векторами, матрицами, кватернионами и другими математическими объектами будем использовать библиотеку glm.

Начнём с костей. Для их хранения создадим следующую структуру:

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

Скелет будет представлять собой обычный массив костей (удобно будет заполнять этот массив так, чтобы дочерние кости находились в нём после родительских):

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

Номер кадра в данных структурах на самом деле по своему смыслу — целое число, но для использования в дальнейших расчётах будем хранить его как float .

Используя данные структуры, можно загружать и хранить в памяти скелеты и клипы для них. Перейдём непосредственно к анимации. Определим структуры для хранения текущей позы отдельных костей и скелета в целом.

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

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

Данная функция будет являться аналогом матричного умножения для RT-структур и может быть использована, например, при реализации пост-обработки анимационных клипов.

Определим структуру матричной палитры:

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

Теперь можно переводить модели в произвольные позы с помощью скелета. Осталось реализовать механизм проигрывания анимации во времени и связать данный механизм с отрисовкой модели.

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

Далее, реализуем простой метода, который увеличивает счётчик прошедшего с начала анимации времени:

Данный метод имеет единственный параметр — приращение времени. Внутри происходит увеличение значения счётчика прошедших с начала анимации кадров (получить вещественный номер кадра в данном случае — нормальное явление).

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

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

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

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

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

  • Текущий кадр является ключевым. Просто используем значение в нём.
  • Текущий кадр находится между двумя ключевыми кадрами. Интерполируем значения в них в соответствии с тем, к какому кадров находимся ближе. Если мы находимся в положении , а соседние кадры в положениях и соответственно, то коэффициент интерполяции можно расчитать по формуле .
  • Ключевого кадра справа или слева от текущего не существует. Здесь нет однозначного способа разрешения проблемы. В таком случае можем, например, вернуть значение из ближайшего существующего кадра или принять недостающий кадр за отсутствие преобразований (нулевой вектор позиции, единичный кватернион);

Используя предположение о том, что ключевые кадры хранятся в порядке увеличения времени, для поиска соседних кадров можем использовать бинарный поиск.

Осталось определить недостающие методы для интерполяции векторов и кватернионов ( getInterpolatedValue() ), для получения позиции или ориентации из ключевого кадра ( getKeyframeValue() ) или значения по-умолчанию ( getIdentity ).

Как упоминалось выше, для интерполяции векторов используется обычная линейная интерполяция ( glm::mix() ), а для кватернионов — сферическая линейная интерполяция ( glm::slerp() )

Отрисовка анимации

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

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

Заметим, что и индексы, и веса костей хранятся как целые однобайтовые числа. Так как изначально вес представляет собой вещественное число от 0 до 1, придётся выполнить переход к границам от 0 до 255 и округление. В данном случае к одной вершине можно привязать до 4-х костей одновременно.

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

Модификации вершинного шейдера:

Где-нибудь в коде обновления состояния сцены будем увеличивать счётчик анимационного клипа:

А в коде отрисовки будем получать матричную палитру и передавать её в шейдер:

Заключение

Таким образом, в данной статье была рассмотрена базовая реализация скелетной анимации на C++. Демо-видео под спойлером.

Полный код можно посмотреть здесь. В sources/main.cpp выполняется инициализация OpenGL, загрузка ресурсов, обновление состояния сцены и отрисовка. Реализация анимации находится в sources/Animation .

Буду рад ответить на вопросы, а также получить объективную критику и замечания.

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

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

Для каждого персонажа необходимо создать скелет, благодаря которому его движения будут максимально правдоподобными. Процесс создания и настройки костей называется риггинг ( Rigging ), за ним следует скиннинг ( Skinning ) – привязка скелета к его модели.

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


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

Скелет может строиться при помощи классических костей, связанных между собой иерархически. Также 3 ds Max Мах предлагает встроенные модули Biped и CAT (Characters Animation Tools) для создания боле е сложной, специализированной системы костей. Кости скелета пребывают между собой в иерархической связи, что позволяет поделить их на родительские и дочерние. Когда вы обозначаете определенный элемент как «родитель», он получает силу при любых перемещениях и движениях тянуть за собой «детей». Обеспечить органичные движения костей можно двумя типами связи: прямой кинематикой и обратной. Прямая кинематическая связь основывается на зависимости перемещений дочерних объектов от родительского. Обратная опирается на математический алгоритм, который просчитывает движения объектов, независимо от иерархии.

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


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

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

Создавая реалистичную анимацию, очень важно придерживаться 12 принципов, предложенных диснеевцами Олли Джонстоном и Франком Томасом .

Первый. Сжатие и растяжение – необходимо подчеркивать эластичность объектов.

Второй. Отказное действие – перед совершением какого-либо действия персонаж делает подготовительное движение. Например, глубокий вдох перед задуванием свечи.

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

Четвертый. Фазованное движение – в 3 ds Max движение разбивается на кадры автоматически, вам, в свою очередь, необходимо отслеживать, насколько органичен результат.

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

Шестой. Смягчение начала и завер шения движения – поэтому действие должно состоять из большего количества рисунков в конце и в начале.

Седьмой. Дуги – как и в приро де, в анимации многие движения следуют дуговой траектории.

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

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

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

Одиннадцатый. Профессиональный рисунок – человек, создающий 3 d -модели для анимации, обязан уметь рисовать, понимать основы анатомии, физики, баланса света и тени.

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

__CONFIG_colors_palette__<"active_palette":0,"config":<"colors":<"46295":<"name":"Main Accent","parent":-1>>,"gradients":[]>,"palettes":[>,"gradients":[]>,"original":<"colors":<"46295":<"val":"rgb(19, 114, 211)","hsl":<"h":210,"s":0.83,"l":0.45>>>,"gradients":[]>>]>__CONFIG_colors_palette__Полная настройка и риг персонажа в 3ds Max

Новые статьи, новые видеоуроки, полезности

Содержание блога

Здесь находится аттестат нашего WM идентификатора 154784100625
www.megastock.ru

Если вы решили заниматься персонажной анимацией, то вам необходимо знать что такое риг персонажа в 3ds Max. Также, в дополнении к теме риггинга, рекомендую прочитать статью "Риггинг лица персонажа в 3ds Max с помощью системы CAT".

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

Итак нам нужно вставить скелет внутрь нашей трехмерной модели. Для 3ds Max существует несколько готовых решений для выполнения этой задачи. Яркими примерами встроенных в программу таких дополнений для риггинга (rigging) служат Character Studio и CAT (Character Animation Toolkit). Это хорошие инструменты для быстрой настройки скелета. В большинстве случаев при создании анимации вполне хватает их функционала. Эти плагины являются прекрасными помощниками для оснастки (character setup) большого количества персонажей.

character-studio-cat

А как же быть, если вам нужно создать более сложную анимацию? Например, для портфолио? Как правило аниматоры, работающие над своим портфолио для представления будущим работодателям, делают упор не на количество персонажей в сцене, а на качество анимации. Достаточно двух, трех героев и креативной идеи, чтобы удивить зрителя и не оставить его равнодушным.

В этом случае, чтобы сделать хороший риг в 3ds Max, правильным решением будет создание скелетов вручную (Custom Skeleton). Зачем, – спросите вы, – ведь есть же CS и CAT? Давайте разбираться. Во-первых, у вас появляется возможность индивидуальной настройки скелета для каждого персонажа. Во-вторых, кастомный скелет более гибкий в управлении, чем те, которые предлагают плагины. В-третьих, управление контроллерами в процессе анимации, более предсказуемо. Естественно, профессиональный риг – залог того, что при создании анимации проблемы сведутся к минимуму.


Видеоуроки, которые я вам представляю сегодня, показывают полный путь создания профессиональной оснастки персонажа в 3ds Max.

Поделитесь этим постом в соцсетях

Похожие посты

Hair and Fur. Создание и анимация волос в 3ds Max с помощью модификатора Cloth

Риг мимических морщин в 3ds Max и Photoshop, карта Bump, Reaction Manager

Захват движения и анимация лица. Motion Capture

Продолжаю риггинг по Вашим урокам и при настраивании в Reaction Manager ног у Вас в уроке стоит значение -90 ( при выделении Rectangle001 ) , у меня же при выделении Rectangle001 значение 0 , возможно ли такое или что-то где-то не верно сделал?

Да, Артем! Сейчас все правильно. Только вы невнимательны. Я ведь не просто так написал вам, чтобы вы внимательно пересмотрели уроки. Вы пропустили еще одну маленькую косточку вверху цепочки ноги. БУДЬТЕ ВНИМАТЕЛЬНЫ!

П.с. Я правильно понимаю: первый раз вы кликнули левой кнопкой мыши ( в тазе ) , потом левой кнопкой мыши в коленях и последний клик левой кнопки мыши был в стопах и там же правый ?

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

Здравствуйте, Артем. Посмотрите еще раз внимательно урок. Размер кости вы устанавливаете в настройках. На вашем скриншоте кости очень большие. При создании кости, вы просто кликаете мышкой в тех местах, где должен разместиться сустав. Последняя маленькая косточка создается автоматически после клика по ПРАВОЙ кнопке мышки.

P.s. Все делал , что Вы говорили в уроке ( модель заморожена ).

А,понятно. Ладно,какрас есть подходящая для этого урока моделька. Пожалуй пора выполнять уроки. 🙂

Здравствуйте, Артем! К сожалению модели не было к этим урокам. Только скрипты. Предполагалось, что человек будет применять риг из уроков к своей модели. 🙁

Прошу прощения,можете скинуть прямую ссылку на модель ? Скрипты скачал, а вот модель найти никак не могу. =(

Заранее благодарю. 🙂 И еще раз огромное спасибо за уроки!

да все Разобрался спасибо большое. )))))) причина была в том что я написал En и Th, а нужно было an и th)))и еще хочу добавить что нужно было писать оказывается с маленькими буквами))))с большими такая же ошибка))))Спасибо.

Здравствуйте, Тагир! Скорее всего, когда вы применили Assign to Controller, то ошиблись, выбирая объект назначения. Внимательно проверьте тому ли объекту вы назначили контроллер.

Здраствуйте я все сделал по вашему уроку и у меня тут одно не совпадения на 3 вашем уроке проходит ваша тема как раз про
if ((length (an-th)-con)/2>0,
(length (an-th)-con)/2,0)
я все в точ в точ сделал и у меня выходит ошибка когда я нажимаю EVolume
написано там вот это if ((length (an

Используя переключатель, вы не имеете возможности создавать ключевые кадры на ik/fk. Поэтому используют систему контроллеров. Ответы на элементарные вопросы можно поискать в интернете. Удачи вам!

Здравствуйте Евгений!Я извиняюсь меня мучают масса вопросов( но задам один.. fk ik режимы,зачем они при вайринге руки в attribute holder? можно просто связать Hisolverom кости руки а ik chain соответственно с контроллером и манипулируй себе как хош) или же есть смысл,я заметил,что других уроках тоже используют эту систему с переключателем fk ik. Заранее спасибо за ответ!)

Для того, чтобы повернуть или переместить какие-нибудь кости, надо вращать или перемещать контрольные объекты, которые управляют этими костями. А если вам надо повернуть или переместить весь персонаж, то надо двигать или вращать основной контрольный объект, расположенный в самом низу у ног, к которому привязаны другие контролы.

спасибо большое за ответ.. Спину и шею)

Привет, muhammad! Объясните, пожалуйста, подробнее, как вы хотите повернуть персонаж. Полностью все тело или только спину и шею?

Дмитрий, вы можете открыть мой скрипт в любом текстовом редакторе, и глядя на уже существующие строчки, написать свои или изменить те, которые уже есть. Советую вам использовать вместо стандартного Attribute Holder, скрипт Пола Нила PEN_Attribute_holder_2.06
Его можно скачать на сайте автора бесплатно.

Здравствуйте) У меня такой вопрос появился. Возможно ли настроить кнопки и ползунки модификатора Attribute Holder так же хитро , как у вас, только самому вручную? Или придется ограничиться единственным стандартным свитком Custom Attributes?
P.S. Использовать ваш скрипт у меня получилось. Интересуюсь исключительно для развития)

Дмитрий sen-say, спасибо! 🙂 🙂

Просто за небольшим стрейчем можно случайно не уследить. В результате искажение ) Но за советы спасибо, учитель! Буду разбираться дальше.

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

Спасибо большое за урок. У меня такой вопрос. Как сделать, чтобы при манипуляции контрольными объектами, кости спины и ног не растягивались?

Ну вот с переврташами я справился проста надо было нажать фриз трансформ и ик стали норм ставится )!! а вот что и как делать с этими костя ми я даже не знаю (! проста если вешать ик то уже другие кости не подвигать что бы убрать дугу !

Это так просто не сделать. Это отдельная тема для целого курса. В одном комментарии не объяснить.

Спасибо. Очень подробный урок.

Еще раз здравствуйте. У меня вопрос по этому скрипту
if ((length (an-th)-con)/2>0,
(length (an-th)-con)/2,0)
он та работает, но я его не очень понял. Это условный оператор if-then ? Что такое length (an-th) ? это расстояние между an и th ? То есть, если разница между расстоянием от an до th и нашей константы (con) поделенная на два больше нуля, то выполняем (length (an-th)-con)/2,0). В float expression есть Function List но он мне не очень помог. Оно то скорей всего элементарно, но что то я ни как не соображу. Я был бы очень вам благодарен за разъяснения

Ну, я рад за вас. Вы даже не представляете сколько раз мне приходилось все переделывать и начинать сначала! Это издержки нашей профессии. Пока шишку не набьешь, ничему не научишься.

В общем, переделал все заново, (использовал Parameter Editor) все получилось.Так и не разобрался почему выскакивала ошибка.
P.S. Спасибо вам за такое полезное видео )))

А зачем удалять косточку? Она не мешает. Можно создать слой в менеджере слоев с названием Hidden и поместить в него все объекты, которые вы хотите спрятать, а потом просто отключить видимость этого слоя. Риггинг животных делается точно по такому же принципу, что и риг человека. Действия одни и те же.

Хочется увидеть риггинг животных. Риггинг костями в максе.
А еще в уроке foot bones не понятно зачем у кости bones на кончике маленький ромбик.
Когда кость построена, он появляется в конце. Если не путаю, так и называется end bones.
Некоторые сетаперы его удаляют,наверное он не нужен?

Евгений, вы могли бы записать ещё уроки по риггингу?

Ну вот! Сами спросили и сами ответили! Славно пообщались. 🙂

Подскажите, а где можно взять скрипты примененные в этом видео? я весь инет облазил но скрипт 2FootControlsCa так и не нашел. Можете ли вы выслать его и все необходимые для создание скелетной анимации скрипты?, заранее спасибо.

))) всё, нашел кнопку Download на этой страничке))) как то она до этого промеж глаз попадалась)))

спасибо за ответ

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

Евгений, имеет ли смысл изучать Biped? Или это уже устаревшая технология рига?

Читайте также: