Форум

вопрос по поводу новых версий блендера и b4w фреймворка

28 ноября 2016 17:41 #14197
Здравствуйте, скачал новую версию b4w.min.js библиотеки, скачал новую версию блендера, и почему-то сейчас если вывести массив полученный методом get_all_objects() то выведет следующую структуру в консоли
0
:
Object
Aq
:
null
Aw
:
Array[0]
C
:
null
Ct
:
null
Ee
:
null
Ek
:
false
Fs
:
null
Fu
:
Array[0]
G
:
Array[1]
Hc
:
Array[0]
Ib
:
""
La
:
true
Lj
:
20
NB
:
false
Ok
:
"Cube"
P
:
null
Qo
:
false
Sp
:
true
Sq
:
"AUTO"
Tb
:
null
Tf
:
Array[1]
Vj
:
true
Vl
:
null
Wl
:
null
XB
:
Object
Ya
:
null
Zk
:
Array[0]
anchor
:
null
ba
:
Array[8]
cj
:
false
cz
:
false
dp
:
""
gi
:
"67f7a46bfa49ad77dc3b8411678a11a8"
is_character
:
false
jg
:
Object
k
:
Object
kl
:
false
name
:
"Cube"
ns
:
Array[0]
og
:
null
os
:
null
ow
:
false
parent
:
null
pe
:
Array[0]
pf
:
null
qp
:
Array[0]
qz
:
null
type
:
"MESH"
v
:
null
ve
:
false
vq
:
Array[3]
zf
:
Array[0]
__proto__
:
Object


а раньше вот у меня осталась стараюя наработка структура 1 объекта была следующей:
0
:
Object
action_anim_cache
:
Array[2]
actions
:
Array[1]
anchor
:
null
anim_behavior_def
:
10
anim_slots
:
Array[8]
armobj
:
null
bpy_origin
:
true
character_settings
:
null
collision_id
:
""
cons_armat_bone_descends
:
Array[0]
cons_descends
:
Array[1]
constraint
:
null
correct_bounding_offset
:
"AUTO"
field
:
null
floater
:
null
floating_settings
:
null
is_character
:
false
is_dynamic
:
true
is_floating
:
false
is_hair_dupli
:
false
is_vehicle
:
false
light
:
null
meta_objects
:
Array[0]
metatags
:
null
name
:
"zazhimnoe_kolco_r.001"
need_update_transform
:
false
nla_events
:
Array[0]
origin_name
:
"zazhimnoe_kolco_r.001"
outline_animation
:
Object
parent
:
null
parent_bone
:
""
parent_is_dupli
:
false
physics
:
null
physics_constraints
:
Array[0]
physics_settings
:
Object
pinverse_tsr
:
null
reflective_objs
:
Array[0]
render
:
Object
scenes_data
:
Array[1]
sensor_manifolds
:
null
sensor_manifolds_arr
:
Array[0]
sfx
:
null
type
:
"MESH"
use_default_animation
:
false
use_obj_physics
:
false
uuid
:
"58db198a8d33bfa6ca28e43acd11b6c0"
vehicle
:
null
vehicle_settings
:
null
vertex_anim
:
Array[0]
viewport_alignment
:
null
__proto__
:
Object


у меня на сцене было около 300 объектов я запускал анимацию путем получения объектов через метод get_all_objects() а затем я в цикле я получал имя и action объекта и добавлял анимацию через apply(obj,action); ну и дальше соответственно запускал через play

дк вот интересует вопрос часто ли будет меняться структура объектов ? и правильно ли я вообще применяю анимацию к массе объектов, для полноты картины скину часть кода который отвечает за воспроизведение анимации

var _anim_get_frame = 1;//устанавливаем изначально 1 кадр  текущим для анимации
var _frame = 1;
var _add_anim = 0;/*если равен 1, это значит что для объектов мы уже добавили анимацию и можно с ними работать*/
var _timerId;
function play_anim(_frame,speed) {
    clearInterval(_timerId);
        _timerId = setInterval(function() {
            $('.clock').text(parseInt($('.clock').text())+1);
            $('#time').val(parseInt($('#time').val())+24);
            
            if (parseInt($('.clock').text())>=80) {
                setTimeout(function() {
                clearInterval(_timerId);
                $('.clock').text(80);
                $('#time').val(1800);
              }, 0); 
            }
          }, 1000);
        setTimeout(function() {
         clearInterval(_timerId);
         $('.clock').text(0);
       }, 100000);  

    //alert(_frame);
    $('.button_container:nth-child(2)').css("display","block");
    $('.button_container:nth-child(1)').css("display","none");
    
   var mas = m_scs.get_all_objects("ALL",m_obj.DATA_ID_ALL);
   //console.log(mas);
    var mas_name = [];
    var lok = 1;
    for (var key in mas) {
        console.log(mas);
        mas_name[lok] = mas[key].name
        lok++;
        if (mas[key].type == 'Lamp' || mas[key].type == "WORD" || mas[key].type == 'EMPTY') {
            
        }else{

                
            
            var obj = m_scs.get_object_by_name(mas[key].name);//имя объекта
            var amima = m_anim.is_animated(obj);
            //console.log(amima);

            if ($.isEmptyObject(mas[key].actions)) {
                
            }else{
                
                
                
                
                var action = mas[key].actions[0].name;//актион объекта
               
                if (obj) {
                   
                    if (_add_anim == 0) {
                        m_anim.apply(obj,action);
                        //_anim_get_frame = m_anim.get_frame(obj);/*получаем текущий кадр*/
                        //console.log("kadr="+_anim_get_frame);
                    
                        m_anim.set_behavior(obj,m_anim.AB_FINISH_STOP);
                        if (!_anim_playing_ob) {
                            //m_anim.set_speed(obj, anim_speed);
                            //console.log(anim_speed);
                            m_anim.play(obj,function(){
                                _anim_playing_ob = false;
                                //anim_speed *= -1;
                                _anim_get_frame = m_anim.get_frame(obj);
                               m_anim.set_frame (obj, _anim_get_frame);
                                });
                       
                        }else{
                         
                        }
                       
                    }else{
                        if (parseInt(_frame) != 1 && typeof(_frame) == "string") {
                            var anim_lenght = m_anim.get_anim_length(obj);
                            if (parseInt(_frame) >= parseInt(anim_lenght)) {
                                m_anim.set_last_frame (obj);
                            }else{
                                m_anim.set_frame (obj,parseInt(_frame));
                            }
                        }
                        //    
                        //}else{
                        //    if (anim_speed == 1) {
                        //        m_anim.set_frame (obj, _anim_get_frame);/*устанавливаем текущий кадр после остановки анимации*/
                        //    }else{
                        //        m_anim.set_last_frame (obj);
                        //    }
                        //}
                        //_anim_get_frame = m_anim.get_frame(obj);/*получаем текущий кадр*/
                        //console.log("kadr="+_anim_get_frame);
                    
                        m_anim.set_behavior(obj,m_anim.AB_FINISH_STOP);
                        if (!_anim_playing_ob) {
                            m_anim.set_speed(obj, speed);
                            //console.log(anim_speed);
                            m_anim.play(obj,function(){
                                _anim_playing_ob = false;
                                //anim_speed *= -1;
                                _anim_get_frame = m_anim.get_frame(obj);
                               m_anim.set_frame (obj, _anim_get_frame);
                                });
                    
                        }
                    }
                }
            }                                    
        }
    }
    console.log(mas_name);
     _add_anim = 1;/*добавили к объектам анимацию и можно с ними уже работать*/
}
$('#play').click(function(_frame){
        var speed = 1;
        play_anim(_frame,speed);
});




и теперь чтобы получить имя action объекта мне нужно прописывать mas[key].Tf[0].action.name

что за Tf ? непонятное сочетание символов, раньше чтобы получить имя action объекта
нужно было написать mas[key].actions[0].name все понятно)
28 ноября 2016 18:45 #14200
Здравствуйте, скачал новую версию b4w.min.js библиотеки, скачал новую версию блендера, и почему-то сейчас если вывести массив полученный методом get_all_objects() то выведет следующую структуру в консоли
Добрый день!

Вы скачали обфусцированную (сжатую/закодирвоанную) версию библиотеки. Для того, чтобы результат вызвова get_all_objects() был читабельным используйте библиотеку b4w.whitespace.min.js.
Команда Blend4Web - разработчик
28 ноября 2016 18:47 #14201
Но, вообще говоря, обращаться напрямую к внутренним свойствам объектов некорректно (как раз не будет работать с обфусцированным движком).
Для получения экшнов объекта необходимо воспользоваться методом get_anim_names()
Команда Blend4Web - разработчик
28 ноября 2016 19:11 #14202
напишите ссылку пожалуйста где скачать ? b4w.whitespace.min.js
28 ноября 2016 21:24 #14203
Ответ на сообщение пользователя masterjiamaster
напишите ссылку пожалуйста где скачать ? b4w.whitespace.min.js
Различные версии скомпилированного движка (т.е. библиотеки b4w) можно найти в SDK в папке deploy/apps/common
Команда Blend4Web - разработчик
28 ноября 2016 21:56 #14204
спасибо)
29 ноября 2016 10:14 #14207
Добрый день.

Можно дать вам совет? Не обращайтесь к внутренним свойствам объектов, они являются внутренними сущностями и подлежат обфускации, что вы и заметили в первом сообщении. Версия b4w.min.js самая глубоко обфусцированная, и соответсвенно самая легковесная.

Внутренние свойства объектов доступны через API, например можно заменить следующие строчки кода на :
mas[key].name

Лучше заменить на
m_scs.get_object_name(mas[key]);


Так же можно поступить с
if (mas[key].type == 'Lamp' || mas[key].type == "WORD" || mas[key].type == 'EMPTY')


var m_obj_util = require("__obj_util");
if (m_obj_util.is_lamp(mas[key]) || m_obj_util.is_world(mas[key]) m_obj_util.is_empty(mas[key]))


Ну и с
mas[key].actions

var m_anim = require("animation");
m_anim.get_anim_names(mas[key]);
Разработчик Blend4Web
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.