Вопросы по API

02 мая 2015 17:20
Всем привет!!!!

Давненько меня тут не было =)) Смотрю, кучу всего нового и полезного запили… Молодцы, так держать!!!
Ну и вот как раз по этому новому (для меня) у меня и возник вопрос.

Есть у меня меш, и есть у этого меша материал. Таких мешей у меня в приложении должно быть много. И дабы не громоздить большую сцену, я решил воспользоваться замечательным модулем objects и замечательным методом этого модуля copy.

Всё отработало прекрасно, но… =((( При попытке изменить свойство материала (например diffuse_color) какого-то из скопированных мешей, новое значение этого свойства присваивается всем скопированным мешам.

Правильно ли я понимаю, что что объект содержит в себе не копию экземпляра материала, а всего лишь ссылку на него? Если это так, то всё в принципе понятно и ожидаемо, но возможно ли (и если да, то с помощью чего) реализовать желаемое мной поведение?

З.Ы. Простите если спрашиваю как прочесть букварь… =))) Еще не весь changelog прочитал.. И спасибо большое!! Вы делаете очень крутую штуку
Гале подарили мяч, Гале подарили торт, Галю поздравляют все - Галя сделала аборт
02 мая 2015 19:08
-Vampire-, мне тут когда то писали.
Ответ на сообщение пользователя Семенцов Роман
Добрый день.
Попробуйте сделать вызов функции копирования следующим образом:

var pula_new = m_obj.copy(pula, new_name, true);



Только проставьте предварительно галочку "Dynamic geometry" на объекте "Pula" в Blender'e и произведите заново экспорт сцены

Как я понял при таком методе копируется весь объект с геометрией.
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
02 мая 2015 21:32
Всё правильно, цвет материала это часть геометрии, поэтому необходимо делать полное копирование (третий параметр метода copy() установить в true).
Команда Blend4Web
https://twitter.com/AlexKowel
02 мая 2015 23:01
Круто!!!!! Спасибо, ребята!!
Гале подарили мяч, Гале подарили торт, Галю поздравляют все - Галя сделала аборт
05 мая 2015 16:26

Сверху слева цифра 1. нажать на нее - цвет сменится
example_16.zip

Такой функционал нужен?

Дела обстоят печальнее, когда туда же пытаешься загнать массив из 200 кнопок с библиотекой цветов
Коплю деньги на коммерческий B4W.
05 мая 2015 16:51

Дела обстоят печальнее, когда туда же пытаешься загнать массив из 200 кнопок с библиотекой цветов

А почему бы не сделать смену цвета на объекте по нажатию на сам объект, а не на html-элемент?
Это бы значительно упростило интерфейс приложения. Можно навесить обработчик события нажатия на канвас как в этом уроке и проверять на какой объект было произведено нажатие.

Я бы сделал примерно так:
// . . . 
function init_cb(canvas_elem, success) {
// . . . 
if (!m_main.detect_mobile())
       canvas_elem.addEventListener("mousedown", main_canvas_down);
    canvas_elem.addEventListener("touchstart", main_canvas_down);
// . . . 
}
// . . .
function main_canvas_down(e) {
    if (e.preventDefault)
        e.preventDefault();

    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)
        switch(m_scenes.get_object_name(obj)) {
        case "Obj_name_1":
            m_mat.set_diffuse_color(obj, "mat_diffuse_color_1", [50,0,0]);
            break;
        case "Obj_name_2":
            m_mat.set_diffuse_color(obj, "mat_diffuse_color_2", [50,50,0]);
            break;
        case "Obj_name_3":
            m_mat.set_diffuse_color(obj, "mat_diffuse_color_3", [50,0,50]);
            break;
        case "Obj_name_4":
            m_mat.set_diffuse_color(obj, "mat_diffuse_color_4", [50,50,50]);
            break;
        case "Obj_name_5":
            m_mat.set_diffuse_color(obj, "mat_diffuse_color_5", [250,250,50]);
            break;
        }
}


Все объекты должны быть динамическими и иметь проставленную галочку "Selectable"
05 мая 2015 17:15

А почему бы не сделать смену цвета на объекте по нажатию на сам объект, а не на html-элемент?
Это бы значительно упростило интерфейс приложения. Можно навесить обработчик события нажатия на канвас как в этом уроке и проверять на какой объект было произведено нажатие.
Я бы с удовольствием, но объектов несколько и у некоторых свои библиотеки с цветами в количестве более 200 штук.
Я пытался загнать массив с цветом в init_cb, циклом завести кнопки с событием "onclick" . В таком случае у меня слетает загрузка проекта (то есть модельне отображается).
А при нажатии на объекты у меня, по идее, фунция скрывающая/отображающая DIV-контейнер с библиотекой цветов должна выскакивать. Так что "нажатия на объект" уже заняты.
Как из функций в html-документе обратиться в b4w к функции change_color() и передать ей параметром переменную rgb = Float32Array()?
Коплю деньги на коммерческий B4W.
05 мая 2015 17:33

Как из функций в html-документе обратиться в b4w к функции change_color() и передать ей параметром переменную rgb = Float32Array()?

example
05 мая 2015 18:27
Спасибо!
Коплю деньги на коммерческий B4W.
08 мая 2015 15:29

Ответ на сообщение пользователя Семенцов Роман
example

Друзья, когда делаю по вашему примеру- работает.
Но у меня 300 цветов в библиотеке.
Наплодил 300 переменных.
Цвет передается белый в любом случае.

ваш вариант
exports.blue = new Float32Array([0,0,255]);

Мой
exports.colorRAL_1001 = new Float32Array([209,188,138]);

(моих строчек около 300 шт).
параметры передаются. А цвет устанавливается белый в любом случае.
Коплю деньги на коммерческий B4W.
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.