Bone api не работает
08 марта 2018 23:05
Всем доброго времени суток! Задался целью подвигать немного кости у моего свеже созданного кубика. А если быть точнее, то одну, да причём подвигать из html кнопки.
Ничего воде бы, не предвещало беды, изучил Bone API, для более точного решения посмотрел код в Code Snippets и выдал вот такой вот код:
От стандартного отличается лишь тем, что добавлен обработчик событий на кнопку, созданную в htlm (да, обработчик работает). И… ничего. Т.е., бедная несчастная кость не двигается вовсе. Пробовал даже функцию m_armature.set_bone_tsr(), результат аналогичный.
Думаю, мб что не не так сделал. Мб что пропустил… Скопировал проект из Code Snippets и давай его уменьшать до задачи, что выше описана. Получилось нечто подобное:
И в принципе, логика одинаковая, да только модуля инпут давным давно не было, поэтому пришлось делать кнопку более экстравагантным путём. Но внезапно этот код работает. Т.е., прям как надо. Персонаж двигает правой рукой и всё хорошо. Ну, как двигает, просто меняет положение от максимального до минимального, но это и есть решение той задачи что я себе поставил.
К сожалению, понять ПОЧЕМУ у меня не двигается верхняя часть кубика (аля сундук) я не смог и искренне прошу Вашей помощи в решении данной задачи. Грешу пока только на обновлённую версию движка. Ибо по настройкам я для рига и костей всё проверил, всё одинаковое. Уже ума не приложу, почему оно не работает(
Ничего воде бы, не предвещало беды, изучил 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:49
Ответ на сообщение пользователя Александр РомановАлександр, спасибо большое! Моя вина. не увидел Вашего ответа, а в прошлый раз не поставил галочку, чтобы следить за темой. Впредь такой ошибки не повторю. Да, спасибо, всё работает как надо!
А вот этот ответ не помог?
Прошу удалить эту или ту тему на усмотрение администрации