Как стать автором
Обновить

Комментарии 5

НЛО прилетело и опубликовало эту надпись здесь
Спасибо за упоминание. Да, действительно, со стороны движка это может быть удобнее в плане импорта. Хотя FBX был приведён просто как пример формата, поддерживающего сохранение анимации.

С другой стороны, glTF — относительно новый формат и поддерживается не всеми 3D-редакторами по-умолчанию.
А можете поделится литературой по этой теме — в частности мне необходимо решить задачу скиннинга в реалтайм по данным с depth камеры.
Как производить трансформирование вершин модели я в принципе понимаю, однако возникает проблема привязки вершин к joint-ам и возникает отвратительная анимация движения.

(Если добавите источники — это 95% ответа на поставленный выше вопрос)
Про реализацию анимации на стороне игровых движков можно почитать, например, в Game Engine Architecture (3rd edition). Там достаточно подробно описывается математика и сравниваются различные подходы к анимации. Также можно посмотреть на Game and Graphics Programming for IOS and Android with OpenGL ES 2.0.

Конкретно с захватом движений иметь дело на текущий момент не доводилось (по крайней мере, с реализацией), но видел несколько интересных статей на эту тему в материалах конференции Motion in Games. Можно ещё поискать отдельные публикации в Google Scholar.

Интересная статья, хоть и для меня (как новичка в 3D анимации) - очень сложная! Хотя, чувствую, что ничего особо сложно в данном материале - может дело в подаче.

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

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

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

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

  1. Фиксированное число костей (и небольшого количества) - тогда каждая кость - это просто отдельный массив в uniforms - отдельный поток анимации (для разных скелетов - соответственно разный шейдер, хотя, вероятно тут тоже можно было бы оптимизировать всё условно для одного шейдера).

  2. Распределить все инстансы по группам нахождения между двумя ключевым кадрами - каждую группу рендерить отдельно, передавая в вершинный шейдер в двух uniform два кадра (прошлый и следующий + флаг - что текущий кадр = следующему и интерполяция не нужна; тут ещё можно оптимизировать - сделав набор таких переменных - чтобы можно было передавать фиксированный набор разных скелетов - обычно в этом случае их не много вариантов - которые применяются во всех инстансах) - и в каждом uniform находятся метаданных в массиве костей - останется просто выполнить интерполяцию между двумя ключевыми кадрами (при необходимости).

  3. А ещё можно передать метаданных трансформаций каждой косточки и каждого кадра - как один массив - просто развёрнутую линейно матрицу2x2 - получается упрощённый вариант 1. - но вместо отдельных глобальных переменных - один линеаризованный массив (два: для кадров перемещения и ориентации) с группами смещений по каждому номеру кости.

А это я ещё не завёл речь об упаковке в шейдер сразу нескольких клипов анимации - ведь разные инстансы мог быть в разных состояниях анимации (в различных анимация) - не очень бы хотелось делить их ещё и по этом признаку - тут уже начинает теряться всё преимущество инстанс-рендеринга - вместо, условно, 100 объектов отрисовки за раз будет получаться от силу десяток - а количество отрисовок увеличится на порядок! Третий вариант тут, кстати, очень хорошо должен подойти!

Вот об этом всём было бы интересно статью почитать. Вообще про инстанс-рендеринг очень очень мало статей. Про анимированный инстанс-рендеринг я вообще не видел.

А сами трансформации анимации при расчёте палитры анимации для текущего кадра нужно делать на GPU, а не на CPU - или я ошибаюсь?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории