Аргументы командной строки¶
-b , —background Run in background (often used for UI-less rendering). -a , —render-anim Render frames from start to end (inclusive). -S , —scene Set the active scene for rendering. -f , —render-frame
Render frame and save it.
- + start frame relative, — end frame relative.
- A comma separated list of frames can also be used (no spaces).
- A range of frames can be expressed using .. seperator between the first and last frames (inclusive).
Set the render path and file name. Use // at the start of the path to render relative to the blend-file.
Символы # заменяются номером кадра, и используются для выравнивания номера нулями слева.
- ani_##_test.png станет ani_01_test.png
- test-######.png станет test-000001.png
Если имя файла не содержит символов # , по умолчанию к имени добавится суффикс #### .
Номер кадра будет добавлен в конец имени файла, т.е.:
blender -b foobar.blend -o //render_ -F PNG -x 1 -a
//render_ станет //render_#### , для которого будут записаны фреймы вида //render_0001.png
-E , —engine Specify the render engine. Use -E help to list available engines. -t , —threads Use amount of for rendering and other operations [1-64], 0 for systems processor count.
Опции формата¶
-F , —render-format
Set the render format. Valid options are TGA RAWTGA JPEG IRIS IRIZ AVIRAW AVIJPEG PNG BMP
Formats that can be compiled into Blender, not available on all systems: HDR TIFF EXR MULTILAYER MPEG FRAMESERVER CINEON DPX DDS JP2
-x , —use-extension Set option to add the file extension to the end of the file.
Опции проигрывания анимации¶
Проигрывает файлы , но только когда программа работает не в фоновом режиме.
-p Open with lower left corner at , . -m Read from disk (Do not buffer). -f Specify FPS to start with. -j Set frame step to . -s Play from . -e Play until .
Опции окна¶
-w , —window-border Force opening with borders. -W , —window-borderless Force opening without borders. -p , —window-geometry
Отдельные опции игрового движка¶
-g Отдельные опции игрового движка
fixedtime Run on 50 hertz without dropping frames. vertexarrays Use Vertex Arrays for rendering (usually faster). nomipmap No Texture Mipmapping. linearmipmap Linear Texture Mipmapping instead of Nearest (default).
Опции Python¶
Опции отладки¶
Turn debugging on.
- Включает обнаружение ошибок памяти
- Отключает захват мыши для взаимодействия с отладчиком
- Сохраняет sys.stdin Python (не устанавливает его в None)
Различные опции¶
—factory-startup Skip reading the startup.blend in the user’s home directory. —env-system-datafiles Set the BLENDER_SYSTEM_DATAFILES environment variable. —env-system-scripts Set the BLENDER_SYSTEM_SCRIPTS environment variable. —env-system-python Set the BLENDER_SYSTEM_PYTHON environment variable. -nojoystick Disable joystick support. -noglsl Disable GLSL shading. -noaudio Force sound system to None. -setaudio Force sound system to a specific device. NULL SDL OPENAL JACK . -h , —help Print this help text and exit. -R Register blend-file extension, then exit (Windows only). -r Silently register blend-file extension, then exit (Windows only). -v , —version Print Blender version and exit. — End option processing, following arguments passed unchanged. Access via Python’s sys.argv .
Experimental Features¶
—enable-new-depsgraph Use new dependency graph. —enable-new-basic-shader-glsl Use new GLSL basic shader.
Прочие опции¶
/? Print this help text and exit (windows only). —debug-freestyle Enable debug messages for FreeStyle. —debug-gpu Разрешает отладочный контекст GPU и информацию для OpenGL 4.3+. —disable-abort-handler Disable the abort handler. —verbose
Разбор аргументов¶
Аргументы должны быть разделены пробелами, т.е.
blender -ba test.blend
…will ignore the a .
blender -b test.blend -f8
…will ignore 8 because there is no space between the -f and the frame value.
Порядок аргументов¶
Аргументы обрабатываются в том порядке, в котором они заданы, т.е.
blender --background test.blend --render-frame 1 --render-output '/tmp'
…will not render to /tmp because —render-frame 1 renders before the output path is set.
blender --background --render-output /tmp test.blend --render-frame 1
…will not render to /tmp because loading the blend-file overwrites the render output that was set.
blender --background test.blend --render-output /tmp --render-frame 1
… работает как это и указано.
Переменные окружения¶
| BLENDER_USER_CONFIG: | |
|---|---|
| Каталог для конфигурационных файлов пользователя | |
| BLENDER_USER_SCRIPTS: | |
| Каталог для пользовательских скриптов | |
| BLENDER_SYSTEM_SCRIPTS: | |
| Каталог для общесистемных скриптов | |
| BLENDER_USER_DATAFILES: | |
| Каталог для пользовательских файлов данных (иконы, переводы и пр.) | |
| BLENDER_SYSTEM_DATAFILES: | |
| Каталог для общесистемных файлов данных | |
| BLENDER_SYSTEM_PYTHON: | |
| Directory for system Python libraries. | |
| TEMP: | Сохранять временные файлы сюда |
| TMP: | или $TMPDIR Сохранять временные файлы сюда |
| SDL_AUDIODRIVER: | |
| Аудиодрайвер LibSDL — alsa, esd, dma. | |
| PYTHONHOME: | Path to the Python directory, eg. /usr/lib/python. |
© Copyright : This page is licensed under a CC-BY-SA 4.0 Int. License.
Основы Python API для Blender
Приветствую всех блендерщиков, не блендерщиков и других, кто решил сюда заглянуть. Сегодня я попробую доступным образом объяснить, как писать простенькие скрипты для блендера и не только Язык, который мы будем использовать — Python. Он простенький, с необычным синтаксисом лично для меня, человека, который начал и в течении двух лет учил С++. В этой статье я не буду делать урок по питону, она рассчитана на то, что вы хотя бы поверхностно знаете его. Этого можно легко добиться, посмотрев пару уроков на ютубе или прочитав в интернете. Если возникнет какая-то проблема, то пишите в комментарии Кстати, если заметили ошибку, знаете решение оптимальнее, то не стесняйтесь писать об этом (естественно, адекватно, а без наездов в стиле «автор — ламер-гумманитарий» и т.п.). Я бы не назвал себя прям таким мидл питон программистом, или человеком, который очень глубоко знает API для блендера, но моих знаний хватает, чтобы писать скрипты, которые очень могут облегчить жизнь, или те же интерфейсы. Ну чтож, мы что-то отвлеклись на отступление, пожалуй, начнем!
Подготовка
Мы будем писать код прямо в блендере, так как это будет удобнее. Чтобы использовать модули API вне блендера, требуются определенные махинации, которые в том числе включают компиляцию блендера из исходников. Однако в 3.4 в этой области ожидается улучшение, я пока что не тестировал, да и урок будет в 3.3 Для начала стоит изменить настройки. Переходим в Edit->Preferences->Interface. Ставим галочки у пунктов Developer Extras и Python Tooltips
Первое откроет оператор Edit source при правом клике на определенные элементы интерфейса. Он открывает файл в текст едиторе по пути , который содержит код, определяющий этот элемент. Почти весь интерфейс блендера написан на питоне, и лежит в папках по пути выше. Так как python — интерпретируемый язык, то текст лежит в .py файлах (однако стоит заметить, что код можно скомпилировать, тогда его не получится отредактировать, но такая возможность не используется в угоду легкой редактируемости). Можно легко залезть в каталоги, и что-то поправить в UI. Но и тут есть подвох: по какой-то причине часть элементов реализована в ядре блендера, то есть написана на С/С++, закомпилирована в бинарник (т.е. в blender.exe или же просто blender для Линукса, исполняемые файлы не носят расширения там), и отредактировать их без перекомпиляции блендера не получится. Если вы наткнетесь на такое, то оператор известит вас, что исходники недоступны Второй оператор добавляет Python подсказки, когда вы оставляете курсор неподвижным на элементе. Увы, мой скриншотер сбивает фокус курсора, поэтому сплывашка изчезает, и заскринить ее не удалось:( После этого переходим в такую непримечательную рабочую область в самом конце под названием Scripting. если у вас ее нет, но нажимаете на плюсик в конце, потом оттуда выбираем General->Scripting
Там практически все необходимое для того, чтоб писать скрипты. Ну чтож, пора познакомится с нашими инструментами
Окно по середине — это Text Editor, редактор, в котором будет производится основное действие, и который был упомянут ранее. По сути — это обычный блокнот с подсветкой синтаксиса, у которого есть кнопка запуска скрипта, и всякие опции, типа автоматического запуска скрипта при открытии файла
Второй по значимости редактор — это Python Console. Это встроенная консоль с питоном и определенными преднастройками, которая позволяет быстро запускать функции без написания скрипта, или просматривать содержимое классов/модулей
Третий, не особо часто используемый, но определенно полезный редактор — Info. Просто список операторов, которые подразумевались под выполнением каких-то действий пользователем (нажатие хоткея, кнопки и т.п.). По сути — аналог майской строки внизу, где указывается MEL команда, когда что-то происходит, ни больше, ни меньше
остальные редакторы — это все уже знакомое, вьюпорт, панель свойств, оутлайнер в обычном режиме и режиме отображения структуры текущего blend файла Мы будем работать с консолью, так как это легче в начале. Для открытия консоли в Windows надо нажать Window->Toggle System Console, для Линукса необходимо запускать блендер через консоль На этом необходимый сетап выполнен, можно приступать к кодингу!
Использование инструментов
Для начала напишем hello world, чтобы понять, как работать с инструментами Напишем во внутренней консоли
print("hello world")
И получим ожидаемый ответ
Как уже было ранее сказано, консоль внутри блендера идентична консоли, в которой был запущен Python. Однако в системной консоли вывода от принта не будет, так как он ушел в виртуальную консоль Теперь напишем код, который будет выводить hello world уже в системную консоль. Создаем новый текстовый файл в текст едиторе, пишем идентичный код, нажимаем на кнопку запуска, и смотрим в консоль
Стоит заметить, что инфо редактор отреагировал на нажатие кнопки запуска, выдав оператор, который скрывается за кнопкой
Помимо исполнения кода, внутренняя консоль может отображать документацию к функциям и члены модуля/класса
Чтобы так сделать, надо написать точку/скобку (в зависимости от того, что из себя представляет сущность), и потом нажать Tab. В консоли появится лаймовый текст с документацией или членами сущности. Tab — это на самом деле функция автодополнения, так что помимо быстрого доступа к документации этот хоткей можно использовать по его прямому назначению Существует опция Register в пункте Text заголовка. Этот флажок говорит о том, что необходимо запускать скрипт, когда загружается blend файл. Она может очень часто использоваться, а почему — мы поговорим позже
Теперь, когда мы научились пользоваться инструментами, пора уже перейти к самому API
Собственно API
Для того, чтоб как-то взаимодействовать с блендером, нам надо импортировать модуль под названием bpy. Он идет вместе с блендером. Чтобы начать работать с ним, необходимо написать в начале скрипта:
import bpy
Теперь нам доступны все элементы bpy, которых не так уж и много. Их можно посмотреть через Tab в консоли
Мы будем разбирать их в порядке важности/частоты использования
Контекст (bpy.context)
Это один из важнейших классов API. Он содержит в себе различные объекты и коллекции, которые отображают то, что сейчас происходит в блендере. именно через него можно получить активный объект, или все выделенные например. Список того, что можно получить через него — довольно огромен. Мы можете посмотреть сами, используя выше описанный трюк с автодополнением Практически все элементы контекста — read only, то есть вы не можете их изменять напрямую. Однако это возможно путем изменения данных объектов или других функций API Часть контекста напрямую зависит от того, где запускается код. В документации расписано, какие элементы подчиняются этому правилу Лишь малая часть контекста независима, и везде будет одинакова В пример приведу коллекцию, относящуюся к анимации — editable_fcurves. Она содержит в себе редактируемые анимационные кривые. Если вы запустите такой код в консоли (кстати, вот и та самая изначальная настройка консоли — заранее импортирована часть модулей + для сокращения времени печатания есть парочку переменных, например С -это bpy.context в консоли)
print(C.editable_fcurves)
То вы неожиданно обнаружите, что коллекция имеет тип None, т.е. там ничего нету, даже если в редакторе графов будет хоть одна кривая. Как же так?! — спросите вы. Это и есть пример зависимости контекста от того, где запускается код. Но, если вы обернете функцию в оператор (о чем пониже), и запустите в граф едиторе через F3, то вместо None будет напечатана коллекция, все будет нормально
Операторы (bpy.ops)
Я очень часто упоминаю их, так что пора бы рассказать, да и тем более это очень важная часть программной экосистемы блендера Оператор — это по сути функция, которая что-то делает, но оформлена в виде класса, из-за того что для оператора приходится хранить кучу дополнительных данных
bpy.types.Operator
Каждый оператор — это класс, который наследуется от класса выше. Код обязательно должен быть обернут в класс оператора, если надо, чтобы он запускался из интерфейса (будь то кнопка, или пункт в меню), а не только вызывался другим кодом Пример того, как должен быть реализован оператор, есть в Templates-Python->Operator Simple
Данный оператор может быть сложен для первого раза, поэтому упрощу код, убрав все лишнее
Для начала импортируем модуль bpy, все как обычно. Потом создаем класс, и в качестве родителя указываем bpy.types.Operator Текст в тройных кавычках — то, что будет отображаться во встроенной консоли в качестве документации
bl_idname — это встроенное поле. Оно должно быть обязательно указано. Это по сути ID оператора, то, как к нему будет обращаться остальная система (включая вас и остальных скриптеров/прогеров). Оно включает имя подмодуля в bpy.ops и само имя оператора. Если имя подмодуля уже существует, то оператор станет членом этого модуля, иначе — создастся новый подмодуль bl_label — это имя оператора уже в UI, то есть то, что будет отображаться в том же меню метод poll — это способ ограничить применение оператора, если существует риск появления контекста, где оператор завершится с ошибкой, либо бесполезен по самой логике. True — оператор будет доступен, False — нет. В нашем примере оператор будет запускаться, только если есть активный объект. Можно создать любое условие, например запуск в определенном режиме объекта, или если выделены определенные элементы, все. что вам позволяет делать контекст execute — это собственно метод, где находится то, что делает оператор. Метод обязательно должен вернуть словарь (т.е. фигурные скобки, «< >«) со строкой, которая означает статус завершения работы оператора. Обычно используют два значения — ‘FINISHED’, что значит, что все хорошо, и ‘CANCELLED’ — значит работа оператора была прекращена по какой-то причине
def execute(self, context): . return
Естественно, это не все, что можно сказать по операторам, это очень обширная тема. Например, существуют метод invoke, который позволяет проинициализировать оператор перед запуском, модальные операторы (их пример — это GRS операторы. Подробнее о модальных операторах можно почитать тут) и многое много другое. Все это рассказывать очень долго, но есть то, что хотелось бы мне добавить У операторов существует огромное количество разных свойств, помимо bl_idname и bl_label. Они все помогают настроить поведение оператора, но есть одно очень важное, которое почему-то не было вынесено в шаблон оператора, и без которого оператор даже не сможет отменяться — это bl_options. Оно принимает словарь из ключевых слов, которые указывают определенные опции оператору. Например ‘UNDO’ — оператор может отменяться, или ‘REGISTER’ — оператор будет иметь панель повтора снизу. В основном это самые популярные используемые опции, их стоит запомнить
bl_options =
Чтобы передавать оператору параметры (если он используется в качестве функции) или поставить какие-то определенные (если он например оформлен в виде кнопки, и значения уже определены), то необходимо использовать свойства из bpy.props. Об этом будет ниже
Регистрация классов
Однако после написания класса блендер не будет видеть оператор. Для того, чтобы это исправить, необходимо зарегистрировать его. В начале своего запуска блендер вообще ничего не знает ни о операторах (кроме тех, что реализованы в ядре), ни о различных панельках, менюшках, которые реализованы на питоне. Каждый такой элемент должен быть зарегистрирован при помощи функции bpy.utils.register_class(). Практически каждый оператор, каждая менюшка, которая реализована в , так или иначе проходит процедуру регистрации через register_class В нашем примере есть код, который регистрирует класс. Он расположен в функции register. далее идет код, который значит, что при запуске скрипта будет выполнена функция register(). Также есть функционал для отмены регистрации класса, это соответственно bpy.utils.unregister_class(). Она нужна например аддонам, чтобы когда ты выключал аддон, от них ничего не оставалось Стоит заметить, что порядок регистрации имеет очень важную роль. Если сначала зарегистрировать панельку, которая использует оператор, а только потом сам оператор, то будет ошибка Чтобы наконец-то увидеть результат нашего оператора, нажимаем кнопку запуска, и вуаля — в системной консоли отобразится информация о классе объекта, а через F3 появится возможность запускать оператор. Галочка Register у текста нужна именно за этим — чтобы каждый раз самому не запускать скрипт, тем самым запуская регистрацию
UI (bpy.types.UILayout и другие)
Думаю, многие этого ждали В блендере очень много UI элементов — панельки, менюшки, кнопки, и т.п. и т.п. С каждым можно так или иначе работать через API Начнем пожалуй с панелек. думаю, каждый бы хотел что-то прикрутить справа во вьюпорте. Для этого нам надо Создать класс, производный от bpy.types.Panel. Я возьму пример от моего проекта
У класса панели имя желательно должно строится образом — имя_пространства_PT_свой_текст bl_space_type — пространство или редактор, в котором будет отображаться панель bl_region_type — тип региона, в котором будет отображаться панель. У окна есть несколько регионов, мы указываем ‘UI’ bl_category — категория, в которой будет панелька. Если указываем существующее, то панель будет там же вместе с остальными панелями, которые указали такой регион, если такой категории не будет — то она создастся. Ну и bl_label — это само название панели У панели также есть метод poll, чтобы избегать запуска в неправильном контексте, аналогично оператору Вместо метода execute у панели и другого UI есть метод draw — это метод, отвечающий за рисование внутри сущности. В блендере UI описывается функциональным подходом — то есть хотим поместить оператор — вызываем функцию, которая создаст оператор, потом настраиваем элемент, передавая функции соответствующие аргументы Модернизируем наш код, чтобы теперь он отображал панель в 3д вьюпорте
Пока что она пустая, надо бы ее наполнить элементами Для того, чтобы начать работать с UI — берем у self поле layout
layout = self.layout
У лайяута ОЧЕНЬ много методов и всяких полей, всех их можно прочитать тут. Я же перечислю часто используемые
row = layout.row()
создает ряд с элементами, которые идут по горизонтали
column = layout.column()
Это собрат row(), но уже по вертикали. Это колонка элементов Значение, которое возвращает метод, необходимо принять в переменную, иначе не получится получить доступ к ним Хочу заметить, что у каждого вышеописанного метода возвращаемое значение имеет тип UILayout, т.е. все, что было и будет сказано для лайяута, применимо ко всем перечисленным элементам: вам ничто не мешает сделать ряд, а в нем столбцы Очень важные методы — это layout.prop и layout.operator
layout.operator('module_name.op_name')
Дает доступ к оператору из UI. Может быть и кнопкой с текстом, и с иконкой Используем полученные знания, чтобы наполнить нашу панельку
Теперь у нас появилась кнопка с нашим оператором. Если при вызове row.operator() задать параметр text, то можно задавать кастомный текст
Для того, чтобы оставить только иконку, необходимо выставить text как », а также указать ID иконки. Айдишник можно взять пи помощи встроенного аддона Icon Viewer, что мы и сделаем
Если использовать несколько row.operator() подряд, то можно заметить, чем row отличается от column
Аналогично можно сделать и с column Теперь следующий наиболее важный метод
layout.prop(object, 'path_to_data')
Позволяет вынести уже свойство объекта в UI. Сначала пишется то, с чего берется свойство, потом путь до свойства в виде строки относительно объекта. Чтобы узнать путь, можно просто навестись на свойство в UI. Как я понял, блендер не воспринимает вложенные объекты. Т.е. если у класса Scene есть поле под класс SceneEEVEE, который хранит настройки eevee, то для того, чтобы допустим вынести количество семплов, надо задавать объектом scene.eevee, а путь — просто ‘taa_samples’. В UI в зависимости от настроек свойства будет отображаться соответствующий виджет
И последнее, что хотелось бы сказать по UI — это меню. Они делаются как и все UI классы, но чтобы прицепить это меню к существующим, необходимо использовать коллбек — функцию, которая передается в параметр другой функции, которая потом где-то вызывает первую В нашем случае мы пишем сначала класс менюшки
class VIEW3D_MT_test(bpy.types.Menu): bl_label = "test" def draw(self, context): layout = self.layout layout.operator(. )
А потом коллбек функцию, подобную draw(self, context). Единственное условие — параметры должны совпадать, на этом — все. Теперь берем и пишем код, используя метод layout.menu(). Думаю, вы догадались, что оно сделает
def draw_func(self, context): layout = self.layout layout.menu(menu_name) .
После написания функции ее надо прицепить туда, куда нам надо. Вот тут и пригодится оператор Edit Source. Выясняете, в каком месте рисуется меню, и тем самым находите класс, который представляет меню. Например, для менюшек в заголовке вьюпорта это будет
bpy.types.VIEW3D_MT_editor_menus
Далее необходимо вызвать у класса метод append()
bpy.types.VIEW3D_MT_editor_menus.append(draw_func)
Кстати, не забываем про регистрацию. И меню, и панели надо сначала регистрировать, а только потом использовать
Свойства (bpy.props)
Еще одна очень важная тема, чтобы полноценно писать то же UI для ригов
bpy.props — это по сути обертка для более низкоуровневой и сложной системы — RNA Свойства есть так и у объектов, так и у операторов Есть немало разных свойств, но я перечислю самые часто используемые: IntProperty (целое число), FloatProperty (число с плавающей запятой), BoolProperty (булево значение) Существует также StringProperty, EnumProperty и куча других. Обо всех свойствах можно прочитать тута Синтаксис для операторов и обычных обычных объектов различается Для операторов
var : Property(. )
Для объектов
bpy.types.Type.new_prop = bpy.props.Property(. )
Для операторов свойства можно использовать через self
. prop : IntProperty(name='rbgrb') . def execute(self, context): . a = self.prop
Их можно настраивать через layout.operator()
layout.operator('object.my_op').prop = 1
В нашем случае оператор запустится со значением prop в виде 1 Можно прокинуть свойство в оператор, повесив его на объект
bpy.types.Scene.prop = bpy.props.StringProperty(name='sas') . def execute(self, context): . a = context.scene.prop
В скобках при создании свойства указываются его параметры. Именно так например можно сделать слайдер
У свойств огромная куча комбинаций использования. Какой метод будет лучше — зависит от задачи
Остальные Модули
- bpy.data — все данные текущего blend файла
- bpy.app — модуль позволяет получить информацию о самом блендере, дает доступ к обработчикам, таймерам, и прочим штукам для чего-то сложнее панельки или оператора
- bpy.types — содержит все когда-либо зарегистрированные классы
- bpy.utils — содержит различные вспомогательные функции, вроде register_class
- bpy.path — необходим при работе с путями
- bpy.msgbus — модуль, который нужен, когда необходимо отслеживать изменения данных
Помимо bpy есть и другие модули. Их необходимо импортировать отдельно
- mathutils — математика: вектора, матрицы, все, что пожелаете
- aud — модуль работы со звуком
- bgl — устаревший модуль для низкоуровневого взаимодействия с GPU. Не надо его использовать
- bl_math — если вам было мало mathutils, то вот вам еще)
- blf — для низкоуровневой работы со шрифтами
- bmesh — модуль для работы с мешем. Перед применением лучше прочитать мануал
- bpy_extras — различные дополнительные функции
- freestyle — модуль для работы с фристайл рендером
- gpu — как bgl, но лучше, и не будет выпилен
- gpu_extras — небольшой модуль со всякими доп штуками для GPU
- idprop.types — крайне мало документации. Что-то связанное с данными
- imbuf — модуль для работы с изображениями
Послесловие
Естественно, я не могу описать все на свете. Вы сами видели, сколько одних только модулей, и насколько может рознится сфера их применения. Для того, чтобы нормально писать скрипты, достаточно bpy. А дальше изучаете в зависимости от сферы, в которой работают ваши скрипты
Я оставлю ссылки на различные материалы, которые могут вам помочь
- официальная документация
- Канал в блендер чате, где могут помочь
- На форуме разработчиков тоже могут подсобить
- Плейлист Андрея Соколова, откуда можно подчеркнуть информацию, которую я мог не рассказать, а также небольшой курс по питону
Спасибо всем за прочтение!
748 0 850 5
Спасибо, бро. Для тех, кто в стадии освоения скриптов под названием «ни-бум-бум» – самое то. 😀
Давненько подспудно что-то такое высматривал.
Василий Горожанин Спасибо, бро. Для тех, кто в стадии освоения скриптов под названием «ни-бум-бум» – самое то. 😀
Давненько подспудно что-то такое высматривал.
Рад помочь. Я как раз и рассчитывал в основном на «ни-бум-бум»=) Я думаю, что в принципе после этой статьи будет достаточная база, чтобы дальше самому плясать
Установка Python-пакетов через pip в Blender на Windows 10
Если для работы в Blender необходимо установить дополнительные пакеты модулей на Python, которые не установлены в Blender по умолчанию, вы можете сделать это через pip.

Content on Patreon
Однако, если вы работаете на операционной системе Windows 10, интерпретатор Python устанавливает новые пакеты не в директорию установки Blender, а в персональную директорию пользователя Windows.
В процессе установки в консоль выводится предупреждение:
Defaulting to user installation because normal site-packages is not writeable
Установка пакетов все-таки производится, но они устанавливаются в директорию:
В результате пакеты устанавливаются в систему, но не доступны из Blender – к ним нельзя получить доступ из Python-консоли или текстового редактора Blender при помощи команды import.
Решить проблему можно, жестко указав директорию, в которую pip должен установить нужные пакеты. Это директория “site-packages”, расположенная внутри директории, куда установлен Blender на вашем компьютере.
Определим 2 переменные – в первую запишем путь к исполняемому файлу python.exe в Blender, во вторую – путь, куда будут устанавливаться пакеты.
Настройка Blender 3D для работы со скриптами
Окинув взглядом серию статей, что перевожу, решил написать заметку про настройки Блендера. На всякий случай: вижу в тех статьях руководство, помогающее никогда не программировавшему моделлеру преодолеть барьер между тягаю полигончики и автоматизирую задачи. Думаю, это руководство непо́лно без списка вещей, облегчающих работу с кодом и скриптами в Блендере.
Версия, для которой эта заметка пишется: Blender 3.0

Настроим рабочее пространство
Рабочее пространство: Scripting

Лейауты, они же рабочие пространства: преднастроенный интерфейс под наборы действий. Переключение меж ними измененяет контекст работы: переключившись на Modeling, сразу окажемся в режиме редактирования выделенного объекта, в Layout наоборот, выйдем в объектный режим. А в рабочем пространстве Scripting Блендер сразу откроет важные штуки: командное окно, текстовый редактор и окошко с логом выполненных команд.
Если готовых лейаутов недостаточно, настройте свой.
Переключившись на Scripting, увидим:

Лог команд
Почти любое действие в Блендере отображается в логе. Удобно: сделайте руками что-либо, а потом скопируйте выхлоп из лога в код. А для проверки, как оно сработает, скопируйте выхлоп в командное окно. Если действие не отразилось, придётся читать мануал, или воспользоваться подсказками Блендера. Про них чуть позже.
Клац мышкой по команде выделяет её целиком, а дальше по старинке: Ctrl+C Ctrl+V
Командное окно
Встроенное командное окошко Блендера помогает проверять строчки кода по отдельности. Как напроверяемся, записываем в текстовый редактор.
Хоткеи для этого окошка:
- Стрелки вверх и вниз прокучивают историю команд
- Tab — автозаполнение
Текстовый редактор
Первым делом жмякаем New, и строчим аддоны прямо в Блендере. Стоит сохраняться перед каждым запуском скрипта, потому что риск закинуть Блендер в бесконечный цикл, да или просто крашнуть велик. А беспокоиться о выгрузке скрипта не стоит: в бленд-файле скрипт сохранится (если галочка с Fake User не снята).
Кстати о выгрузке. Если душа к встроенному редактору не лежит, сохраните об него пустой файл скрипта, и откройте в любимой IDE: Блендер постоянно сравнивает открытую версию с сохранённой. Alt+R перезагрузит сохранённую версию, Alt+S — сохранит её.
Важно следить за позицией мышки: Блендер считает, что действия пользователя, включая клацанья по клавиатуре, относятся к тому окну, над которым висит стрелка. Подбешивает с непривычки, понимаю.
Хоткеи для текстового редактора:
- Ctrl+Wheel отмасштабирует написанное
- Alt+P запустит скрипт
- Ctrl+/ закомментирует строку или выделенный блок
- та же комбинация снимет комментарии
- Shift+Tab снимает табуляцию со строки или блока по одной за раз
- Tab накидывает табуляцию и на строку и на блок
- Alt+S сохранит скрипт отдельным файлом
А ещё в нём есть шаблоны: их стоит изучить, многое станет понятнее.
Системная консоль
Многовато консолей, но все полезны. Системная консоль покажет результат выполнения скрипта и ошибки в процессе, и даст завершить его работу, если что-то пошло не по плану.
Если вы (как и я) любите бахнуть сабдив на три тысячи, включите консоль сразу по открытию Блендера: прерывание процессов быстрее переоткрывания бленд-файла.
Хоткей прерывания: Ctrl+C в консоли.
Автозаполнение в консоли Блендера
Конструкции вроде bpy.context.selected_editable_objects[0] неудобны для печати, а с непривычки и для осмысления. С осмыслением сложнее, а вот с печатью — жмяк табом, и Блендер выдаст зелёный список, какие существуют возможности продолжить фразу.
Подсказки
По умолчанию включены пользовательские подсказки: при наведении на элемент мышки появляется окно с описанием того, что этот элемент делает. А ещё есть подсказки для будущих скриптописателей: тогда в них окажется кусок кода, заменяющий физическое взаимодействие с элементом. Таким образом можно писать макросы в духе импортировать файл → отрендерить → удалить объект → повторить n раз. Написать ремешер будет дивно сложнее.
Включить подсказки: Edit → Preferences → Interface → Display → Python Tooltips
Скопировать подсказку: Ctrl+Alt+Shift+C (мой любимый хоткей, без гитары не справился бы).
Режим разработчика
Полезен тем, что даёт визуальный доступ к индексам вершин: пригодятся для постройки мешей.
Включить: Edit → Preferences → Interface → Display → Developer Extras
После чего в режиме редактирования появится нужная галочка:

Дополнительный экран
Windows → New Window откроет второе окно блендера с этим же файлом.
Штука, которая экономит внимание каждый раз, когда предстоит работа с двумя рабочими пространствами одновременно: например, в одном окне настроено для анимации, а во втором открыт редактор кривых.
Развернуть окно во весь экран
Ctrl+Space разворачивает внутреннее окно, над которым мышь, во весь экран. Эта же комбинация разворачивает рабочее пространство обратно.
Коротенько:
- системная консоль подскажет ошибки и спасёт нервы
- включите подсказки
- переключите рабочее пространство на Scripting
- автодополнение: поменьше печатать, получше понимать структуру модулей
- режим разработчика: пересчитай свои вертексы
- доролнительные окна и разворот целевого помогут организовать работу удобно
- сохраняйтесь чаще!
Туториалы, которые перевожу:
- Меши с Python & Blender: двумерная сетка
- Меши с Python & Blender: кубы и матрицы
- Меши с Python & Blender: икосферы
- Меши с Python & Blender: скруглённый куб
- Меши с Python & Blender: круги и цилиндры
