Morphing: blend shapes, управление весами

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

Что такое blend shapes?

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

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

Основы работы с blend shapes в PlayCanvas

PlayCanvas поддерживает работу с blend shapes через систему сущностей и компонентов. Основными объектами для работы являются:

  • Модели (mesh models), которые содержат геометрию объекта.
  • Blend shape — каждая форма представляет собой набор вершин, которые изменяют исходную модель.
  • Component Morph — компонент, через который управляются весами и трансформациями blend shapes.

Для работы с blend shapes необходимо создать несколько форм для модели, с которыми будет производиться интерполяция. Эти формы можно создать в сторонних 3D-редакторах, таких как Blender или Maya, и затем экспортировать их в PlayCanvas.

Настройка Blend Shapes

Каждый объект модели может содержать несколько blend shapes, каждая из которых соответствует определённой деформации. Важно понимать, что каждая форма blend shape должна быть заранее определена в 3D-редакторе, и экспортировать её нужно вместе с моделью в формате, поддерживающем такую информацию, например, FBX.

После того как модель импортирована в PlayCanvas, можно настроить веса для каждого blend shape. Для этого используется компонент Morph.

Пример добавления компонента Morph:

var entity = new pc.Entity();
entity.addComponent('model', {
    type: 'asset',
    asset: modelAsset
});
entity.addComponent('morph', {
    morphTargets: modelAsset.resource.morphTargets
});

В этом примере modelAsset — это ссылка на ассет модели, который содержит morph targets. После добавления компонента Morph, можно работать с весами для изменения формы объекта.

Управление весами

Для управления blend shapes в PlayCanvas используется интерфейс компонента Morph, который предоставляет доступ к весам каждого blend shape. Веса обычно находятся в диапазоне от 0 до 1, где 0 означает отсутствие деформации, а 1 — полное применение формы. Программно можно изменять веса, чтобы плавно менять форму объекта.

Пример изменения веса для определённой формы:

var morph = entity.morph;
morph.setWeight(0, 1.0);  // Полное применение первой формы
morph.setWeight(1, 0.5);  // Половинное применение второй формы

Здесь setWeight принимает два аргумента:

  • Индекс формы, для которой задаётся вес.
  • Значение веса (от 0 до 1), определяющее степень деформации.

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

Применение Blend Shapes в анимациях

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

Пример создания анимации с использованием blend shapes:

var startTime = Date.now();
var morph = entity.morph;

function updateMorph() {
    var elapsedTime = (Date.now() - startTime) / 1000;
    var weight = Math.sin(elapsedTime * Math.PI) * 0.5 + 0.5; // Плавное изменение веса от 0 до 1
    morph.setWeight(0, weight);
}

app.on('update', updateMorph);

В этом примере используется синусоидальная функция для плавного изменения веса blend shape, создавая эффект “пульсации”. Такой подход можно использовать для создания более сложных анимаций, например, для изменения выражений лиц персонажа в зависимости от времени или событий.

Работа с несколькими Blend Shapes

Когда необходимо управлять несколькими blend shapes одновременно, можно использовать массивы или другие структуры данных для хранения весов. Например, если у объекта есть несколько форм для изменения лица, можно комбинировать их веса для создания сложных выражений.

Пример работы с несколькими формами:

var morph = entity.morph;
var weights = [0.0, 0.5, 1.0];  // Массив весов для разных форм

for (var i = 0; i < weights.length; i++) {
    morph.setWeight(i, weights[i]);
}

Здесь для каждой формы устанавливается индивидуальный вес из массива weights, что позволяет одновременно контролировать несколько blend shapes.

Оптимизация работы с blend shapes

Одним из важных аспектов при использовании blend shapes является их оптимизация. Модели с множеством blend shapes могут иметь большой объём данных, что может сказаться на производительности, особенно если анимации или изменения происходят в реальном времени.

Для оптимизации рекомендуется:

  1. Использовать только те blend shapes, которые реально необходимы для анимации.
  2. Минимизировать количество одновременно активных форм.
  3. Применять методы сглаживания для уменьшения количества промежуточных состояний.

Также важно учитывать, что каждая форма должна быть оптимизирована на уровне 3D-модели, чтобы избежать лишних вершин, которые не влияют на конечный результат.

Применение в реальных проектах

Blend shapes в PlayCanvas могут быть использованы в различных типах проектов: от создания реалистичных персонажей для игр до анимации объектов в архитектурных визуализациях. С помощью этой технологии можно создавать детализированные анимации без необходимости моделировать множество отдельных объектов для каждой трансформации.

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

Заключение

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