Переключение материала и текстур
17 апреля 2015 10:52
17 апреля 2015 11:29
Здравствуйте и добро пожаловать на форум!
Для материалов есть модуль material
В нём есть функция inherit_material позволяющая перетянуть материал с другого объекта (например, заранее подготовленная плоскость)
Если нужно заменять текстуру, то следует использовать специальные canvas - текстуры. Как их применять можно увидеть в приложении из бесплатного дистрибутива с примерами работы различных API. Его можно найти в папке: blend4web_sdk/apps_dev/code_snippets/code_snippets_dev.html (Не забудьте правильно настроить браузер, если будете локально грузить ресурсы)
Поддерживает ли B4W переключение текстур и материалов?Да, поддерживает.
Для материалов есть модуль material
В нём есть функция inherit_material позволяющая перетянуть материал с другого объекта (например, заранее подготовленная плоскость)
Если нужно заменять текстуру, то следует использовать специальные canvas - текстуры. Как их применять можно увидеть в приложении из бесплатного дистрибутива с примерами работы различных API. Его можно найти в папке: blend4web_sdk/apps_dev/code_snippets/code_snippets_dev.html (Не забудьте правильно настроить браузер, если будете локально грузить ресурсы)
14 мая 2015 15:05
Для материалов есть модуль material
В нём есть функция inherit_material позволяющая перетянуть материал с другого объекта (например, заранее подготовленная плоскость)
Столкнулся опять с трудностью:
function change_tape(hex, z) {
var m_scenes = b4w.require("scenes");
var m_mat = b4w.require("material");
if(z == "default"){
console.log(hex, z);
var obj_01 = m_scenes.get_object_by_name("TapeShevron");
var obj_02 = m_scenes.get_object_by_name("TapeRus");
var obj_03 = m_scenes.get_object_by_name("TapeBlack");
var obj_04 = m_scenes.get_object_by_name("TapeBlue");
var obj_05 = m_scenes.get_object_by_name("TapeDarkGreen");
var obj_06 = m_scenes.get_object_by_name("TapeGreen");
var obj_07 = m_scenes.get_object_by_name("TapeGrey");
var obj_08 = m_scenes.get_object_by_name("TapeOrange");
var obj_09 = m_scenes.get_object_by_name("TapeRed");
var obj_10 = m_scenes.get_object_by_name("TapeYellow");
m_scenes.hide_object(obj_01);
m_scenes.hide_object(obj_02);
m_scenes.hide_object(obj_03);
m_scenes.hide_object(obj_04);
m_scenes.hide_object(obj_05);
m_scenes.hide_object(obj_06);
m_scenes.hide_object(obj_07);
m_scenes.hide_object(obj_08);
m_scenes.hide_object(obj_09);
m_scenes.hide_object(obj_10);
switch(hex){
case "Red":
var obj = m_scenes.get_object_by_name("TapeDef");
var mat = "MatTapeDef";
var rgb = new Float32Array([1.000, 0.000, 0.002]);
break;
case "Green":
var obj = m_scenes.get_object_by_name("TapeDef");
var mat = "MatTapeDef";
var rgb = new Float32Array([0.000, 0.800, 0.021]);
break;
}
if (obj) {
console.log(obj);
m_mat.set_diffuse_color(obj, mat, rgb);
console.log(mat);
}
}else{
switch(hex){
case "Rus":
var objto = m_scenes.get_object_by_name("TapeDef");
var matto = "MatTapeDef";
var objfrom = m_scenes.get_object_by_name("TapeRus");
var matfrom = "Mat_Tape_Rus";
console.log(objfrom);
console.log(objto);
console.log(matfrom);
console.log(matto);
break;
case "Shevron":
var objto = m_scenes.get_object_by_name("TapeDef");
var matto = "MatTapeDef";
var objfrom = m_scenes.get_object_by_name("TapeShevron");
var matfrom = "Mat_Tape_Shevron";
console.log(objfrom);
console.log(objto);
console.log(matfrom);
console.log(matto);
break;
}
m_mat.inherit_material(objto, matto, objfrom, matfrom);
}
}
Всё куда нужно попадает (имею ввиду данные), но:
1. после object_hide() пытаюсь условным оператором открыть объект- пишет, что это возможно только для динамических объектов. Однако, у меня все объекты динамические.
2. Объекты скрыты. Инхерит по факту материал не перетягивает.
Коплю деньги на коммерческий B4W.
14 мая 2015 17:00
1. после object_hide() пытаюсь условным оператором открыть объект- пишет, что это возможно только для динамических объектов. Однако, у меня все объекты динамические.Нужные объекты при этом скрываются? Я так понимаю, show вызывается на объекте "MatTapeDef". Если функция ругается, то, скорее всего, c ним что-то все-таки не так. На нём стоит флажок "Force Dynamic Object"?
2. Объекты скрыты. Инхерит по факту материал не перетягивает.Для корректной работы Inherit material требует, чтобы у материалов была схожая структура. Например, если на одном материале есть normalmap, желательно, чтобы она была и на другом. В противном случае, сохранится старая текстура.
Это сделано, чтобы данную функцию можно было использовать в реальном времени, без тормозов. Поддержка полноценного переноса требовала бы очень большого количества вычислений и перекомпиляции шейдера.
14 мая 2015 17:11
ДА
Засада: есть просто материал простой диффузный и два материала с текстурами-картинками. Мне нужно на диффузный натягивать эти картинки. Если я заведу пустую текстуру, то отрендерится она у меня со специфическим розовым цветом. Как быть? Ставить прозрачную картинку?
На нём стоит флажок "Force Dynamic Object"?И на всех стоит.
Для корректной работы Inherit material требует, чтобы у материалов была схожая структура. Например, если на одном материале есть normalmap, желательно, чтобы она была и на другом. В противном случае, сохранится старая текстура.
Это сделано, чтобы данную функцию можно было использовать в реальном времени, без тормозов. Поддержка полноценного переноса требовала бы очень большого количества вычислений и перекомпиляции шейдера.
Засада: есть просто материал простой диффузный и два материала с текстурами-картинками. Мне нужно на диффузный натягивать эти картинки. Если я заведу пустую текстуру, то отрендерится она у меня со специфическим розовым цветом. Как быть? Ставить прозрачную картинку?
Коплю деньги на коммерческий B4W.
14 мая 2015 17:22
14 мая 2015 17:29
14 мая 2015 17:37
Ответ на сообщение пользователя Йеджи Заборовскиconsole.log(m_scenes.get_type_mesh_object("TapeShevron"));
Может, после скрытия объект перестает быть ForceDynamic?
после скрытия выдало мне NULL
И до скрытия выдало NULL.
Самое интересное, что скрыть то мне их дает возможность, объекты эти. А обратно показать- никак.
Коплю деньги на коммерческий B4W.
14 мая 2015 18:08
Засада: есть просто материал простой диффузный и два материала с текстурами-картинками. Мне нужно на диффузный натягивать эти картинки. Если я заведу пустую текстуру, то отрендерится она у меня со специфическим розовым цветом. Как быть? Ставить прозрачную картинку?Можно просто снизить влияние текстуры до нуля во вкладке Influence->Diffuse->Color
Ответ на сообщение пользователя Йеджи ЗаборовскиТакой вызов действительно вернёт NULL, потому что вы ему послали строку вместо объекта. Скрытие никак не влияет на свойства объекта, а только переключает флаг рендеринга.
console.log(m_scenes.get_type_mesh_object("TapeShevron"));
после скрытия выдало мне NULL
14 мая 2015 18:28
Такой вызов действительно вернёт NULL, потому что вы ему послали строку вместо объекта. Скрытие никак не влияет на свойства объекта, а только переключает флаг рендеринга.Вернул динамику. Ок. Но не отображается.
Можно просто снизить влияние текстуры до нуля во вкладке Influence->Diffuse->ColorДа, отображает цвета, супер.
Для корректной работы Inherit material требует, чтобы у материалов была схожая структура. Например, если на одном материале есть normalmap, желательно, чтобы она была и на другом. В противном случае, сохранится старая текстура.Что значит "схожая структура?" Я создал копию, заменив картинку на прозрачный PNG. Ну, собственно, не хочет перетягиваться. Проект в студию?
Коплю деньги на коммерческий B4W.