Форум

Переключение материала и текстур

17 апреля 2015 10:52 #2064
Здравствуйте!
Поддерживает ли B4W переключение текстур и материалов?
К примеру, при нажатии на кнопку, чтобы одному и тому же объекту присваивался материал, привязанный к кнопке.
Коплю деньги на коммерческий B4W.
17 апреля 2015 11:29 #2068
Здравствуйте и добро пожаловать на форум!
Поддерживает ли B4W переключение текстур и материалов?
Да, поддерживает.
Для материалов есть модуль material
В нём есть функция inherit_material позволяющая перетянуть материал с другого объекта (например, заранее подготовленная плоскость)

Если нужно заменять текстуру, то следует использовать специальные canvas - текстуры. Как их применять можно увидеть в приложении из бесплатного дистрибутива с примерами работы различных API. Его можно найти в папке: blend4web_sdk/apps_dev/code_snippets/code_snippets_dev.html (Не забудьте правильно настроить браузер, если будете локально грузить ресурсы)
Разработчик Blend4Web
14 мая 2015 15:05 #2370

Для материалов есть модуль 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 #2373
1. после object_hide() пытаюсь условным оператором открыть объект- пишет, что это возможно только для динамических объектов. Однако, у меня все объекты динамические.
Нужные объекты при этом скрываются? Я так понимаю, show вызывается на объекте "MatTapeDef". Если функция ругается, то, скорее всего, c ним что-то все-таки не так. На нём стоит флажок "Force Dynamic Object"?

2. Объекты скрыты. Инхерит по факту материал не перетягивает.
Для корректной работы Inherit material требует, чтобы у материалов была схожая структура. Например, если на одном материале есть normalmap, желательно, чтобы она была и на другом. В противном случае, сохранится старая текстура.
Это сделано, чтобы данную функцию можно было использовать в реальном времени, без тормозов. Поддержка полноценного переноса требовала бы очень большого количества вычислений и перекомпиляции шейдера.
Разработчик Blend4Web
14 мая 2015 17:11 #2374
ДА
На нём стоит флажок "Force Dynamic Object"?
И на всех стоит.


Для корректной работы Inherit material требует, чтобы у материалов была схожая структура. Например, если на одном материале есть normalmap, желательно, чтобы она была и на другом. В противном случае, сохранится старая текстура.
Это сделано, чтобы данную функцию можно было использовать в реальном времени, без тормозов. Поддержка полноценного переноса требовала бы очень большого количества вычислений и перекомпиляции шейдера.

Засада: есть просто материал простой диффузный и два материала с текстурами-картинками. Мне нужно на диффузный натягивать эти картинки. Если я заведу пустую текстуру, то отрендерится она у меня со специфическим розовым цветом. Как быть? Ставить прозрачную картинку?
Коплю деньги на коммерческий B4W.
14 мая 2015 17:22 #2375
Ставить прозрачную картинку?- не спасло. Диффузные цвета слетели
Коплю деньги на коммерческий B4W.
14 мая 2015 17:29 #2376
Может, после скрытия объект перестает быть ForceDynamic?
Коплю деньги на коммерческий B4W.
14 мая 2015 17:37 #2377

Ответ на сообщение пользователя Йеджи Заборовски
Может, после скрытия объект перестает быть ForceDynamic?
console.log(m_scenes.get_type_mesh_object("TapeShevron"));
после скрытия выдало мне NULL
И до скрытия выдало NULL.

Самое интересное, что скрыть то мне их дает возможность, объекты эти. А обратно показать- никак.
Коплю деньги на коммерческий B4W.
14 мая 2015 18:08 #2379
Засада: есть просто материал простой диффузный и два материала с текстурами-картинками. Мне нужно на диффузный натягивать эти картинки. Если я заведу пустую текстуру, то отрендерится она у меня со специфическим розовым цветом. Как быть? Ставить прозрачную картинку?
Можно просто снизить влияние текстуры до нуля во вкладке Influence->Diffuse->Color
Ответ на сообщение пользователя Йеджи Заборовски
console.log(m_scenes.get_type_mesh_object("TapeShevron"));
после скрытия выдало мне NULL
Такой вызов действительно вернёт NULL, потому что вы ему послали строку вместо объекта. Скрытие никак не влияет на свойства объекта, а только переключает флаг рендеринга.
Разработчик Blend4Web
14 мая 2015 18:28 #2381

Такой вызов действительно вернёт NULL, потому что вы ему послали строку вместо объекта. Скрытие никак не влияет на свойства объекта, а только переключает флаг рендеринга.
Вернул динамику. Ок. Но не отображается.


Можно просто снизить влияние текстуры до нуля во вкладке Influence->Diffuse->Color
Да, отображает цвета, супер.


Для корректной работы Inherit material требует, чтобы у материалов была схожая структура. Например, если на одном материале есть normalmap, желательно, чтобы она была и на другом. В противном случае, сохранится старая текстура.
Что значит "схожая структура?" Я создал копию, заменив картинку на прозрачный PNG. Ну, собственно, не хочет перетягиваться. Проект в студию?
Коплю деньги на коммерческий B4W.
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.