pick_object() всегда возвращает null

21 января 2016 18:11
Добрый вечер!
Разбираю простой пример работы движка: пытаюсь обработать клик по обьекту.
Проблема в том что при нажатии в любую облать canvas'а, даже по самому обьекту, всегда получаю null.
Мой код:
var m_app = b4w.require('app');
var m_data = b4w.require('data');
var m_scenes = b4w.require('scenes');

m_app.init({
    show_fps: true,
    canvas_container_id: "main_canvas_container",
    callback: init_cb,
    console_verbose: true,
    autoresize: true
})

function init_cb(canvas_elem) {
    m_data.load("cube.json", loaded_cb);

    canvas_elem.addEventListener('mousedown', canvas_click, true);
}

function loaded_cb() {
    m_app.enable_controls();
    m_app.enable_camera_controls();
}

function canvas_click(event) {
    //event.preventDefault();
    
    var x = event.clientX;
    var y = event.clientY;
    var object = m_scenes.pick_object(x, y);
    console.log({x: x, y: y, object: object});
}

Перепроверил, у обьекта заданно свойство selectable. Что можно еще посмотреть?
21 января 2016 18:25

попробуйте вывести
console.log(m_scenes.get_object_name(object));
Дорогу осилит идущий
21 января 2016 18:28
Наверное все таки:
var m_obj    = b4w.require("objects");

?
Получил:
Object { x: 768, y: 368, object: null } test.js:31:1
B4W ERROR: Wrong object name

Может быть, обьекту необходимо присвоить имя?
21 января 2016 18:30
не. var m_obj = b4w.require("objects"); нинада
и у меня все без "b4w.". это задается в шаблонном проекте
имя у него есть из блендера
выводите не сам обджект, а получите его имя. сам обжект это огромный хэш
Дорогу осилит идущий
21 января 2016 18:39
Ну собственно
B4W ERROR: Wrong object name

и есть результат попытки вывести имя обьекта. Наверное логично, потому как мы передаем функции get_object_name() параметром null.
См. приложения к посту.
21 января 2016 18:44
а это есть в начале вашего кода?
b4w.register("Menu", function(exports, require) {


тогда это так
var m_app       = require("app");
var m_data      = require("data");
var m_scenes    = require("scenes");

а в конце
b4w.require("Menu", "MENU_1").init();

(Menu это я из своего кода просто накопировал)
Дорогу осилит идущий
21 января 2016 18:53
Обернул, в итоге получилось вот так:
b4w.register("Menu", function(exports, require) {

var m_app       = require("app");
var m_data      = require("data");
var m_scenes    = require("scenes");

m_app.init({
    show_fps: true,
    canvas_container_id: "main_canvas_container",
    callback: init_cb,
    console_verbose: true,
    autoresize: true
})

function init_cb(canvas_elem) {
    m_data.load("cube.json", loaded_cb);

    canvas_elem.addEventListener('mousedown', canvas_click, true);
}

function loaded_cb() {
    m_app.enable_controls();
    m_app.enable_camera_controls();
}

function canvas_click(event) {
    var x = event.clientX;
    var y = event.clientY;
    var object = m_scenes.pick_object(x, y);
    
    console.log({x: x, y: y, object: object});
    console.log(m_scenes.get_object_name(object));
};

});
b4w.require("Menu", "MENU_1").init();

Результатов нет.
А в самой сцене может быть загвоздка? В блендере я нуб полный.
21 января 2016 18:55
Menu замените на ваше имя
второй параметр не нужен в конце
b4w.require("Canvasing").init();

он нужен если две сцены запускать на одной странице в двух канвасах
Дорогу осилит идущий
21 января 2016 19:00
Простите, заменил. Так же нет результата.
Кстати, вот заметил еще ошибку в консоли:
TypeError: b4w.require(…).init is not a function

При том что приложение инициализируется.
21 января 2016 19:03
Вы приложите папку с проектом (если он не секретный ) Это обычно помогает быстрее разобраться
Дорогу осилит идущий
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.