论坛

由用户创建的信息 ice99
03 December 2016 19:58
типа так:
localStorage.setItem("PauseHrono", "true");
pauseHronoYes=JSON.parse(localStorage.getItem("PauseHrono"));
Ну, я так понимаю вы сейчас пояснили использование Web-storage нативными средствами JS.
Я реализовал это через модуль Storage, всё работает. Это же одно и то же, или я ошибаюсь?

Сейчас попробую традиционный способ сохранения файлов как в приложении.

Просто в теме прозвучало

записывать ее в JSON и посылать на сервер для записи в БД
Это типа заведение аккаунта пользователя, дача ему пользовательского доступа к БД, потом при логине считывание его данных? Я так понимаю это средствами JS. Есть линк на толковый пример или туториала этой схемы?
01 December 2016 21:29
Ответ на сообщение пользователя Иван Любовников
можно ещё shape keys использовать, сделав ключи по каждой оси - так проще всего будет
Спасибо за наводку. Сделал набор Shape keys по X,Y,Z в блендере, сейчас буду разбирать пример "Morphing" из SDK. Я так понял там всё построено именно на Shape keys.
01 December 2016 21:01
Можно использовать модуль "storage" для сохранения данных на стороне клиента (в локальном кэше браузера, самый простой случай)
Идея Web Storage хороша, но:
А как быть простому смертному, если он захочет скопировать свой savestate\save\данные из одного браузера в другой?
Либо послать свою "сохраненку" другому пользователю? Либо сохранить себе в известное место?
Другими словами, можно ли создать файл mysave.sav с параметрами из приложения и сохранить его в известное место?
записывать ее в JSON
Это как так? JSON хранится на web-сервере, и как пользователю его изменить? Каким инструментарием B4W это можно сделать?
посылать на сервер для записи в БД
Опять таки, какими средствами\функциями это реализовать?

P.S. Вот здесь на аналогичный вопрос был дан ответ "да, можно". Сначала получить положения объектов, потом записать их в файл, при загрузке считать. Я к тому, что это делать уже без помощи B4W на чистом JS?
29 November 2016 22:14
Тогда
Предлагали добавлять кости к объекту для изменения размера по осям.
Вроде нашел, вот.
Однако четкого решения не даётся.
Варианты
1. Можно попробовать кости (ресурсоемко, насколько я понял)
2. Анимация (это получается я анимирую объект от 1 см до 100 см за 100 кадров, а затем в зависимости от размера ставлю нужный фрейм анимации? А если у меня 3 измерения?)
3. Низкоуровневое API (видимо сложность будет в том, чтобы менять длину 4х(горизонтальных) ребер куба, если куб повернут под углом по оси Z, например. Хотя, решаемо. Непонятно, как поведет себя текстура, кстати).
Надо на свежую голову подумать.
29 November 2016 20:26
Возьмем обычный куб. Допустим в блендере он 1х1х1м.
Как программно в B4W менять его размеры.
т.е. я хочу, чтобы этот куб у меня стал 0.8х0.5х2м.
а потом я передумаю, и захочу сделать его 1.2х0.7х1.3м.

Да, в модуле transform есть set_scale(obj, scale), но он во-первых равномерный во все стороны, во вторых он скейлит относительно геометрического центра объекта (поправьте меня, если это не так).
А я хочу, чтобы, например чтобы этот куб при любых его модификациях "стоял" на "земле". В 3D редакторах я бы просто выставил pivot point (опорная точка) в основание этого куба, но здесь этого нет. Можно максимум получить эту точку через get_object_center. Но это ничего не даст, даже вкупе с get_object_size, так как в нем выводится максимальный радиус объекта по всем 3-м осям. Если бы знать, что у объекта всегда высота (Z) максимальна, то можно было бы сдвигать объект от "пола" вверх на эту величину ,но нет - объект может быть максимальным по оси Х или У.

ИДЕАЛЬНО было бы введение функций
set_scale_x
set_scale_y
set_scale_z

get_scale_x
get_scale_y
get_scale_z

или даже лучше
get_dimension_x

set_dimension_x

Для упрощения можно получать\ставить размеры bounding-box-а объекта.

ИЛИ быть может это надо реализовывать через модуль geometry?
Я использовал оттуда только drawline.
По остальным функциям не отказался бы от примера их использования.
Я понимаю, что возможно в общем виде, для модификации сложных объектов модуль geometry вряд-ли применим, но для кубов (8 вершин) вполне возможен.

В общем, как подступиться к задаче, если есть пример использования geometry в контексте моей задачи - буду признателен
29 November 2016 19:07
Одну и ту же логику можно реализовать разными способами написания кода.
Покуда будут мобильные устройства - нужно оптимизировать код, для быстрого выполнения.
РАЗУМЕЕТСЯ, по большей части это вопросы к Javascript, однако в контексте B4W это может иметь свои особенности.
Речь не идет об аналитике уровня VisualStudio, который пытается понять ваш код и предлагает переписать целые куски для оптимизации производительности ,но какая-нибудь аналитика кода не помешала бы.
Например, я у себя заметил, что при каждом обращении к объекту, я его нахожу "GetObjectByName". Подумал, а зачем я это делаю каждый раз, и отвел под него переменную, которой и пользуюсь.
Вот я, например, не уверен оптимально ли я поступил

ИЛИ

Было бы хорошо, если бы можно было для любого проекта запустить автоматический бенчмарк, который "как-то" проходится по приложению, хаотично вызывает функции, активирует сенсоры, и т.д. В итоге выдает "показатель скорости\памяти\фпс". Сравнив 2 варианта своего кода можно сделать вывод об оптимальном решении.
27 November 2016 07:50
Ответ на сообщение пользователя Макс
Ок, а если менять сам материал нодой, такое возможно?

здесь
25 November 2016 14:51
Ноды для смены текстуры у нас нет.
Ну, на самом деле можно схитрить в некоторых случаях.
На одной текстуре можно разместить несколько паттернов, а далее при помощи сдвига UV-координат(через ноды) "менять" текстуру на объекте.
Не всегда это подойдет, но иногда выручит.
P.S.
Текстурный атлас в пожелания разработчикам

Inherit Material
Баловался с ним ,поймал какой-то глюк, хотел по-моему даже в багрепорт написать. Точно ситуации не помню, но для того чтобы на объекте мог меняться материал допустим А на В и обратно - этот объект должен быть по умолчанию с материалом С. (т.е. почему-то у меня не срабатывало переключение обратно на дефолтный материал объекта)
24 November 2016 22:12
Не могу сейчас посмотреть, но если не ошибаюсь - смена текстур в этом примере реализована через API, а не через нодовую логику т.е. рядом должен находиться Javascript- файл..
Нашел.
Вот его код - разбирайте.
"use strict";

b4w.register("change_image", function(exports, require) {

var m_data    = require("data");
var m_app     = require("app");
var m_cfg     = require("config");
var m_cont    = require("container");
var m_mouse   = require("mouse");
var m_tex     = require("textures");
var m_scenes  = require("scenes");
var m_version = require("version");

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

var APP_ASSETS_PATH = m_cfg.get_std_assets_path() + "code_snippets/change_image/";

var PATH_TO_IMG_CUBE_1b = APP_ASSETS_PATH + "1_b.png";
var PATH_TO_IMG_CUBE_2b = APP_ASSETS_PATH + "2_b.png";

var PATH_TO_IMG_PLANE_1 = APP_ASSETS_PATH + "table_napkin_1.png";
var PATH_TO_IMG_PLANE_2 = APP_ASSETS_PATH + "table_napkin_2.png";

var PATH_TO_NORMAL_PLANE_1 = APP_ASSETS_PATH + "table_napkin_1_normal.png";
var PATH_TO_NORMAL_PLANE_2 = APP_ASSETS_PATH + "table_napkin_2_normal.png";

var _world = null;
var _wait_for_image_loading = false;
var _napkin_flag = false;
var _stand_1 = null;
var _stand_2 = null;

exports.init = function() {
    m_app.init({
        canvas_container_id: "canvas_cont",
        callback: init_cb,
        physics_enabled: false,
        alpha: true,
        show_fps: true,
        autoresize: true,
        assets_dds_available: !DEBUG,
        assets_min50_available: !DEBUG,
        console_verbose: true
    });
}

function init_cb(canvas_elem, success) {

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

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

function load_cb(data_id) {
    m_app.enable_camera_controls();
    var container = m_cont.get_canvas();
    _world = m_scenes.get_world_by_name("World");
    _stand_1 = m_scenes.get_object_by_name("stand");
    _stand_2 = m_scenes.get_object_by_name("stand_2");
    container.addEventListener("mousedown", main_canvas_clicked_cb, false);
}

function change_img_cb() {
    _wait_for_image_loading = false;
}

function main_canvas_clicked_cb(e) {

    var x = m_mouse.get_coords_x(e);
    var y = m_mouse.get_coords_y(e);

    var obj = m_scenes.pick_object(x, y);
    if (obj && !_wait_for_image_loading) {
        switch(m_scenes.get_object_name(obj)) {
        case "Sphere_button_2":
            m_tex.change_image(_world, "lightmap", PATH_TO_IMG_CUBE_2b, change_img_cb);
            m_tex.change_image(_stand_1, "cubemap_slot", PATH_TO_IMG_CUBE_2b, change_img_cb);
            break;
        case "Sphere_button_1":
            m_tex.change_image(_world, "lightmap", PATH_TO_IMG_CUBE_1b, change_img_cb);
            m_tex.change_image(_stand_2, "cubemap_slot", PATH_TO_IMG_CUBE_1b, change_img_cb);
            break;
        case "table_napkin":
            if (_napkin_flag) {
                m_tex.change_image(obj, "table_napkin", PATH_TO_IMG_PLANE_1, change_img_cb);
                m_tex.change_image(obj, "table_napkin_normal", PATH_TO_NORMAL_PLANE_1, change_img_cb);
            } else {
                m_tex.change_image(obj, "table_napkin", PATH_TO_IMG_PLANE_2, change_img_cb);
                m_tex.change_image(obj, "table_napkin_normal", PATH_TO_NORMAL_PLANE_2, change_img_cb);
            }
            _napkin_flag = !_napkin_flag;
            break;
        default:
            return;
        }
        _wait_for_image_loading = true;
    }
}

});
24 November 2016 20:17
Ответ на сообщение пользователя JoLT
Как мне экспортировать этот объект в *.3ds без потерь? Подскажите пожалуйста
Откуда экспортировать, куда экспортировать, какова конечная цель? К чему эти телодвижения? Даже при наличии экспортера не есть хорошо прибегать к конвертации форматов. Часто может всплыть проблемная геометрия. Уж лучше fbx.