Скинированные меши: Skin, Skeleton

Скинированные меши: Skin, Skeleton

Скинированные меши — это важная часть в компьютерной графике, особенно в контексте создания анимаций и 3D-моделей. Эти меши используют концепцию скелетной анимации, при которой геометрия модели связана с внутренней костной структурой (скелетом), что позволяет создавать более естественные и динамичные движения. В PlayCanvas скинированные меши реализуются с использованием объектов типа skin и skeleton.

Структура скинированных мешей

Модель скинированного меша состоит из двух основных компонентов:

  1. Скелет (Skeleton) — это иерархия костей, которые определяют, как должны двигаться части модели.
  2. Кожа (Skin) — это геометрия модели, которая привязана к костям и изменяется в зависимости от их положения и вращения.

Каждый из этих компонентов играет свою роль в процессе анимации и рендеринга скинированных мешей.

Скелет (Skeleton)

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

В PlayCanvas объект skeleton представляет собой массив костей, где каждая кость имеет уникальную идентификацию и хранит информацию о своём положении, вращении и масштабировании. Таким образом, при изменении положения или ориентации кости, модель, привязанная к этой кости, будет также изменять своё положение или ориентацию в пространстве.

Основные свойства скелета:

  • bones: Массив объектов, каждый из которых представляет одну кость. Кости могут иметь свойства, такие как трансформация, родительские и дочерние связи.
  • bindPose: Исходное положение костей, которое сохраняется для восстановления начальной позиции при изменении трансформаций.
  • inverseBindPose: Обратные преобразования для каждой кости, которые используются для трансформации вершин кожи относительно скелета.

Кожа (Skin)

Кожа (или skin) — это внешняя геометрия модели, которая деформируется с учетом движений костей. Каждый вершинный элемент в коже привязан к одной или нескольким костям через веса. Эти веса определяют, насколько сильно каждая кость влияет на положение вершины. Процесс деформации вершин кожи на основе движений костей называется скинингом.

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

Основные компоненты кожи:

  • vertex weights: Веса, которые определяют влияние каждой кости на вершину. Эти веса могут быть нормализованы, и их сумма для каждой вершины обычно должна равняться 1.
  • bindPose: Исходное положение вершины до применения трансформации костей.
  • vertex positions: Геометрия модели, которая будет деформироваться в процессе анимации.

Принцип работы скинированных мешей в PlayCanvas

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

  1. Загрузка и создание скинированного меша: При загрузке 3D-модели в PlayCanvas, которая содержит скинированные меши, система автоматически выделяет компоненты skin и skeleton. Каждая кость в скелете будет связана с набором вершин в скине.

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

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

Пример кода для работы с скинированными мешами в PlayCanvas

// Загружаем модель с скинированным мешем
var model = new pc.Model();
model.resource = "path/to/your/skinned/model.glb";

// Применяем скелет и скин
var skeleton = model.resource.skeleton;
var skin = model.resource.skin;

// Применение анимации для скелета
var animation = new pc.AnimationComponent();
animation.addClip("walk", walkClip);
model.addComponent(animation);

// Воспроизведение анимации
animation.play("walk");

// Обновление скинированного меша
model.update(dt);

В данном примере создается объект модели, загружается скин и скелет, затем добавляется анимация и проигрывается её клип.

Заключение

Использование скинированных мешей в PlayCanvas позволяет создавать реалистичные и динамичные анимации для 3D-моделей. Компоненты skin и skeleton предоставляют мощный механизм для работы с костной анимацией, позволяя точно управлять движениями и деформациями геометрии. Правильное использование этих компонентов открывает широкие возможности для создания сложных анимаций и взаимодействия с персонажами в 3D-пространстве.