githubEdit

Пишем первый плагин

Напишем ObjectData плагин

ObjectData плагин создает на сцене объект. Это может быть c4d.PolygonObject или c4d.SplineObject. Так же ObjectData плагин может создавать модификатор, например полигонов или системы частиц. В официальном репозитории от Maxon - есть примеры плагинов: Py-RoundedTubearrow-up-right, Py-DoubleCirclearrow-up-right, Py-SpherifyModifierarrow-up-right и Py-Gravitationarrow-up-right

Итак, первым делом создадим в папке plugins директорию с названием своего плагина - пусть это будет SimpleGenerator. Папка plugins находится примерно по такому пути C:\Users\UserName\AppData\Roaming\MAXON\Maxon CINEMA 4D Studio R20.030\plugins. Имя пользователя UserName и версию CINEMA в пути - меняете на свои. В папке SimpleGenerator создаем папку res, в которую положим файл иконки нашего плагина. Обычно это файл формата .tif размером 32х32 пикселя.

Дальше, нам нужно создать каталоги и ресурсные файлы плагина. В нашем случае это должно выглядеть так:

SimpleGenerator/
    simplegenerator.pyp

    res/
        c4d_symbols.h
        description/
            Osimplegenerator.h
            Osimplegenerator.res

        strings_en-US/
            c4d_strings.str
            description/
                Osimplegenerator.str

        SimpleGenerator.tif

Можно создать все ресурсные файлы вручную в текстовом редакторе. О том как это сделать можно посмотреть, например здесьarrow-up-right.

А можно воспользоваться утилитой написанной nrosenstein - "Cinema 4D Prototype Converter". Подробнее, как установить и использовать - смотреть тутarrow-up-right

Правда, для ее использования понадобится Cinema 4D версии R20. Скачиваем пакет, создаем в папке plugins папку converter и распаковываем в нее содержимое пакета. Запускаем Cinema 4D R20 и проверяем тут в меню > Скрипт:


Prototype Converter

Теперь создаем Null-объект и назовем его SimpleGenerator:


null-object

Если мы хотим, чтобы у созданного объекта можно было менять параметры (в том числе анимировать их) - нам нужно добавить их через опцию "Данные пользователя">"Добавить данные пользователя...". Мы создадим эти данные на нашем Null-объекте:


userdata
userdata

Сделаем две группы "Diametrs" и "Segments". В каждой группе добавим по 2 поля для данных "Lines" и "Spheres". В первой группе поля будут иметь вещественный тип, а во второй - целый. Выделяем наш Null-объект и запускаем Prototype Converter:


Prototype Converter

Заполняем поля Prototype Converter:

  • Sourse - здесь указываем с какого объекта считывать пользовательские данные (в нашем случае - null-object SimpleGenerator)

  • Plugin Name - название нашего плагина

  • Plugin ID - уникальный ID нашего плагина

  • Resource Name - имя файла ресурсов для нашего плагина

  • Symbol Prefix - префикс для переменных в коде нашего плагина

  • Icon - путь до иконки.

  • Plugin Directory - указываем путь к папке плагина

Больше ничего менять не нужно. На моем скрине я ввел все данные соответсвенно своим настройкам. Жмем кнопочку Create и переходим к папке своего плагина. В ней находим файл simplegenerator.pyp и открываем его в редакторе:

Это уже рабочий плагин. Он загружается и запускается без ошибок. Но пока ничего не создает. Чтобы это исправить изменяем в этой строке 0 на c4d.OBJECT_GENERATOR:

осталось добавить метод, который будет создавать и возвращать объект:

и конечно это:

Разумеется, оба метода должны принадлежать классу SimpleGeneratorData, который является основным для нашего плагина и наследуется от c4d.plugins.ObjectData. Вот теперь наш плагин при запуске создает на сцене сферу! Правда, у сферы все параметры фиксированы, а созданные нами никак не влияют на неё... Сейчас мы это исправим!

Изменение полей Spheres приводит к изменениям диаметра сферы и количества её сегментов! Но на этом еще не всё. Мы ведь зачем-то создали и параметры Lines, значит мы хотели создать по крайней мере два объекта. Но метод GetVirtualObjects всегда должен возвращать только один объект! Тут мы можем либо создать Null-объект, подчинить ему все остальные объекты и вернуть этот Null. Либо сделать один из имеющихся объектов корневым и остальные подчинить ему в нужной иерархии (и вернуть корневой объект). Мы поступим первым способом:

Конечно, можно было использовать примитив-объект Cylinder вместо того чтобы создавать сплайн и свип к нему. А можно было построить объект из отдельных полигонов и еще кучей способов на которые хватит вашей фантазии!

В итоге мы получили такой объект, созданный нашим плагином:


созданный объект

Теперь, вы можете создавать и свои объекты, назначать им параметры и свою логику. Сконвертируйте полученный объект в полигональный клавишей C - вы увидите что он состоит из тех объектов, которые мы создавали в методе GetVirtualObjects

PS. Созданный таким образом плагин - прекрасно работает в Cinema 4d R23 !

Last updated