В среде 3D-графики, такой как Cinema 4D, навигация и манипуляция объектами сцены являются основными задачами. Рассмотрим основные методы работы с объектами сцены в Cinema 4D с использованием Python API.
doc = documents.GetActiveDocument()
- получение активного документа. Обычно в скрипте уже доступна глобальная переменая doc
содержащая активный документ.
Активный объект — это объект сцены, который в настоящее время выбран пользователем. Для получения активного объекта используется следующий метод:
op = doc.GetActiveObject()
Обычно в скрипте уже доступна глобальная переменая op
содержащая активный объект.
Если ничего не выделено или выделено несколько объектов или только тег(-и) - вернет None
Получить список выделенных объектов меши, теги, камеры и др.:
objList = doc.GetSelection()
Если ничего не выделено вернет пустой список.
Сделать объект выделенным можно с помощью такого кода:
doc.SetActiveObject(obj, mode=c4d.SELECTION_NEW) # SELECTION_ADD SELECTION_SUB
Причем результат будет зависить от параметра mode (можно сделать объект соло-выделенным или добавить его к уже выделенным, или убрать из выделенных)
Получить список объектов выделенных в менеджере объектов:
lst = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_NONE)
# GETACTIVEOBJECTFLAGS_CHILDREN GETACTIVEOBJECTFLAGS_SELECTIONORDER
Аргумент отвечает: по умолчанию будут возвращены выделенные объекты верхнего уровня; будут возвращены включая дочерние объекты; объекты будут возвращены согласно порядку их выделения
Корневой объект сцены можно получить с помощью метода GetFirstObject(), который возвращает первый объект в иерархии сцены (независимо от того выделен он или нет):
root = doc.GetFirstObject()
Для поиска объекта по имени в рамках документа используйте метод SearchObject():
findedObj = doc.SearchObject("Null")
Чтобы найти родительский объект для текущего выбранного объекта, используйте метод GetUp():
parent = obj.GetUp()
Получение дочерних объектов (список):
children = obj.GetChildren()
Возвращает последний дочерний элемент этого объекта в списке:
last_child = obj.GetDownLast()
Получение следующего объекта в иерархии:
next_object = obj.GetNext()
Получение предыдущего объекта:
prev_object = op.GetPred()
Теги добавляют дополнительные свойства к объектам. Например, теги могут контролировать рендеринг, материалы, деформации и многое другое. Возвращает первый тег, связанный с объектом:
tag = obj.GetFirstTag()
Возвращает последний тег, связанный с объектом:
tag = obj.GetLastTag()
Получить список всех тегов, связанных с объектом:
tagList = obj.GetTags()
Вернет список всех выделенных тегов:
tagList = obj.GetActiveTags()
Получение конкретного типа тега:
tag = obj.GetTag(c4d.Tnormal)
Скопировать теги объекта в другой объект:
boolResult1 = obj.CopyTagsTo(dest, True, False, False) # скопировать тег фонга
boolResult2 = obj.CopyTagsTo(dest, True, False, True) # скопировать теги материала
boolResult3 = obj.CopyTagsTo(dest, c4d.NOTOK, c4d.NOTOK, c4d.NOTOK) # скопировать все теги
visible - видимость, variable - вариативность, hierarchical - иерархичность
Материалы в Cinema 4D определяют визуальные характеристики объектов, такие как цвет, текстура, отражение и прозрачность. Получение первого материала в документе:
material = doc.GetFirstMaterial()
Возвращает выделенный (в менеджере материалов) материал:
material = doc.GetActiveMaterial()
Если выделено больше одного - вернет None
Вернет список выделенных (в менеджере материалов) материалов:
materialList = doc.GetActiveMaterials()
Поиск материала по имени:
material = doc.SearchMaterial("Matname")
Вернет список всех материалов в документе:
materialList = doc.GetMaterials()
Так же к материалам и тегам можно применять методы GetNext(), GetPred(), GetUp(), GetChildren() для навигации по иерархии.