Форум

Смешивание скелетной анимации

04 февраля 2016 08:25
Приветствую! Хочу попробовать смешать 2 скелетных анимации. Чтобы добиться примерно такого эффекта.
В документации нашёл функцию set_skel_mix_factor(armobj, factor, timeopt), думаю это то что нужно, но примеров, как работать с этой функцией не нашёл пока что (может плохо искал).

Подготовил демку, где включаю 2 скелетных анимации одну за другой, подскажите как их смешать?
anim_test.zip
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
05 февраля 2016 17:34
Ещё возник вопрос: во время проигрывания скелетной анимации можно управлять костями через API? Например стоит персонаж и ему нужно посмотреть на определённый угол вверх или вниз, при этом продолжая проигрывать анимацию всего скелета…
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
05 февраля 2016 18:45
Ответ на сообщение пользователя Кирилл
Приветствую! Хочу попробовать смешать 2 скелетных анимации. Чтобы добиться примерно такого эффекта.
В документации нашёл функцию set_skel_mix_factor(armobj, factor, timeopt), думаю это то что нужно, но примеров, как работать с этой функцией не нашёл пока что (может плохо искал).

Подготовил демку, где включаю 2 скелетных анимации одну за другой, подскажите как их смешать?
anim_test.zip
Ваш код нужно заменить на следующий.
function play_anim() {
    var arm = m_scs.get_object_by_name('Armature');
    m_anim.apply(arm, 'anim_1', m_anim.SLOT_0);
    m_anim.apply(arm, 'anim_2', m_anim.SLOT_1);
    m_anim.set_skel_mix_factor(arm, 0.5);
    m_anim.play(arm, null, m_anim.SLOT_ALL);
}

В Blend4Web используется концепция анимационных слотов, в каждом из которых может храниться анимация любого типа. От объектной до системы частиц. Максимум 8. В случае скелетных анимаций смешиваются две последние.
Документацию на смешивание скелетных анимаций мы пока не писали, поскольку эта фича у нас носит всё ещё экспериментальный характер и в некоторых случаях даёт сильные артефакты.

Ответ на сообщение пользователя Кирилл
Ещё возник вопрос: во время проигрывания скелетной анимации можно управлять костями через API? Например стоит персонаж и ему нужно посмотреть на определённый угол вверх или вниз, при этом продолжая проигрывать анимацию всего скелета…
У нас есть специальные API для управления костями. Их можно оценить в этом примере
Но в случае со скелетной анимацией пока не получится произвести таких модификаций, поскольку на данный момент скелетная анимация перезаписывает позиции всех костей. Работа над полноценной процедурной анимацией ведется, но как скоро она будет готова, пока сложно сказать.
05 февраля 2016 23:39
Большое спасибо за приведённый пример. Буду пользоваться с осторожностью
Когда вижу, как работает новая фича появляется всё больше вдохновения
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
11 октября 2016 03:03
Столкнулся со смешиванием двух анимаций, воспользовался этой статьей. Задача сделать плавно переходящие анимации. Воспользовался готовым исходником, сделал плавный переход от одной анимации к другой каждые 5 секунд, все хорошо, вот только в самом начале перехода проскальзывает кадр вообще не подходящий.
Ну и после недолгого проигрывания, анимация прекращается, полагаю, что это связно с тем что переменные m_anim.SLOT_+число закончились, подскажите как быть в этой ситуации?
11 октября 2016 11:05
Ответ на сообщение пользователя Onis
Столкнулся со смешиванием двух анимаций, воспользовался этой статьей. Задача сделать плавно переходящие анимации. Воспользовался готовым исходником, сделал плавный переход от одной анимации к другой каждые 5 секунд, все хорошо, вот только в самом начале перехода проскальзывает кадр вообще не подходящий.
Ну и после недолгого проигрывания, анимация прекращается, полагаю, что это связно с тем что переменные m_anim.SLOT_+число закончились, подскажите как быть в этой ситуации?
Нет совсем никакой необходимости постоянно переназначать анимацию на новые слоты и тем более удалять её оттуда. Лучше её один раз применить и в дальнейшем просто менять фактор смешивания. Скачок в вашем примере обусловлен неточностью значений фактора смешивания и удалением анимации. Если нужны новые анимации их так же можно назначить на уже занятые слоты. Они просто перетрут навешенную анимацию.

Я изменил ваш пример так, что mix_factor меняется по синусу от step, давая плавное перетекание анимаций.

И ещё, я бы рекомендовал пользоваться встроенной системой сенсоров Blend4Web. setInterval не привязывается к обновлению кадров и может давать сильные рывки при небольших FPS.
11 октября 2016 14:26
Нет совсем никакой необходимости постоянно переназначать анимацию на новые слоты и тем более удалять её оттуда. Лучше её один раз применить и в дальнейшем просто менять фактор смешивания. Скачок в вашем примере обусловлен неточностью значений фактора смешивания и удалением анимации. Если нужны новые анимации их так же можно назначить на уже занятые слоты. Они просто перетрут навешенную анимацию.

Если анимаций всего лишь две, то все очень хорошо. Но если у объекта больше 8 анимаций, эту сценку просто как пример для работы с функционалом рассматриваю, то закрепить за слотами сразу все анимации не получится. Допустим у персонажа 9 режимов ходьбы(1,2,3,4,5,6,7,8,9), в приложении они будут вызваны следующим образом 1-4-5-1-3-4 . Применить все анимации заранее невозможно, придется записывать, пишу 1 на слот 0, 4 на слот 1, 5 на слот 2, 1 на слот 3 не получается записать, т.к. эта анимция на 0 слоте, поэтому после сглаживания анимации надо Либо откреплять отработанные анимации со слотов Либо
Лучше её один раз применить и в дальнейшем просто менять фактор смешивания.
как это применить я особо не понял, в файле попробовал реализовать в функции play_anim_1, но set_skel_mix_factor сглаживает анимации не те, которые задуманы

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

А насчет сенсоров, спасибо, посмотрю как и их можно применить в моей ситуации.
11 октября 2016 15:00
Я предполагаю, что может быть не совсем очевидно в этом API. Лучше будет сказать, что смешиваются последние слоты, а не анимации. То есть, если вы применили скелетную анимацию к 7 и 8 слотам, то они и только они (слоты) будут смешиваться. При этом вы можете менять анимацию (m_anim.apply) на этих слотах, как вам угодно и уместить в них все варианты ходьбы персонажа. Пусть их будет хоть полторы тысячи.
У меня нет возможности делать более подробный пример, но надеюсь, я пролил свет на этот вопрос.

Вообще, этот функционал всё ещё экспериментальный, поэтому я бы на данный момент не стал строить с помощью него серьёзные приложения. Есть принципиальные моменты, которые мы изменим в ближайшем будущем.
11 октября 2016 15:55
Со слотами все предельно понятно, дело лишь в том что при смене анимации на слотах
При этом вы можете менять анимацию (m_anim.apply)
происходит рывок. Можно ли этот момент как-то избежать? Лучше сделать паузу во время отрисовки, нежели скачек

Буду признателен если дадите ответ на этот вопрос
11 октября 2016 16:43
Рывки происходят потому что все операции в коде выполняются в разных несвязанных потоках управления. Рендеринг Blend4Web в своём, анимация обрабатывается в потоке, который сам себя асинхронно запускает через setTimeout, а фактор обновляется в потоке созданном в setInterval. Во всех них время съезжает чуть-чуть друг относительно друга и это хорошо видно глазу. Если нажать на паузу, то съедет ещё сильнее.

Лучше всё это делать через сенсоры и использовать только два слота.

[EDIT]
Если детальнее, то фактор сбрасывается в ноль не одновременно со сменой анимации.
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.