Создание собственного аддона с помощью аддона NodeTree Source
Пример использования аддона NodeTree Source для создания отдельного аддона, который сам строит сложные нодовые деревья.
Пример использования аддона NodeTree Source для создания отдельного аддона, который сам строит сложные нодовые деревья.
Аддон Blender для конвертации нодов материалов в исходный код на python и сохранения его в библиотеке.
Для управления поворотом объекта служит свойство “rotation_euler”. Оно представляет собой список из трех значений, каждое из которых соответствует повороту вокруг координатных осей в радианах. В rotation_euler[0] хранится поворот вокруг оси X, в rotation_euler[1] – вокруг оси Y и в rotation_euler[2] – вокруг оси Z. Для того, чтобы повернуть объект вдоль нужной оси на нужный угол, нужно задать значение поворота в радианах в соответствующем нужной оси поле rotation_euler.
Например, чтобы повернуть активный объект вокруг оси X на 90 градусов, нужно выполнить следующий код:
1 2 |
import math bpy.context.active_object.rotation_euler[0] = math.radians(90) |
math.radians удобно использовать для преобразования угла из градусов в радианы.
Режим отображения flat/smoot моделей регулируется через свойство “use_smooth” для каждого полигона модели.
Для того, чтобы включить режим сглаженного (smooth) отображения полигонов, нужно для каждого полигона установить свойство “use_smooth” равным True.
Для активного объекта:
1 |
bpy.context.object.data.polygons.foreach_set('use_smooth', [True] * len(bpy.context.object.data.polygons)) |
Чтобы установить режим отображения флэт (flat) – для каждого полигона нужно установить “use_smooth” равным False.
1 |
bpy.context.object.data.polygons.foreach_set('use_smooth', [False] * len(bpy.context.object.data.polygons)) |
Чтобы изменение отобразилось на экране, нужно вызвать обновление данных объекта.
1 |
bpy.context.object.data.update() |
Для переключения к виду из камеры нужно выполнить следующую команду:
1 |
bpy.ops.view3d.view_camera() |
Данный оператор работает в режиме “тоггл”, поэтому его повторное выполнение вернет вид в окне к предыдущему состоянию.
Для того, чтобы перейти из глобальной системы координат в локальную систему координат объекта нужно умножить глобальные координаты на инвертированную матрицу объекта:
1 2 3 4 5 |
import copy object_matrix_inverted = copy.copy(bpy.context.object.matrix_world) object_matrix_inverted.invert() cursor_location_local = object_matrix_inverted @ bpy.context.scene.cursor.location |
Для того, чтобы перейти из локальной системы координат объекта в глобальную систему координат нужно умножить локальные координаты на матрицу объекта:
1 2 3 4 5 |
import copy object_matrix = copy.copy(bpy.context.object.matrix_world) vertex_0 = bpy.context.object.data.vertices[0].co vertex_0_global = object_matrix @ vertex_0 |
В линейке Blender 2.8x система отмены операций undo/redo (ctrl+z / ctrl+shift+z) была полностью переделана по сравнению с линейкой 2.7x. Одним из результатов такого изменения API является то, что при выполнении операции отмены все объекты в сцене перестраиваются заново – текущий объект уничтожается, а вместо него создается совершенно новый объект. Ссылки, которые указывали на старый объект, до выполнения операции отмены, после нее указывают на невалидный объект с которым больше нельзя работать.
Ссылки на объекты ломаются при использовании отмены ctrl+zRead More »
В Blender 2.81 и более ранних версиях в python-консоли можно было просмотреть возможные варианты завершения набираемого кода, нажав “ctrl + пробел”. В Blender 2.82 эта возможность исчезла.
На самом деле этот функционал в 2.82 не удален, его просто перенесли на нажатие клавиши “tab“.
Часто элементы интерфейса, размещаемые в пользовательских панелях, не соответствуют друг другу по размерам, в результате чего общая компоновка панели выглядит не красиво. В качестве наглядного примера создадим пользовательскую панель и разместим на ней кнопку оператора и текстовое поле ввода.
Выровнять размеры кнопки и поля ввода здесь напрашивается само собой.
Выравнивание элементов пользовательского интерфейса по колонкамRead More »
Для того чтобы получить список коллекций со всеми внутренними коллекциями, можно использовать следующую функцию:
1 2 3 4 |
def collections(collection, col_list): col_list.append(collection) for sub_collection in collection.children: collections(sub_collection, col_list) |