Bone api не работает

08 марта 2018 23:05
Всем доброго времени суток! Задался целью подвигать немного кости у моего свеже созданного кубика. А если быть точнее, то одну, да причём подвигать из html кнопки.


Ничего воде бы, не предвещало беды, изучил Bone API, для более точного решения посмотрел код в Code Snippets и выдал вот такой вот код:

"use strict"

// register the application module
b4w.register("TEST_main", function(exports, require) {

// import modules used by the app
var m_app       = require("app");
var m_cfg       = require("config");
var m_data      = require("data");
var m_preloader = require("preloader");
var m_ver       = require("version");
var m_input     = require("input");
var m_armature  = require("armature");
var m_tsr		= require("tsr");
var m_scene		= require("scenes");

// detect application mode
var DEBUG = (m_ver.type() == "DEBUG");

// automatically detect assets path
var APP_ASSETS_PATH = m_cfg.get_assets_path("TEST");

//Custom variables
var boxIsOpen = false;
var final_tsr = new Float32Array(8);

/**
 * export the method to initialize the app (called at the bottom of this file)
 */
exports.init = function() {
    m_app.init({
        canvas_container_id: "main_canvas_container",
        callback: init_cb,
    });
}

/**
 * callback executed when the app is initialized 
 */
function init_cb(canvas_elem, success) {

    if (!success) {
        console.log("b4w init failure");
        return;
    }

    m_preloader.create_preloader();

    // ignore right-click on the canvas element
    canvas_elem.oncontextmenu = function(e) {
        e.preventDefault();
        e.stopPropagation();
        return false;
    };

    load();
}

/**
 * load the scene data
 */
function load() {
    m_data.load(APP_ASSETS_PATH + "TEST.json", load_cb, preloader_cb);
}

/**
 * update the app's preloader
 */
function preloader_cb(percentage) {
    m_preloader.update_preloader(percentage);
}

/**
 * callback executed when the scene data is loaded
 */
function load_cb(data_id, success) {

    if (!success) {
        console.log("b4w load failure");
        return;
    }

    m_app.enable_camera_controls();
	
	m_input.add_click_listener(document.getElementById("Open_Close_Button"), function() {
		var boxRig = m_scene.get_object_by_name("Cube_Armature");
		var boxTSR_close = m_tsr.from_values(0, 0, 0, 1, 0, 0, 0, 1);
		var boxTSR_open = m_tsr.from_values(0, 0, 0, 1, 0.819, 0, 0, 0.573);
	
		m_tsr.interpolate(boxTSR_close, boxTSR_open, boxIsOpen? 0: 1, final_tsr);
		m_armature.set_bone_tsr_rel(boxRig, "Cube_Bone", final_tsr);
		boxIsOpen = !boxIsOpen;
	});
}
});

// import the app module and start the app by calling the init method
b4w.require("TEST_main").init();


От стандартного отличается лишь тем, что добавлен обработчик событий на кнопку, созданную в htlm (да, обработчик работает). И… ничего. Т.е., бедная несчастная кость не двигается вовсе. Пробовал даже функцию m_armature.set_bone_tsr(), результат аналогичный.
Думаю, мб что не не так сделал. Мб что пропустил… Скопировал проект из Code Snippets и давай его уменьшать до задачи, что выше описана. Получилось нечто подобное:

"use strict"

import b4w from "blend4web";

var m_app     = b4w.app;
var m_data    = b4w.data;
var m_scs     = b4w.scenes;
var m_cfg     = b4w.config;
var m_quat    = b4w.quat;
var m_armat   = b4w.armature;
var m_tsr     = b4w.tsr;
var m_phy     = b4w.physics;
var m_trans   = b4w.transform;
var m_vec3    = b4w.vec3;
var m_util    = b4w.util;
var m_cam     = b4w.camera;
var m_version = b4w.version;

var DEBUG = (m_version.type() === "DEBUG");

var APP_ASSETS_PATH = m_cfg.get_assets_path("BoneApi");

var isMax = false;
var _tsr8_tmp   = new Float32Array(8);

export function init() {
    m_app.init({
        canvas_container_id: "main_canvas_container",
        callback: init_cb,
    });
}

function init_cb(canvas_elem, success) {

    if (!success) {
        console.log("b4w init failure");
        return;
    }
    load();
}

function load() {
    m_data.load(APP_ASSETS_PATH + "bone_api.json", load_cb);
}

function load_cb(data_id) {
    m_app.enable_camera_controls(false, false, false, null, true);
		
	var controls_container = document.createElement("div");
    controls_container.id = "Buttons";
	
	var button = create_button();
    button.onclick = CustomAction;
    controls_container.appendChild(button);

    document.body.appendChild(controls_container);
}

function CustomAction() {
    var rig = m_scs.get_object_by_name("character_rig");	
    var max_tsr = m_tsr.from_values(0, 0, 0, 1, 0.715, 0.013, -0.093, 0.693);
    var min_tsr = m_tsr.from_values(0, 0, 0, 1, -0.451, -0.024, 0.459, 0.765);
   	
	m_tsr.interpolate(min_tsr, max_tsr, isMax? 0: 1, _tsr8_tmp);
    m_armat.set_bone_tsr_rel(rig, "upper_arm.R", _tsr8_tmp);
	isMax = !isMax;
}

function create_button() {
    var button = document.createElement("input");

	button.type="button"
    button.id = "Open_Close_Button";
    button.value = "Open\Close Button";

    return button;
}

init();


И в принципе, логика одинаковая, да только модуля инпут давным давно не было, поэтому пришлось делать кнопку более экстравагантным путём. Но внезапно этот код работает. Т.е., прям как надо. Персонаж двигает правой рукой и всё хорошо. Ну, как двигает, просто меняет положение от максимального до минимального, но это и есть решение той задачи что я себе поставил.
К сожалению, понять ПОЧЕМУ у меня не двигается верхняя часть кубика (аля сундук) я не смог и искренне прошу Вашей помощи в решении данной задачи. Грешу пока только на обновлённую версию движка. Ибо по настройкам я для рига и костей всё проверил, всё одинаковое. Уже ума не приложу, почему оно не работает(
12 марта 2018 18:34
А вот этот ответ не помог?
Александр (команда Blend4Web)
twitter
12 марта 2018 18:49
Ответ на сообщение пользователя Александр Романов
А вот этот ответ не помог?
Александр, спасибо большое! Моя вина. не увидел Вашего ответа, а в прошлый раз не поставил галочку, чтобы следить за темой. Впредь такой ошибки не повторю. Да, спасибо, всё работает как надо!

Прошу удалить эту или ту тему на усмотрение администрации
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.