Как создать клонер

Чтобы создать любой объект используемый для сцены нужно воспользоваться таким кодом:

obj = c4d.BaseObject(ID)

где ID - представляет из себя номер идендификатора нужного объекта. Номерам наиболее часто используемых объектов сопоставлены константы:

  • Ocube 5159

  • Onull 5140

  • Oplane 5168

  • Osphere 5160

и т.д. Список этих констант можно найти в документации. Таким образом мы можем создать, например примитив куба, либо написав так:

cube = c4d.BaseObject(5159)

либо так:

cube = c4d.BaseObject(c4d.Ocube)

Однако, в документации перечислены не все возможные объекты. Как раз клонера там и нету... В таком случае, есть обходной путь. В самой Cinema 4D включаем команду "Протокол скрипта" (находится там же где и менеджер скриптов) - теперь каждое действие в редакторе будет сопровождаться отображением примерно такой команды:

c4d.CallCommand(300000116) # Протокол скрипта...

Создаем клонер на сцене через меню редактора и наблюдаем в протоколе скрипта:

c4d.CallCommand(1018544) # Клон

Вот эта цифра 1018544 и есть нужный нам номер, который позволит создать клонер в коде:

cloner = c4d.BaseObject(1018544)

Далее созданный объект можно поместить в сцену:

cloner.SetName('сloner') # дадим своё название в менеджере объектов
doc.InsertObject(cloner) # добавили клонер в документ

# Обновляем сцену после добавления новых объектов
c4d.EventAdd()

Важное примечание: таким образом можно создавать только объекты помещаемые в сцену. Другие объекты, например слои в менеджере слоев, нужно создавать по другому, хотя сама команда c4d.CallCommand(ID) может быть использована.

Перед тем как добавить клонер на сцену можно настроить параметры клона:

# тип клонера - линейный
cloner[c4d.ID_MG_MOTIONGENERATOR_MODE]=c4d.ID_MG_MOTIONGENERATOR_MODE_LINEAR

где константа c4d.ID_MG_MOTIONGENERATOR_MODE_LINEAR может быть заменена обычным числом 1 . Названия констант можно смотреть в документации или просто заменять их числами. Так следущее число 2 сделает тип клона радиальным и т.д.

Чтобы узнать как изменить соответствующий атрибут объекта(клонера) нужно найти его в менеджере атрибутов, выделить название атрибута щелчком левой кнопки мыши, а затем перетащить это название в редактор скриптов или консоль. В том месте куда перетащили название атрибута появится в квадратных скобках имя константы через которую надо обратится к соответвующему параметру объекта. К примеру, у линейного клонера есть атрибут количество, перетащив его в редактор увидим название cloner[c4d.MG_LINEAR_COUNT] Используем это:

cloner[c4d.MG_LINEAR_COUNT]=7 # количество клонов будет 7

Перед тем как в коде назначать параметрам свои значения полезно заглянуть в документацию, чтобы не ошибиться с типом значения. Или просто распечатать через print:

print(cloner[c4d.MG_LINEAR_OBJECT_POSITION])
# Распечатает Vector(0, 50, 0)

Зададим смещение каждому следующему объекту в линии. Это можно сделать двумя способами. Первый:

cloner[c4d.MG_LINEAR_OBJECT_POSITION] = c4d.Vector(50, 0, 0)
# задаем сразу три значения по порядку - x,y,z

Второй:

cloner[c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_X] = 50 # зададим смещение по x
cloner[c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_Y] = 0 # лучше явно обнулить на случай если
cloner[c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_Z] = 0 # там было значение по умолчанию

Вот полный код скрипта:

import c4d

def main():
    cube = c4d.BaseObject(c4d.Ocube)
    # устанавливаем стороны для куба по 45
    cube[c4d.PRIM_CUBE_LEN] = c4d.Vector(45.,45., 45.)
    cloner = c4d.BaseObject(1018544)
    cloner.SetName('сloner')
    cloner[c4d.ID_MG_MOTIONGENERATOR_MODE]=1
    cloner[c4d.MG_LINEAR_COUNT]=7
    cloner[c4d.MG_LINEAR_OBJECT_POSITION] = c4d.Vector(50, 0, 0)
    #cloner[c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_X] = 50
    #cloner[c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_Y] = 0
    #cloner[c4d.MG_LINEAR_OBJECT_POSITION,c4d.VECTOR_Z] = 0
    cube.InsertUnder(cloner)# подчиняем куб клонеру
    doc.InsertObject(cloner) # добавили клонер
    # Обновляем сцену после добавления новых объектов
    c4d.EventAdd()

if __name__=='__main__':
    main()

Last updated