Cinema 4D: плагины (plug-ins)
Часть 1. Обучение CINEMA 4D + Python: Программирование, предметная область.
Часть 2. Cinema 4D: фракталы и сплайны
Разогреваемся
В этой статье познакомимся с плагинами. Если коротко, то все видимое на экранной форме Cinema 4D является набором экземпляров классов некоторых предустановленных плагинов. Но можно дополнительно создавать и свои, пользовательские плагины. Если говорить о типах плагинов, то в примерах разработки можно увидеть несколько типов. Номер в круглых скобках – это регистрационный номер, выдаваемый Cinema 4D, как, узнаем позже. Базовые 4 типа это объектные, командные, инструмент и тег. Различия в месте расположения на экранной форме и пользовательском интерфейсе.
Рис. 1.
Одно из двух фиксированных мест расположения, как при использовании, так и при разработке следующее:
Однако, учитывая столь важную роль плагинов при анализе структуры Cinema 4D, необходимо рассмотреть особенности и цели разработки плагинов поподробнее.
Выбор места расположения связан с необходимостью повторного запуска плагина при отладке. В норме плагины загружаются (и очень долго) при запуске Cinema 4D на выполнение.
Предположим, в вашем проекте нужно показать процесс горения или стакан молока на освещенном месте. Можно подбирать соответствующие текстуры, а можно по соответствующей постановке выполнить разовые, доступные математикам уровня выше среднего, расчеты и оформить результаты текстурой и учесть вариации исходных данных некоторым шейдером. Работа не для слабых, по крайней мере в одном из очень известных мультфильмов со стаканом молока не справились, поэтому будем говорить о горении, тут все в порядке. Далее, стандартным способом действий является поиск и вставка уже готового кода, в нашем примере это TurbulenceFD, предварительно “обработанный” нашими умельцами против жадности. Уже установленный и принятый системой плагин выделен курсором.
Вставка копированием (в режиме администратора) приводит к изменениям в структуре меню пакета Cinema 4D, но гарантированно только после перезапуска пакета. Поэтому следует ожидать, что работа с командным вариантом плагина без перезапуска невозможна и при отладке тоже. На этом же рисунке видны и другие плагины, уже установленные в пакете (правильно – во фреймворке).
Плагины cinema4dsdk поставляются в составе пакета, написаны на C++ и должны компилироваться в Visual Studio 2010 (это срабатывает в Cinema 4D -15, но не в предыдущих версиях, ключик к этой версии уже сделали). В каталоге plugins находятся учебные варианты плагинов, но уже на Python – перенос из Help-а. Чем больше плагинов в этом каталоге, тем дольше ваш пакет Cinema 4D будет загружаться при запуске, даже если не все из них нужны в текущий момент работы с проектом.
Самое забавное, что в созданном файле .c4d наличие этих плагинов фиксируется (в зависимости от типа), даже если они не применяются. И запуск на другой машине файла со стандартным расширением .c4d, но созданного при наличии некоторого набора плагинов, часто заканчивается неприятностями, появляются сообщения и невозможности работы. Эти сообщения нужно просто игнорировать. С плагином TurbulenceFD именно так и происходит.
После повторного запуска, но после помещения набора плагинов в указанном каталоге, в системном меню Plugins появляются дополнительные позиции, как на рисунке ниже (это командные плагины и теги).
При этом все детали процесса горения обеспечиваются настройками интерфейса пользователя этого тега (если забыли, что такое тег – смотри предыдущие статьи). Если взглянуть на пример приложения (изображение ниже) с этим тегом, то он выглядит достаточно громоздко по причине обилия тегов. Но для нас, важны не эти детали применения конкретного плагина, а типичная структура любого плагина.
Участники процесса горения, в нашем частном случае, отмечаются тегом, а один из простеньких тегов (где был текст на Python) мы уже разобрали и замена иконки с логотипом Python на нужную нам иконку – не проблема.
Теперь мы уже сможем сформулировать себе задачу (следующая статья) и приступить к ее поэтапному решению. Пока ясно, что мы должны уметь:
1. как встроить новые позиции в уже существующее или вновь создаваемое меню
2. как создать пользовательский интерфейс, с помощью которого мы будем настраивать поведение нашего объекта.
3. как назначить иконку нашему плагину
Но это умение может быть реализовано в подходящей среде разработки кода . Вновь очень перегруженный термин (объект). В данном контексте и месте под объектом мы понимаем все, что уже есть, или, может быть добавлено, в Cinema 4D. Не только то, что, отображается в редакторе, но, в том числе, и новые режимы работы, возможности стороннего (в терминологии Cinema 4D – многопроходного) или сетевого рендеринга, редактирование в броузере и так далее.
Термин объект выбран и потому, в основном, что в Python-е все является объектом. Это одно из радикальных отличий от чистого C++, поскольку класс в Python одновременно и экземпляр объекта, как и экземпляр класса (например, есть пресс, который штампует детали по шаблону, тогда детали – это экземпляры, а шаблон, по которому эти детали изготовляются – это класс. Но представьте себе пресс, который штампует точно такие прессы, и что здесь шаблон и что деталь?
. А тот объект, от которого происходят все, подчеркиваю, именно все, сам является ли экземпляром объекта, то есть самого себя (это вполне нормальный вопрос)? Тут заковыка, слишком близко к парадоксу. Может ли брадобрей, который бреет только тех, кто сам не бреется, брить самого себя? То есть нужно отличать класс и экземпляр, тогда парадокс не срабатывает. В коде на Python для этой цели вводится в описание классов дополнительная переменная self, которая ссылается внутри класса на его, этого класса, экземпляры и лишь в одном единственном случае суперобъекта сам на себя. Это вариант самого общего, рекурсивного определения объекта, как и виртуальная функция в C++ это не выполняемый код и служит лишь для определения всех других. Если сказанное непонятно, то в статье 1, в разделе Кредо я говорил о языках, где слова сами объяснят свое значение, здесь об этом же, но кто бы мог себе представить, что можно было и соответствующий код написать? Что это не выдумка досужих теоретиков, а руководство к действию? Удивительно!
Интуиция говорит, что чем ближе ситуация в реализации продукта подходит к парадоксу (известному или нет, эту близость измерить пока не могут), тем более вероятна нестабильность. Почему в Python все работает – понятно, парадокс стал определением, и это просто грандиозная идея. Достаточно поколдовать с этим суперобъектом, экземплярами которого являются все классы, и вы получите совсем другой Python. И вместе с тем, мы вновь вернулись к A=B. На этот раз, знак равно это тождественность класса и экземпляра на достаточно высоком уровне иерархии. На этом история A=B заканчивается, сказать что либо лучше, чем это сделал автор Python Гвидо Россума в ближайшие десятилетия едва ли возможно. Еще несколько слов.
Внимательно просмотрите, как это равенство меняет свой смысл (в каждой из статей). Если мы будем их считать разными, то есть их много, то и называть их одним символом (=, например) не резон и надо бы иначе (например, писать A R B,где R может принимать значение =) , что уже давно сделано (классы эквивалентности). Автоматом придем к математическому понятию отношения и добро пожаловать в основы современной алгебры! (первые лекции). Если же мы вообще будем считать, что у этих отношений есть базовый прототип (обозначим стрелкой), как объект в Python, а все остальное производное от этого (выводимо каким либо образом), то мы придем к теории категорий и функциональным языкам программирования и Python один из них.
Если вернуться к теме обучения из 1-ой статьи, то вынуждены признать, что вся информатика это прикладная современная алгебра и изучать нужно ее, современную алгебру, а не изводить студентов IT направления интегралами с производными, функциональным анализом и теорией аналитических функций комплексного переменного.
В Qt С++ сходства с Python гораздо больше (С++ с расширениями). Что же касается названных выше 3-х пунктов, то для понимания реализации плагинов любого типа знания MFC C++ (обязательная стандартная часть курса по С++) вполне достаточно. Это, прежде всего, элементы управления из какого-то перечня (библиотеки, словаря) доступных или жестко предустановленных, это события, такие как движения мышкой или нажатие кнопок, функции обработки этих событий, отчет о результатах работы сообщениями и ресурсы – строки, изображения, другие файлы. Если кто- то желает, может эти функции обработки событий называть функциями обратного вызова, а сообщения чаще всего реализуются как параметры этих функций. На мой взгляд, непрактично терминологическими изворотами скрывать суть дела там, где уже терминология (непонятно о чем говорят, власть сленга и групп его применяющих) в запущенном состоянии.
Если вас заинтересовал только этот конкретный плагин, то вы найдете достаточно много примеров практического применения этого плагина, например http://www.youtube.com/watch?v=teDVKAE2H0U.
Практическая часть этого раздела статьи в том, что совместив несколько сплайнов из примера в предыдущей статьи, одни для создания интерьера с выбранной должным образом текстурой (например алмаз или зеркало) , а другой для работы под плагином TurbulenceFD (за счет тегов можно определить что горит, а что нет, что поглощает или что отталкивает) вы получите совершенно фантастическое изображение, хватило бы терпения дождаться конца рендеринга, самым хлопотным этапом работы с пакетом, поскольку требует огромного количества практически попиксельного вычисления кадров.
Если же некоторый плагин имеет слишком запутанный интерфейс пользователя или он на непонятном языке, то соответствующей обверткой вашим классом, потратив немного усилий, вы устроите более комфортную жизнь себе и своим сотрудникам.
Лучше один раз увидеть …
Теория хороша, но дьявол скрывается в мелочах. Вот конкретный пример работы над проектом. Вначале это был просто маленький проект на базе TurbulenceFD. Затем из сгенерированного .avi файла был изготовлен .gif файл, и уже этот файл был применен для создания анимированной текстуры (вспомните имитацию реинкарнации из 1-ой статьи, это тот же подход). Эта текстура становилась тегом предустановленного примитива “плоскость”, и она, плоскость, должна появляться в нужное время и в нужном месте проекта. Но дело в том, что эта анимация должна быть согласована с событиями сцены. Конечно, можно в соответствующем редакторе указать время экспозиции каждого кадра и за счет этого подогнать синхронизацию, прямого управления через некоторую переменную порядком отображения и скоростью кадров я пока не нашел. Но даже если это и сделать на моей системе, то не факт, что на другой машине эта настроенная синхронизация будет работать. Если кто- то профи в этой теме, дайте знать!
Движение объекта можно задать либо сплайном, либо положением (координаты) на TimeLine. Если вы выберите сплайн, то изменения точек внутри примитива “сплайн” с течением времени (кадров фильма) недоступны, доступен только сплайн целиком. Учитывая пример из предыдущей статьи возможен только программный способ управления точками сплайна.
Если такая ситуация критична, то придется заниматься с графическими библиотеками на Python или C++, и, поскольку все эти библиотеки объектно ориентированные, с классами придется разбираться серьезно.
Критичность гарантированно будет иметь место, если вы применяете пакет для разработки систем управления в режиме реального времени (тренажер, уличный, или любой другой бой, к примеру, как в системе подготовки армии США или Израиля, или система оперативной, на рабочем месте, переобучения персонала, конвейерное производство).
Это мы разбирались с одним конкретным плагином, едва ли ситуация существенно изменится, если внимательно присмотреться и ко всем прочим.
Но гораздо важнее разобраться с внутренней структурой программной организации пакета, перечнем и характером взаимодействия классов. Но в лоб эту задачу не решить, нужен опыт, инструментарий, настройкой инструментария сейчас и займемся.
Начнем с операционной системы, она должна быть 64-х разрядной, иначе даже 4 Гб памяти у вас не будет, мой опыт показывает, что к новым операционным системам относиться нужно более чем осторожно. Так под Windows 8 оказалось, что Cinema 4D в этой среде генерирует нечитабельные avi файлы. Заказанная скорость (30 кадров/секунду или другая) объявлена, но корректно не поддерживается. Если у вас много текстовых сообщений (не тех, что вы создадите в After Effects или аналоге) вы круто попадете. Самое безобидное, если время их существования на экране будет много меньше возможности прочесть эти сообщения.
Возможно, что это некий дефект конкретно моей системы (хотя рядышком Windows 7 тут все нормально), но иметь разумно настроенную тестовую систему более чем необходимо.
Практическая часть этого раздела в мотивации к изучению методов разработки плагинов как для практиков, так и для теоретиков.
С чего начнем?
Начнем с установки инструментария – Есlipse c PyDev. Eclipse должен быть 64-х разрядным. Иначе 32-х разрядные плагины ваша, установленная 64 разрядная Cinema 4D, просто не увидит. Остальные подробности можно прочесть в http://www.smart-page.net/blog/2011/05/09/advanced-python-plugin-coding-for-cinema-4d/ , но всему верить в этом посте не следует. Главное, и проверенное, ниже. Проекты наших плагинов должны находится в каталоге, как на рисунке. Возможен еще один каталог c:\Users\ed\AppData\Roaming\MAXON\CINEMA 4D R14_4A9E4467\plugins\, но я не проверял. Как видите, через скрытый по умолчанию каталог AppData, или системный каталог Program Files c ограничениями на запись, поэтому запускать Eclipse на выполнение нужно только от имени администратора. Для начала скопируйте examples из комплект документации (CINEMA4DR15037PYTHONSDKHTML20130823, ссылку найдете в меню help пакета Cinema 4D), в этот каталог (:\Program Files\MAXON\CINEMA 4D R14\plugins\plugins\). Создавая новый проект, см. рисунок
Вы должны указать имя, обязательно снять флажок Use default и указать Grammar Version 2.6. Непонятно пока, откуда возьмется CinemaR14. Это имя интерпретатора указывается вызовом команды Windows-> Preferences.
Рис. 2.
Справа в этом окне расположена кнопка Add (не видна, мне важно было, что бы был виден каталог, где расположен интерпретатор), изначально окно в центре может быть пустым, но после нажатия этой кнопки находите этот каталог, дополнительно еще запрашивается имя, здесь указано CinemaR14.
Далее, файлы на Python для плагинов имеют расширение *.pyp. Необходимо, что бы система могла их распознать как Python файлы. В этом же окне в разделе General:
File Association вновь жмите другую кнопку Add и указываете это расширение/
Почти все готово и во многих случаях достаточно, но часто возникает необходимость указать в свойствах проекта запуск как Python.
Рис. 3.
В случае отличия, запускает Run Configuration. В основном, это будет повтор уже описанного, но подтверждение лучше всего делать кнопкой Apply. Если при запуске проекта на выполнение вы получите долгожданный вывод, как слева на рисунке, то все в порядке и можно быть уверенным в работоспособности нашего отладчика плагинов.
Но это мы разобрались c Eclipse.
Если взглянуть в каталог, где расположен поставляемый с дистрибутивом Python 2.6.8, то увидите и простенький IDE pythonw.exe. Который, конечно же под Win8 не запускается, но идея разработчиков понятна – можно применять и специализированные под Python IDE. Одно поражает – это фатальное пристрастие к глубоко вложенным каталогам. Совершенно непонятно, зачем так далеко прятать функционально загруженный элемент, но такова жизнь. Многим все это покажется знакомым, особенно android разработчикам. И действительно опять фреймворки (но не связанные с компиляцией), опять фиксированная структура каталогов только уже другой mix, не Java & C++, как в NDK (Native Development Kit) для android, а опять же mix, но Java заменена на Python.
Поскольку Python активно взаимодействует c С++, то необходима передача данных между единицами исполнения, написанных на разных языках. Для этого есть различные технологии.
Одна из них, использует промежуточный уровень исполнения, к которому сводятся коды на всех языках (это все языки Visual Studio и подпорка в форме .Net Framework, по сути, библиотека классов, на базе которых и формируются все возможности).
Другая же технология ближе всего к COM технологии и в этом варианте применяется некоторый язык посредник (IDL) и, следовательно, необходимы соответствующие файлы с текстом на этих языках – посредниках. В некоторых случаях на базе этих текстов автоматически генерируются тексты на языках участвующих в обмене данными. Эти файлы могут быть записаны с расширением заголовочных файлов языка С/C++. Именно такой вариант и реализован в нашем случае и хорошо виден в структуре плагинов типа Object Plagin (см. рис.1). Фиксированная структура каталогов в значительной мере вызвана этим обстоятельством.
Теперь мы можем говорить, что plag-in под Cinema 4D это то- же самое, что и приложения под Android, но с реализованной этой заменой. Просмотрев внимательно структуру каталогов самого пакета Cinema 4D можно вполне обоснованно утверждать, что они вновь организованы как очень большой плагин с объемным набором подплагинов.
Следующий вопрос, а как же реализуется процесс отладки? Иногда, но не очень часто, по крайней мере, не всегда, написанный на Python код можно перезагрузить. Для этого в системе есть команда повторной загрузки (перегрузка в русском варианте) плагинов. Но часто нужно перезапустить пакет заново и такой механизм, другого нет, очень неудобен. Желательно иметь отладочную версию Cinema 4D, что достигается выполнением таких пунктов руководства http://www.smart-page.net/blog/2011/05/09/advanced-python-plugin-coding-for-cinema-4d/
-
Создать копию инсталляции Cinema 4D и назовите ее, к примеру, “Cinema 4D R14 Dev”.
-
Избавиться т вех Cinema 4D плагинов, которые не нужны в вашей разработке
-
Поместите пустой текстовый файл с именем “c4d_debug.txt” в корневой каталог копии Cinema 4D.
Внешне, запуск изменился и вы уже не находитесь в системном каталоге с ограничением доступа:
Рис. 4.
Здесь же вы видите этот второй путь(очень к нему близкий) расположения плагина. Ко всему сказанному нужно добавить, что вызывает искреннее удивление отсутствие в самом пакете каких либо средств работы с плагинами. У нас теперь 2 интерпретатора, исходный и его копия. Тут вы решайте сами, каким пользоваться. Дело в том, что возможны автоматические обновления, которые гарантированно будут произведены над оригиналом, но не над копией. И вы можете оказаться в ситуации, когда тестирование в копии пройдет, а на оригинале работать не будет. Тем не менее, если желаете внести изменения согласно рис. 2 и они будут иметь вид:
Рис.5.
Естественно, проверка на работоспособность, как на рис.3 крайне желательна с контролем вывода консоли Eclipse:
Finding files… done.
Importing test modules … done.
———————————————————————-
Ran 0 tests in 0.016s
OK
При этом, если вы уже эти плагины прежде обработали как проекты и хотите сделать ту же работу, но с другим расположением Cinema 4D, как у меня на рис. 4 и рис.5, то нужно убрать созданные Eclipse файлы описания проекта. Вы их легко найдете сравнением.
Работой, которой мы займемся в следующей статье, будет создание Object Plugin на основе материала из статьи 2. Но давайте взглянем на содержимое каталогов, сходного по типу плагина, из документации (C4DR14041PYTHONSDKHTML20130513) под именем Py-DoubleCircle.
Рис. 6.
Мы видим, какие задачи решает подкаталог ресурсов. Заголовочные файлы я уже упоминал, иконка задается в формате .tif. Локализация определяется каталогом string_us (у нас она должна быть string_ru).
В правой части рис.6 видна константа регистрации PLAGIN_ID = 1025245. Это тот номер, который выдала Cinema 4D для этого плагина. При разработке можно обойтись зарезервированным для этой цели диапазоном констант от 100001- 100010.
И последнее, документация к Cinema 4D включает два файла
CINEMA4DR15SDKHTML20130925.zip
CINEMA4DR15037PYTHONSDKHTML20130823.zip
Первый файл это документация для С++, второй для Python. Скачать их можно здесь http://www.maxon.net/ru/support/developer-support.html . Причем, очень часто данные для Python программирования могут находиться и в файле для C++. Поэтому, желательно настроить Eclipse и для работы с C++.
Поскольку Eclipse это не более чем универсальная среда разработки , то собственного компилятора С++ не содержит и вам придется установить компилятор дополнительно. Если желаете применять возможности C++ 11, то наилучшим выбором будет компилятор от Intell. Во всех случаях с установкой ПО вам поможет rutracker.org. В остальном, настройка на конкретный компилятор реализуется так же, как и на Python интерпретатор (рис.2)
На этом, все. Следующая статья будет посвящена уже разработке конкретного плагина, на основе материала предыдущей статьи. Разработка будет выполнена с помощью Eclipse и там же, упомянутые выше вопросы организации кода, созданием интерфейса пользователя, обработки событий и прочие интересности, мы и рассмотрим.
Рейдер Эдуард Ефимович, к.ф.-м.н