Scenekit: Как получить все материалы узла?

Хорошо, насколько я понимаю, материалы могут быть созданы для .dae или любой 3D-модели, используемой в качестве SCNNode в Xcode здесь, в редакторе модели:

введите здесь описание изображения

Самый верхний материал наносится автоматически, и все в порядке. Моя проблема в том, что я хочу программно ПЕРЕКЛЮЧАТЬСЯ между этими материалами, которые были созданы на протяжении всей моей игры.

Я попытался получить массив этих материалов, выполнив следующие действия:

node.geometry?.materials

однако это возвращает только этот первый материал. Я пробовал все, но не могу найти способ получить другие материалы и переключиться на них. Прямо сейчас я пытаюсь:

childNode.geometry?.materials = [(childNode.geometry?.material(named: "test"))!]
//childNode is the node

где тест был вторым материалом, но он находит его равным нулю. Как я могу программно переключаться между несколькими материалами?


person skyguy    schedule 01.10.2017    source источник


Ответы (1)


Если материал на самом деле не назначен ни одному из слотов материала (например, диффузному), он также не является частью геометрии.

Вы можете назначить второй материал другому слоту, а затем сбросить его цвет в коде после считывания материала в свойство, которое будет использоваться позже.

Еще один вариант, который я использовал сам, — это назначение нескольких материалов разным граням одной и той же модели (в стороннем программном обеспечении для 3D). Экспортируется как dae, добавляется в xcode, который затем автоматически разделяет геометрию на отдельные элементы со своим материалом. Который затем я могу настроить в xcode и повторять так же, как вы пытаетесь сделать.

person Xartec    schedule 02.10.2017
comment
Спасибо. не могли бы вы объяснить, как сделать первый вариант более подробно? что вы подразумеваете под другим слотом? - person skyguy; 03.10.2017
comment
Я имел в виду, что в качестве обходного пути вы можете поместить вторую текстуру/цвет, например, в свойство Emission. Затем в коде вы можете прочитать свойство .contents свойства Emission, сохранить его в пользовательском свойстве, а затем назначить его слоту Diffuse. Просто не забудьте сбросить эмиссию обратно на черный цвет после того, как вы прочитали слот эмиссии. - person Xartec; 03.10.2017