LINUX.ORG.RU

Three.js не меняются свойства материала импортированного объекта.

 


0

1

Всем привет! Такая проблема: надо сделать 3D веб-проект. Импортирую объекты из блендера(dae) с помощью collada loader. Такая вещь - нужно установить объекту новые параметры, к примеру цвет. Делаю так, прямо при загрузке:

 
		var collada_loader = new THREE.ColladaLoader();
		collada_loader.load(
			"resources/3D/objs.dae",
			function(collada)
			{
				obj1 = collada.scene.getChildByName("obj1", true);
				obj1.position.set(0, 0, 0);
				obj1.material.color.setHex(0x003388);
				scene.add(obj1);

				obj2 = collada.scene.getChildByName("obj2", true);
				obj2.position.set(100, 100, 100);
				obj2.material.color.setHex(0x003388);
				scene.add(obj2);

				obj3 = collada.scene.getChildByName("obj3", true);
				obj3.position.set(-100, -100, -100);
				obj3.material.color.setHex(0x003388);
				scene.add(obj3);

			}
		);

хром пишет: Uncaught TypeError: Cannot read property 'color' of undefined при этом, если не лезть в material.color, то все отображается прекрасно... В чем косяк? Пробовал создавать новый материал типа:
obj1.material = new THREE.MeshLambertMaterial({color: 0x003388});
толку ноль с этого... Всмысле, цвет у объекта не меняется. Изначальный цвет объектов - как в блендере по стандарту.

Или возможно, я что-то не правильно делаю в принципе. Тогда как динамически менять свойства материала объектов в Three.js? Так, кажись, есть догадки. Вначале бросает undefined потому, что материал(наверное) попросту не установлен. Если сделать:

obj1.material = new THREE.MeshLambertMaterial();
obj1.material.color.setHex(0x003388);
уже не бросает ошибку. Осталось только понять, как обновить этот самый материал при рендеринге. Теперь далее: похоже, что материал не меняется, он устанавливается именно в THREE.Mesh(geometry, material); И дальше просто меняются его свойства. Значит надо поступить иначе. Снять геометрию с объекта, и создать новый используя геометрию и нужный материал! Как? Ну я нашел (вроде) геометрию в самом объекте collada:
obj_1_geom = collada.dae.geometries["obj_1-mesh"]["mesh"]["geometry3js"];
Но когда создаю из нее меш, то выкидывает Uncaught TypeError: Cannot read property 'uniforms' of undefined...



Последнее исправление: full_screen (всего исправлений: 8)

Ответ на: комментарий от anonymous

Ну да, это я уже понял. Каким образом мне снять геометрию с импортированных объектов? obj1.geometry тоже undefined...

full_screen
() автор топика

В общем - я решил проблему. Походу это дело с последним билдом. Мне повезло у меня остался 59 билд на компе, оттуда взял ColladaLoader и с cdn 65 версию three.js и все заработало как надо, никаких косяков, материалы грузятся как надо. Не знаю в чем вообще дело.. Может изменилась работа с объектами в 71 версию... хз. Но буду юзать 65 либу + загрузчик из 59 (если юзать 59 ревизию 3.js + лоадер из 59 все равно не работает - какой-то косяк...)

full_screen
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.