Вопросы по API
02 мая 2015 17:20
Всем привет!!!!
Давненько меня тут не было =)) Смотрю, кучу всего нового и полезного запили… Молодцы, так держать!!!
Ну и вот как раз по этому новому (для меня) у меня и возник вопрос.
Есть у меня меш, и есть у этого меша материал. Таких мешей у меня в приложении должно быть много. И дабы не громоздить большую сцену, я решил воспользоваться замечательным модулем objects и замечательным методом этого модуля copy.
Всё отработало прекрасно, но… =((( При попытке изменить свойство материала (например diffuse_color) какого-то из скопированных мешей, новое значение этого свойства присваивается всем скопированным мешам.
Правильно ли я понимаю, что что объект содержит в себе не копию экземпляра материала, а всего лишь ссылку на него? Если это так, то всё в принципе понятно и ожидаемо, но возможно ли (и если да, то с помощью чего) реализовать желаемое мной поведение?
З.Ы. Простите если спрашиваю как прочесть букварь… =))) Еще не весь changelog прочитал.. И спасибо большое!! Вы делаете очень крутую штуку
Давненько меня тут не было =)) Смотрю, кучу всего нового и полезного запили… Молодцы, так держать!!!
Ну и вот как раз по этому новому (для меня) у меня и возник вопрос.
Есть у меня меш, и есть у этого меша материал. Таких мешей у меня в приложении должно быть много. И дабы не громоздить большую сцену, я решил воспользоваться замечательным модулем 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/
http://naviris.ru/
02 мая 2015 21:32
Всё правильно, цвет материала это часть геометрии, поэтому необходимо делать полное копирование (третий параметр метода copy() установить в true).
Команда Blend4Web
https://twitter.com/AlexKowel
https://twitter.com/AlexKowel
02 мая 2015 23:01
05 мая 2015 16:26
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
08 мая 2015 15:29
Ответ на сообщение пользователя Семенцов Роман
example
Друзья, когда делаю по вашему примеру- работает.
Но у меня 300 цветов в библиотеке.
Наплодил 300 переменных.
Цвет передается белый в любом случае.
ваш вариант
exports.blue = new Float32Array([0,0,255]);
Мой
exports.colorRAL_1001 = new Float32Array([209,188,138]);
(моих строчек около 300 шт).
параметры передаются. А цвет устанавливается белый в любом случае.
Коплю деньги на коммерческий B4W.