Shape key animation

07 апреля 2018 18:56
Здраствуйте. Сейчас изучаю тему с shape key animation.
Беру объект, ставлю ключ и изменаю его, так сказать анимирую.

Два вопроса:
1) Как можно запустить эту анимацию с blend4web?
2) Пользуюсь api для того что бы попытаться съанимировать
for(var i = 0.01; i < 1 ; i+=0.01){
        var shape_keys_names = m_geom.get_shape_keys_names(obj);
        m_geom.set_shape_key_value(obj, shape_keys_names[0], i.toString());
        m_obj.update_boundings(obj);
}


Какие есть варианты?
Анимация предполагается очень сложная, так что ноды и бэйкинг отпадает)
10 апреля 2018 07:31
Есть идея вытащить ключевые кадры из анимации Блендера, интерполировать по этим точкам. И применить скрипт тот что выше.
10 апреля 2018 09:25
Я использую loop_cb функцию для постоянного проигрывания анимации. У меня это реализована для карты игрока:

        function loop_cb() {

            //Блок расчета и интерполяции позиции игрока на мини-карту
            var marker = m_scenes.get_object_by_name("Marker");                             //Ссылка на UMG маркер
            var character = m_scenes.get_object_by_name("Character");

            var character_location = m_trans.get_translation(character);

            var key1 = character_location[0] / 11;
            var key2 = 0.9 - character_location[1] / 11;

            m_geom.set_shape_key_value(marker , "Key 1", key2);
            m_geom.set_shape_key_value(marker , "Key 2", key1);

            //Конец блока расчета
            };
3d разработка, визуализация
Rels.One
10 апреля 2018 11:47
Есть более подходящий вариант, как раз предназначенный для таких вещей - функция animate модуля time.
Пример:
        animating = true;
        var trans_animator = m_time.animate(0, 1, 1000, function(e) {
            if (e == 1)
                animating = false;
            var val = switching ? m_util.smooth_step(e) : 1 - m_util.smooth_step(e)
            m_geom.set_shape_key_value(obj, "Key", val);
            m_obj.update_boundings(obj);
            m_phy.sync_bounding(obj);
            m_phy.sync_mesh(obj);
        });
Александр (команда Blend4Web)
twitter
10 апреля 2018 13:19
Рассмотрю эти варианты :)

Я решил это напрямую, может по не знанию?

1) Вытащил shape key значения из блендера в json file.
import bpy
import json

data = []
C = bpy.context
sce = C.scene

def get_key_values(scene, context, key_name):
out = []
for i in range(scene.frame_start, scene.frame_end+1):
scene.frame_set(i)
value = keyBlocks[key_name].value
out.append({
'i': i,
'key_value': value
})
return out

for object in bpy.data.objects:
obj = {}
if object.type == 'MESH' and object.data.shape_keys:
obj['name'] = object.name
obj['keys'] = []
keyBlocks = object.data.shape_keys.key_blocks

for block in keyBlocks:
obj['keys'].append({
'key_name': block.name,
'key_values': get_key_values(sce, keyBlocks, block.name)
})

data.append(obj)

with open('shape.json', 'w') as fp:
json.dump(data, fp)


2) Проигрываю
var animar = function(){
    var animation = setInterval(function(){
        for(var i = 0; i < objs.length; i++){
            var obj = m_scenes.get_object_by_name(objs[i]);
            var shape_keys_names = m_geom.get_shape_keys_names(obj);
            m_geom.set_shape_key_value(obj, shape_keys_names[0], _shape_key_values[counter]);
            m_obj.update_boundings(obj); 
        }
        counter+=missing_frame;
        console.log(counter);
    }, 41*missing_frame);
}
animar();
10 апреля 2018 13:22
В принципе свою задачу выполнил, но если есть решения получше, буду рад увидеть
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.