Python

Хоткей для выбора активной камеры

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

Оператор для скрытия объекта во всех сценах

Для того, чтобы скрыть объект в окне 3D Viewport только для текущей сцены мы все пользуемся оператором object.hide_view_set, вызов которого равносилен нажатию на иконку с глазом в аутлайнере. Однако для того, чтобы скрыть объект во вьюпорте сразу для всех сцен проекта – нажатие на иконку с изображением монитора, специального оператора не предусмотрено. Сделаем его сами.

Как вынести динамически заданное свойство объекта на пользовательскую панель

В Blender API рекомендуется задавать дополнительные свойства для объектов через классы, предопределенные в bpy.props. Например для добавления целочисленного свойства используется класс bpy.props.IntProperty. Такие свойства удобны, хорошо работают и легко выносятся на панели пользовательского интерфейса.

Как применить трансформации к мешу с помощью Blender Python API

Для того, чтобы применить текущие трансформации к объекту нужно все его точки умножить на его глобальную матрицу, саму же матрицу нужно сделать единичной.

Шина передачи сообщений

В API Blender существует модуль, с помощью которого можно отслеживать изменение любого свойства, доступного через Python API. Этот модуль – шина передачи данных или “Message Bus”.

 

Рассмотрим, как можно создать функцию-обработчик события для отслеживания изменения какого-либо свойства. Например – местоположения 3D курсора в сцене.

Как присвоить цветовые метки коллекциям с помощью Blender Python API

Начиная с версии Blender 2.9 для коллекций добавлена возможность назначать цветовые метки – отображение а аутлайнере определенным цветом.

Значение цветовой метки коллекции хранится в ее свойстве “color_tag”. Для того, чтобы изменить цветовую метку у коллекции, нужно присвоить этому свойству определенное значение.

Например, для пометки текущей активной коллекции зеленым цветом:

Оператор для переключения чекбоксов

Оператор wm.context_toggle предназначен для переключения состояния чекбоксов в интерфейсе Blender. С его помощью можно настроить быстрое переключение любых чекбоксов в любых окнах и панелях.

Для примера настроим включение/выключение отображения сетки (wireframe) во вьюпорте.

Как найти, в какой коллекции размещен нужный объект

Если нужный объект расположен в скрытой коллекции, в больших сценах бывает сложно его найти.

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

Например для камеры:

Этот код вернет список камер и коллекций в которых они размещены.

Переопределение контекста

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

Если вызывать, например, оператор, предназначенный только для работы в области 3D вьюпорта в Python-консоли, оператор или просто не выполнится:

или вернет сообщение о неверном контексте:

Однако выполнить операторы в “не родной” рабочей области все же можно. Для этого в любой оператор можно передать первым неявным параметром указание на контекст рабочей области, в которой должен быть выполнен этот оператор. Этот параметр обычно называют “переопределенный контекст”.

Как сменить текущий инструмент при помощи Blender Python API

Для того, чтобы переключить активный инструмент из Т-панели в окне 3D вьюпорта нужно вызвать соответствующий оператор в параметре “name” которого нужно передать идентификатор idname требуемого инструмента.

Например для того, чтобы включить выделение окружностью Select Circle нужно вызвать оператор:

Как подключить Python-модуль по абсолютному пути

Модули, используемые в скриптах и аддонах Blender, располагаются или в той же директории, что и сам скрипт или аддон, или в директории установки Blender по пути “версия_blender\python\lib\”. Однако возможно подключить для работы и модуль, расположенный в другом месте на жестком диске.

Для этого нужно подключить модуль по его абсолютному пути.

Как привязать меш к кости с сохранением текущего положения

Если требуется привязать меш к кости арматуры так, чтобы меш сохранил свое текущее положение, при помощи Blender Python API, нужно выполнить следующие действия:

Как переместить кость арматуры на место кости другой арматуры

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

Для этого нужно выполнить следующий код:

Расчет Bounding Sphere для объектов

Чаще всего для быстрых упрощенных расчетов с геометрией объектов используются их Bounding Box – минимальный параллелепипед, в который вписан данный объект. Однако. иногда большую точность и простоту в расчетах может дать Bounding Sphere – минимальная сфера, в которую можно вписать объект. И если размеры и расположение Bounding Box доступно в Blender для любого объекта сразу, Bounding Sphere необходимо рассчитывать самостоятельно.

Напишем функцию, которая на основании переданного объекта вернет нам координаты центра и радиус описывающей его Bounding Sphere.

Особенности инвертирования матриц

Попытка инвертировать матрицу преобразования при помощи метода inverted() может привести к ошибке, если, например, на объект, для которого вычисляется исходная матрица оказывает влияние какой-нибудь ограничитель.

В этом случае Blender сгенерирует ошибку вида:

ValueError: Matrix.invert(ed): matrix does not have an inverse

Многострочный текст в панелях интерфейса Blender

К сожалению, интерфейс Blender не поддерживает перенос строк и многострочный вывод в текстовых полях. Слишком длинные для показа на панели текстовые строки обрезаются. Однако, текст в несколько строк все же можно вывести на панель интерфейса, используя несколько текстовых элементов вместо одного.

Для начала создадим простейшую панель в N-панели окне вьюпорта 3D Viewport и разместим на ней текстовый элемент label с нужным текстом.

Как получить количество треугольников для меша

Чтобы получить количество вертексов, ребер и полигонов меша, можно просто взять их количество из нужного блока данных: vertices, edges и polygons. Однако в структуре меша нет отдельного блока данных под треугольники.

Для того, чтобы получить количество треугольников в меше, нужно выполнить следующий код:

Вертикальный и горизонтальный углы FOV камеры

Камера в Blender всегда определяется двумя углами поля видимости FOV – вертикальным и горизонтальным.

Один из них всегда задается пользователем через параметр камеры – Feild of View (или комбинации параметров Focal Length и Sensor Width).

Особенности использования матрицы масштаба

Для того, чтобы манипулировать трансформациями объектов при помощи матриц в Blender включен модуль “mathutils” в котором определен класс “Matrix”. С помощью этого класса можно удобно создавать нужные матрицы трансформаций – перемещения, поворота и масштаба.

Для создания матрицы масштабирования используется следующая команда: