В следующей версии Dagon наконец-то дебютирует поддержка анимации в сценах glTF. Поддерживается GPU-скиннинг, причем универсальный — для любого объекта можно передать в рендер-пайплайн набор матриц костей (за это отвечает объект Pose) и необходимые вершинные атрибуты (индексы матриц костей и веса).

Поскольку система низкоуровневая, скиннинг требует подготовительной работы — в частности, под каждый уникальный анимированный меш нужен объект позы (Pose), который анимирует кости и заполняет массив матриц. Позу нужно применить к сущности (Entity), и тогда в вершинном шейдере меш этой сущности будет трансформирован матрицами, хранящимися в позе. Преимущество в том, что можно расширять систему скиннинга практически без ограничений. Если вы понимаете, как устроен формат glTF, вы можете написать кастомную альтернативу стандартному классу GLTFPose с любыми фичами: процедурная анимация, обратная кинематика — все, что угодно.

auto characterNode = characterModel.node("character");
characterPose = New!GLTFPose(characterNode.skin, assetManager);
characterPose.animation = characterModel.animation("walk");

Entity character = characterNode.entity;
character.pose = characterPose;
characterPose.play();

Можно прикреплять объекты к костям при помощи родительской связи:

Entity weapon = addEntity(characterModel.node("arm_right").entity);
weapon.drawable = someWeaponMesh;

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *