论坛

由用户创建的信息 Ivan Lyubovnikov
16 May 2017 10:58
This looks like a GPU/driver bug. It also will be helpful if you show us the console output and the information from the chrome://gpu/ page for that machine.
15 May 2017 16:59
А можно ли средствами кода, к какому либо объекту на сцене привязать якорь ? ну чтобы рядом например с объектом "box_1" висел некий
<div id="box">Hi i box</div>

и естественно перемешался если мы смещаем камеру, стараясь позиционно оставаться рядом с "bo_1", программно это сделать есть способ ?
То есть вообще без блендеровских объектов? Можно и так, тогда все придется делать вручную. Тогда допустим, если для каждого якоря мы знаем, к какому объекту и с каким смещением он привязан, то в любой момент мы сможем посчитать 3d точку, в которой должен висеть якорь. Её можно перевести в 2-мерные координаты на канвасе методом project_point, которые записывать в top/left соответствующего элемента.

За код не ручаюсь, не проверял, но примерно такой должен быть:
var _vec2_tmp = new Float32Array(2);
var _vec3_tmp = new Float32Array(3);

function update_anchor_pos(anchor_id, obj_name, anchor_offset) {
    var obj = m_scenes.get_object_by_name(obj_name);
    var pos = m_trans.get_translation(obj, _vec3_tmp);
    m_vec3.add(pos, anchor_offset, pos);

    var cam = m_scenes.get_active_camera();
    var canvas_xy = m_cam.project_point(cam, pos, _vec2_tmp);

    var anchor_el = document.getElementById(anchor_id);
    anchor_el.style.left = canvas_xy[0] + "px";
    anchor_el.style.top = canvas_xy[1] + "px";
}

var anchor_offset = new Float32Array([2,2,2]);
update_anchor_pos("box", "box_1", anchor_offset);


Можно делать это для всех якорей каждый кадр через set_render_callback.
15 May 2017 16:26
Как подручный инструмент - неплох, можно увидеть список WebGL-ных вызовов, в том числе и с указанием избыточных. Ещё радует, что он выводит информацию по исходникам шейдеров, а также атрибтуам и униформам.
В FF кстати есть встроенный аналог в консоли в виде панелей Shader Editor и Canvas, но он не работает под WebGL 2 и выдает меньше инфы, хотя там можно шейдеры вживую править.
15 May 2017 16:08
Ну во первых спасибо за отлично проведённое время и такую гору крутой информации)
пожалуйста, приходите ещё!
Есть предложение на отдельной странице озвучить результаты конференции (можно в событиях, к примеру). В частности перечислить список спикеров (потом привязать к ним ссылки на ютуб, как будут готовы видосы) и снабдить их ссылками на исходники, презентации (если есть, было бы круто увидеть слайды) и сами конечные проекты.
да, информация по результатам конференции как раз сейчас готовится
15 May 2017 16:04
здравствуйте, спасибо за предложение, учтем
15 May 2017 15:57
если блолку "3dtest" поставить top и left по "0" то все нормально работает, но если ему задать инные значения, то система сдвигается, как мне этого избежать ? мне нужно чтобы top и left были, так как они меняются ( мы как бы может двигать 3д элемент). не могу понять почему происходит такой сдвиг и как сделать чтобы все нормально было ….
Понять поможет этот раздел документации: Нестандартное расположение и ориентация элемента Canvas. Если у вас код как в том уроке, то можно просто заменить строчки:
var x = m_mouse.get_coords_x(e);
var y = m_mouse.get_coords_y(e);
на
var x = m_mouse.get_coords_x(e, false, true);
var y = m_mouse.get_coords_y(e, false, true);
15 May 2017 15:41
Hi, you can still use the standard preloader but it needs a proper percentage value when calling the m_preloader.update_preloader() method.

An ordinary way is to pass it from the preloader_cb method:
function preloader_cb(percentage) {
    m_preloader.update_preloader(percentage);
}


But for multiple json files you need to store their own percentage values somewhere (especially if the json files are loaded simultaneously) and calculate the overall value divided by the count of json files. Then, this value should be passed into the "update_preloader" function.
For now the problem is that if you'll use the same "preloader_cb" callback it will be hard to distinguish the percentage values and to do the proper calculation.

We've added a little fix in the code, which will be available in the next June release. It'll allow to use the special "data_id" parameter in the "preloader_cb" callback. So, the following snippet will work, you just need to specify the number of json files to be loaded (JSON_COUNT variable):

var _preload_data = {};
var JSON_COUNT = 4; 
function upd_preloader_data(percentage, data_id) {
    if (!(data_id in _preload_data))
        _preload_data[data_id] = 0;

    _preload_data[data_id] = percentage;
}

function get_preloader_value() {
    var value = 0;
    for (var id in _preload_data)
        value += _preload_data[id];

    return m_util.trunc(value/JSON_COUNT);
}

/**
 * update the app's preloader
 */
function preloader_cb(percentage, load_time, data_id) {
    upd_preloader_data(percentage, data_id);
    m_preloader.update_preloader(get_preloader_value());
}


As for now, something similar can be achieved by using multiple different preloader_cb functions, each specified in the separated m_data.load call, but it's not very convenient.
05 May 2017 10:31
Hi Will, this is well described here:
WebVR Rocks
WebVR Info
04 May 2017 11:49
Hi Alexandre, welcome to the forum and thanks for your kind words!

Could the audio picking be done by scripting? To make things easier, each speaker has the same name of the painting, like object "paintingABC" has a speaker named "paintingABC.Speaker".
It would be great if the script could also stop all other audio playing before playing the selected one.
Yes, this can be done by the following snippet:
var m_cont = require("container");
var m_input = require("input");
var m_mouse = require("mouse");
var m_scenes = require("scenes");
var m_sfx = require("sfx");

var _prev_played_speaker = null;

function setup_speaker_logic() {
    var canvas_elem = m_cont.get_canvas();
    m_input.add_click_listener(canvas_elem, function(event) {
        
        var x = m_mouse.get_coords_x(event);
        var y = m_mouse.get_coords_y(event);
        var obj = m_scenes.pick_object(x, y);

        if (obj) {
            var obj_name = m_scenes.get_object_name(obj);

            if (_prev_played_speaker && m_sfx.is_playing(_prev_played_speaker))
                m_sfx.stop(_prev_played_speaker);

            var speaker_obj = m_scenes.get_object_by_name(obj_name + ".Speaker");
            m_sfx.play(speaker_obj);
            _prev_played_speaker = speaker_obj;
        }
    });
}

setup_speaker_logic() function should be called after the scene was loaded, for example, in the standard "load_cb" function. You can find more info about it and blend4web scripting here: Application Development.
04 May 2017 11:12
Hi,
This is a known problem. It's not related to the camera clipping settings, but to the frustum culling optimization. It can affect objects with skeletal/vertex animation and shape keys.
The easiest way to fix this is to check the "Disable Frustum Culling" option in the Object->Rendering Properties panel.