Форум

Глубокое погружение в inherit_material

20 октября 2017 19:43
Здрасьте, провозился я пол дня с этой самой inherit_material, что хочу спросить:

1) Её можно использовать, только если объект obj_to (к которому хотим применить материал) уже содержит какой-то материал и при это надо именно указать его имя?

2) Есть ли возможность программно создать какой-то пустой материал у объекта, чтобы потом применить к нему метод inherit_material?

3) Если у объекта в блендере создано несколько материалов, можно ли их переключать?

4) Есть ли возможность сохранять старый материал у объекта, чтобы потом его вернуть?
21 октября 2017 02:49
Если можно, расскажите в чём сложность манипулировать материалами, не привязанными к объекту (чтобы не использовать наследование материала, а просто назначение его из некой виртуальной библиотеки).

Я разобрал функцию передачи материала от объекта к объекты, происходит много интересного, но не совсем понятно зачем. Я думаю, тот кто это писал сможет наглядно объяснить все тонкости передачи материалов =)
23 октября 2017 21:17
здравствуйте

1) Её можно использовать, только если объект obj_to (к которому хотим применить материал) уже содержит какой-то материал и при это надо именно указать его имя?
Да, только так.

2) Есть ли возможность программно создать какой-то пустой материал у объекта, чтобы потом применить к нему метод inherit_material?
Нет, процедурного создания материалов нет.

3) Если у объекта в блендере создано несколько материалов, можно ли их переключать?
Да, например, на скриншоте ниже материал "Material" изначально применен ко всему объекту, а остальные материалы просто "висят" мертвым грузом, но экспортируются (если включено "Dynamic Geometry & Materials") :


тогда можно переключать так:
var cube = m_scenes.get_object_by_name("Cube");

m_mat.inherit_material(cube, "Material.001", cube, "Material");
m_mat.inherit_material(cube, "Material.002", cube, "Material");
m_mat.inherit_material(cube, "Material.003", cube, "Material");


но материал "Material" после наследования затрется, и его восстановить не получится, поэтому стоит его рассматривать только в качестве пустышки, в которую будут помещаться остальные.

4) Есть ли возможность сохранять старый материал у объекта, чтобы потом его вернуть?
Т.к. он затирается, то только, если где-то его дополнительно хранить - на самом целевом объекте или на каком-нибудь объекте-контейнере для материалов

Если можно, расскажите в чём сложность манипулировать материалами, не привязанными к объекту (чтобы не использовать наследование материала, а просто назначение его из некой виртуальной библиотеки).
Зависит от того, как себе представлять эту виртуальную библиотеку:
1) Если говорить о полноценном API для материалов, то сложность в том, что в API сейчас нет объекта "материал" как такового, да и внутри движка он размыт. При наследовании используются сырые данные экспортированных из Блендера материалов, которые собственно висят на объектах. Чтобы была возможность использовать библиотеку материалов в виде списка вполне определенных объектов типа "материал", нужно продумывать интерфейс и API для этой категории объектов и рефакторить движок в сторону создания процедурных материалов. Тогда, можно было бы создавать материалы динамически или хранить уже созданные каким-то образом, например, в формате json и загружать их в приложение и т.д.
Это довольно затратно, а полумеры в виде некоего сырого объекта "материал", который только и можно будет, что подать в метод inherit_material, делать не хочется.
2) Если представлять библиотеку как "черный ящик", в который не придется лезть и не требовать ничего от материалов, то можно обойтись и тем, что есть сейчас, т.е. замоделить полигон в Блендере, на который сложить все материалы, и считать, что это и есть библиотека. Ну придется только его имя подавать, а так можно даже blend-файл с ним подгружать динамически при необходимости.
24 октября 2017 12:08
Довольно глубокий ответ, спасибо.
В целом, того что есть достаточно, но задача очень простая, а решать её добавлением тонны материалов (дополнительных) в бленд файл не хочется.

Да, есть пустой объект с материалами (библиотека). Есть конечные объекты, которые наследуют материалы из либы. Но в какой-то момент нужно для конечного материала изменить его материал на другой, при этом иметь возможность потом ему вернуть старый. Что-то типа включения ghost-mode.

В общем я тогда, наверно, сделаю для себя модуль, в котором буду эмулировать всё вышеописанное, а вот про сложность манипулирования, я на самом деле хотел услышать, что происходит с рендером при смене материала. Про код то мне понятно)
24 октября 2017 13:32
В общем сдублировал я кучу кода из модуля object, который относится к наследованию материала (не все функции вынесены в extend, был вынужден…)

Часть методов переписал под чисто сбор данных (собираю отдельный объект материала в JS, который хранит в себе название, массив основных батчей (не совсем понимаю что это), сам bpy_mat (как расшифровывается bpy?) и список текстур), остальную на работу с собранными данными.

Не понял вообще манёвров по сохранению old_link_to_obj и old_bpy_mat_name. но оставил работу с первым, а вот c именем я не стал дублировать, т.к. не понял зачем это вообще надо…

В общем с первого раза всё запустилось и работает. Теперь у меня есть модуль, который позволяет сохранять старые материалы в темп переменной и восстанавливать их для объектов. Думаю, проблемы меня ждут в будущем, особенно с поддержкой обновлений, но, прорвёмся.
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.