Разработка аддонов для Blender с нейросетью Antigravity

Практический курс, обучающий использованию искусственного интеллекта Antigravity для автоматизации написания кода на Python. Вы пройдете путь от настройки среды до создания полноценных плагинов для Blender, даже не будучи профессиональным программистом.

1. Введение в Blender API и подготовка рабочего пространства с Antigravity

Введение в Blender API и подготовка рабочего пространства с Antigravity

Добро пожаловать в курс по разработке аддонов для Blender! Если вы здесь, значит, вы хотите не просто моделировать, а подчинить себе сам инструмент, автоматизировать рутину и создавать новые возможности. В этом курсе мы будем использовать мощного союзника — нейросеть Antigravity.

Это первая статья, и наша цель сегодня — заложить фундамент. Мы разберемся, как Blender «думает», как настроить его для программирования и как интегрировать в этот процесс искусственный интеллект.

Почему Python и Blender — лучшие друзья?

Blender — это не просто программа для 3D-моделирования. Это, по сути, огромный интерпретатор языка Python. Почти все, что вы видите в интерфейсе — кнопки, меню, панели — написано на Python. Это означает, что у нас есть доступ к тем же инструментам, что и у разработчиков самого Blender.

Когда вы нажимаете кнопку «Создать куб», Blender выполняет команду на Python. Наша задача — научиться писать эти команды самостоятельно, а затем научить Antigravity писать их за нас.

Структура Blender API

Чтобы управлять Blender, нужно понимать его API (Application Programming Interface). Главный модуль, с которым мы будем работать, называется bpy (Blender Python).

!Структура модуля bpy: данные, контекст и операторы.

Давайте разберем три кита, на которых держится скриптинг в Blender:

  • bpy.data — это доступ ко всем данным в вашем файле. Здесь хранятся меши, материалы, текстуры, сцены и объекты. Если что-то существует в файле, оно есть в bpy.data.
  • bpy.context — это «здесь и сейчас». Какой объект выделен? В каком окне находится курсор? В каком режиме мы работаем (Edit Mode или Object Mode)? Контекст определяет, к чему будут применяться наши действия.
  • bpy.ops — это операторы, то есть действия. Создать куб, удалить вершину, сохранить файл — все это операторы. Это те самые функции, которые вызываются при нажатии кнопок.
  • Подготовка рабочего пространства

    Прежде чем писать код, нужно превратить Blender из инструмента художника в инструмент разработчика. По умолчанию многие важные функции скрыты.

    Шаг 1: Включение инструментов разработчика

  • Зайдите в Edit -> Preferences.
  • Перейдите в раздел Interface.
  • Поставьте галочку напротив Developer Extras.
  • Также полезно включить Python Tooltips.
  • Что это дает? Теперь, если навести курсор на любую кнопку в интерфейсе, вы увидите не просто описание, а имя Python-команды, которая за эту кнопку отвечает. Это ваша шпаргалка.

    Шаг 2: Системная консоль

    Это самый важный инструмент для отладки. Если ваш скрипт сломается (а это будет случаться), Blender не всегда покажет ошибку в интерфейсе. Ошибка появится в системной консоли.

    Чтобы открыть её: * Windows: В верхнем меню выберите Window -> Toggle System Console. * macOS/Linux: Рекомендуется запускать Blender через терминал, чтобы видеть вывод.

    > Ошибки — это не провал, это путь к решению. Системная консоль — ваша карта на этом пути.

    Шаг 3: Текстовый редактор vs Внешняя IDE

    В Blender встроен неплохой текстовый редактор (вкладка Scripting). Для коротких скриптов он идеален. Однако для разработки полноценных аддонов мы будем использовать внешнюю среду разработки (IDE), например, Visual Studio Code, так как она предоставляет подсветку синтаксиса, автодополнение и удобную работу с файлами.

    Знакомство с Antigravity

    Теперь перейдем к нашему секретному оружию. Antigravity — это специализированная нейросеть, обученная на документации Blender API и тысячах примеров кода аддонов.

    В отличие от обычного написания кода, где вы должны помнить наизусть все команды, работа с Antigravity строится на диалоге. Вы формулируете задачу на естественном языке, а нейросеть переводит её на язык bpy.

    Как мы будем работать с Antigravity?

    Наш рабочий процесс (пайплайн) будет выглядеть так:

  • Идея: Вы придумываете, что должен делать аддон (например, «создать 100 случайных кубов»).
  • Промпт: Вы формулируете запрос для Antigravity. Важно быть точным в терминологии.
  • Генерация: Antigravity выдает код на Python.
  • Валидация: Вы читаете код (да, читать его все равно придется!) и проверяете логику.
  • Тест: Запускаете код в Blender.
  • !Цикл разработки аддона с использованием ИИ-ассистента.

    Практика: Ваш первый скрипт с Antigravity

    Давайте попробуем создать простейший скрипт. Допустим, мы хотим создать сетку из обезьянок (Сюзанн).

    Промпт для Antigravity: > Напиши скрипт для Blender, используя модуль bpy. Скрипт должен создать сетку 3x3 из объектов 'Monkey' (Suzanne). Расстояние между объектами должно быть 3 единицы. Очисти сцену перед созданием.

    Ответ Antigravity (пример кода):

    Разбор кода

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

  • import bpy: Мы подключаем библиотеку Blender. Без этого ничего работать не будет.
  • bpy.ops.object.select_all(action='SELECT'): Это оператор. Мы говорим Blender: «Выдели всё».
  • bpy.ops.mesh.primitive_monkey_add(...): Это команда создания объекта. Мы передаем ей параметр location, который рассчитываем математически.
  • Здесь используется простая формула координат:

    Где — итоговая позиция объекта (координаты X, Y, Z), и — текущие индексы в цикле (номер строки и столбца), а — шаг сетки (spacing, расстояние между объектами). Мы умножаем индекс на шаг, чтобы получить смещение.

    Запуск скрипта

  • Откройте Blender.
  • Перейдите на вкладку Scripting.
  • Нажмите New, чтобы создать новый текстовый файл.
  • Скопируйте код, сгенерированный выше, и вставьте его в редактор.
  • Нажмите кнопку Run Script (треугольник «Play») или сочетание клавиш Alt + P.
  • Если вы все сделали правильно, старый куб исчезнет, и появится армия из 9 Сюзанн.

    Заключение

    Сегодня мы сделали первый шаг. Вы узнали, что Blender управляется через bpy, настроили консоль для отлова ошибок и поняли роль Antigravity как вашего второго пилота.

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

    2. Основы промпт-инжиниринга: как правильно формулировать задачи для генерации кода

    Основы промпт-инжиниринга: как правильно формулировать задачи для генерации кода

    Приветствую вас на второй лекции курса. В прошлый раз мы подготовили почву: настроили Blender, включили консоль и познакомились с модулем bpy. Теперь у нас есть инструменты, но нам нужен навык управления ими через нашего ИИ-ассистента — Antigravity.

    Многие новички считают, что нейросеть — это волшебная палочка: взмахнул (написал «сделай красиво»), и чудо свершилось. В программировании это не так. Нейросеть — это джинн-буквалист. Если вы попросите его «построить дом», он может создать куб с дверью, небоскреб или собачью будку. И технически он будет прав.

    Сегодня мы научимся искусству промпт-инжиниринга — умению составлять такие запросы (промпты), которые дают предсказуемый, рабочий и чистый код для Blender.

    Принцип GIGO: Мусор на входе — мусор на выходе

    В информатике существует принцип GIGO (Garbage In, Garbage Out). Если вы подаете на вход системы нечеткие данные, на выходе вы получите нерабочий результат. В контексте работы с Antigravity это означает, что качество сгенерированного аддона на 90% зависит от качества вашего технического задания.

    !Иллюстрация принципа GIGO: разница между абстрактным запросом и четким техническим заданием.

    Почему нейросеть ошибается?

    Antigravity обучена на миллионах строк кода. Она знает, как создать куб, как удалить вершину и как настроить рендер. Но она не умеет читать ваши мысли. Основные причины ошибок:

  • Отсутствие контекста. (Для какой версии Blender пишем? Это скрипт или полноценный аддон?)
  • Неточная терминология. (Назвать «грань» «стороной», а «вершину» «точкой»).
  • Слишком сложные задачи в одном запросе. (Попытка создать целую игру одной командой).
  • Анатомия идеального промпта

    Чтобы Antigravity выдала рабочий код на Python, ваш запрос должен содержать четыре ключевых элемента. Давайте назовем эту структуру R.C.T.F. (Role, Context, Task, Format).

    1. Роль (Role)

    Задайте нейросети модель поведения. Это сужает пространство поиска решений.

    > Ты — опытный разработчик аддонов для Blender 4.0 на Python. Ты специализируешься на процедурной генерации геометрии.

    2. Контекст (Context)

    Опишите, что у нас уже есть и с чем мы работаем. Если вы пишете скрипт, который должен работать с выделенными объектами, скажите об этом прямо.

    > Скрипт должен работать в Object Mode. Пользователь предварительно выделил несколько меш-объектов.

    3. Задача (Task)

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

    * Плохо: «Сделай объекты случайными». * Хорошо: «Для каждого выделенного объекта примени случайное смещение по оси Z в диапазоне от 0.5 до 2.0 единиц».

    4. Формат (Format)

    Укажите, в каком виде вы хотите получить ответ. Нужны ли комментарии? Нужен ли полный код или только функция?

    > Напиши полный код скрипта с комментариями на русском языке. Не используй внешние библиотеки, только стандартный bpy.

    Математика точности: почему важны числа

    В 3D-графике всё строится на математике. Когда вы формулируете задачу, старайтесь мыслить формулами, даже если не пишете их явно. Нейросеть отлично понимает математические зависимости.

    Допустим, мы хотим создать лестницу. Если сказать «сделай лестницу», результат будет непредсказуемым. Но если мы опишем алгоритм, результат будет идеальным.

    Рассмотрим пример расчета высоты ступени. Пусть — общая высота лестницы, а — количество ступеней. Тогда высота одной ступени вычисляется как:

    где — высота одной ступени (подступенок), — общая высота подъема, — количество ступеней.

    Промпт с учетом математики: > Создай винтовую лестницу. Общая высота метров, количество ступеней . Рассчитай высоту каждой ступени как . Каждая ступень должна быть повернута относительно предыдущей на 15 градусов по оси Z.

    Такой запрос не оставляет нейросети шансов на ошибку.

    Словарь разработчика: говорим на языке Blender

    Antigravity «думает» терминами API Blender. Чем ближе ваш язык к документации, тем лучше код. Запомните таблицу перевода с «человеческого» на «блендеровский»:

    | Человеческий язык | Язык Blender (и промпта) | Python API | | :--- | :--- | :--- | | Точка | Вершина (Vertex) | verts | | Линия | Ребро (Edge) | edges | | Сторона / Поверхность | Полигон / Грань (Face) | polygons | | Группа объектов | Коллекция (Collection) | bpy.data.collections | | Картинка на объекте | Текстура / Материал | bpy.data.materials | | Анимация движения | Ключевой кадр (Keyframe) | keyframe_insert |

    Пример: Вместо «Покрась точки в красный», напишите: «Создай новый материал красного цвета и назначь его активному объекту».

    Итеративный подход: диалог с кодом

    Редко когда сложный скрипт получается с первого раза. Это нормально. Процесс разработки с ИИ — это диалог.

    Шаг 1: Декомпозиция

    Не просите написать весь аддон целиком. Разбейте задачу на подзадачи. Это похоже на принцип «разделяй и властвуй».

    Предположим, мы делаем аддон для генерации города. Не пишите: «Сделай город». Разбейте это на шаги:

  • Напиши функцию для создания одного здания с заданными шириной, глубиной и высотой.
  • Напиши функцию, которая расставляет эти здания по сетке.
  • Добавь случайности в высоту зданий.
  • Шаг 2: Обработка ошибок

    Вы запустили код, и в консоли (которую мы открыли в прошлой статье) появилась красная надпись. Что делать?

  • Скопируйте текст ошибки из консоли.
  • Вставьте его в чат с Antigravity.
  • Добавьте контекст: «Я получил эту ошибку при запуске скрипта. Исправь код».
  • Нейросеть отлично умеет «лечить» свой собственный код, если вы покажете ей, где именно «болит».

    Практический пример: Генератор случайного леса

    Давайте сравним два промпта для одной задачи.

    Плохой промпт: > Напиши код для блендера чтобы сделать лес. Много деревьев, разные размеры.

    Результат (вероятный): Код может создать просто кучу цилиндров, или использовать сложные системы частиц, которые нам не нужны, или вообще не сработать.

    Хороший промпт (инженерный): > Напиши скрипт на Python для Blender 3.0+. > Задача: Создать 50 копий объекта с именем 'Tree_Prototype' (предполагается, что он уже есть в сцене). > Логика: > 1. Разместить копии в случайных координатах X и Y в диапазоне от -50 до 50. > 2. Координата Z всегда равна 0. > 3. Применить случайный масштаб (scale) для каждого дерева от 0.8 до 1.5 (пропорционально по всем осям). > 4. Применить случайный поворот по оси Z (от 0 до 360 градусов). > 5. Все новые деревья поместить в новую коллекцию 'Forest'. > Важно: Используй bpy.data.objects.new и link для копирования, чтобы сэкономить память (instancing).

    Этот промпт содержит четкие инструкции по математике распределения. Например, диапазон координат определяется неравенством:

    где и — координаты расположения объекта на плоскости. Указание этих границ гарантирует, что лес не «улетит» в бесконечность.

    Заключение

    Промпт-инжиниринг — это не просто умение писать текст. Это умение переводить ваши творческие идеи на язык технической документации.

    Главные правила, которые мы усвоили:

  • Будьте конкретны. Используйте числа и точные названия.
  • Используйте терминологию Blender. Вершины, а не точки.
  • Разбивайте задачи. Слона едят по частям.
  • Читайте ошибки. Консоль — ваш лучший друг при отладке.
  • В следующей статье мы перейдем от теории к практике и напишем наш первый полноценный оператор — кнопку в интерфейсе Blender, которая будет выполнять написанный нами код.

    3. Создание базовой структуры аддона и регистрация первых операторов

    Создание базовой структуры аддона и регистрация первых операторов

    Добро пожаловать на третью статью курса. Мы уже научились общаться с Blender на языке Python и освоили искусство промпт-инжиниринга с Antigravity. До этого момента мы писали скрипты, которые запускались один раз и исчезали после закрытия программы. Но что, если мы хотим создать инструмент, который станет частью интерфейса Blender, будет иметь свои кнопки, горячие клавиши и настройки?

    Сегодня мы переходим на следующий уровень: мы превратим разрозненные скрипты в полноценный аддон.

    Чем аддон отличается от скрипта?

    Скрипт — это черновик. Аддон — это продукт.

  • Постоянство: Аддон устанавливается в Blender и загружается автоматически при каждом запуске.
  • Структура: Аддон требует строгого оформления кода, чтобы Blender мог его распознать.
  • Интеграция: Аддоны регистрируют свои операции в системе, добавляют меню и панели.
  • !Структурная схема базового аддона: метаданные, логика операторов и функции регистрации.

    Паспорт аддона: словарь bl_info

    Чтобы Blender понял, что ваш файл .py — это аддон, в самом начале кода должен находиться специальный словарь bl_info. Это «паспорт» вашего расширения.

    Вот как он выглядит:

    Если вы не добавите этот блок, Blender выдаст ошибку при попытке установки. Antigravity знает об этом требовании, но всегда полезно проверять, правильно ли нейросеть указала версию Blender.

    Сердце аддона: Операторы

    В первой статье мы говорили про bpy.ops. Теперь мы научимся создавать свои собственные ops. В терминологии Blender любое действие (нажатие кнопки) — это Оператор.

    Чтобы создать свой оператор, нужно объявить класс, наследуемый от bpy.types.Operator. У этого класса есть обязательные атрибуты и методы.

    Анатомия оператора

  • bl_idname: Уникальный идентификатор. Пишется в формате категория.имя (строчными буквами), например object.move_up.
  • bl_label: Текст, который пользователь увидит на кнопке или в поиске (F3).
  • execute(self, context): Метод, который запускается при вызове оператора. Именно здесь живет ваш код.
  • Возвращаемые значения

    Метод execute обязан вернуть статус выполнения. Это сигнал для Blender: * {'FINISHED'} — всё прошло успешно. * {'CANCELLED'} — действие отменено (например, пользователь нажал Esc или условия не соблюдены).

    Генерация структуры с Antigravity

    Вместо того чтобы писать этот шаблон (boilerplate) вручную, мы поручим это Antigravity. Вспомним наш принцип R.C.T.F. из прошлой лекции.

    Промпт для Antigravity: > Роль: Ты Python-разработчик аддонов для Blender. > Задача: Создай структуру простого аддона. Аддон должен содержать один оператор с идентификатором object.simple_scale. > Логика оператора: Увеличить масштаб активного объекта в 2 раза по всем осям. > Требования: > 1. Включи корректный словарь bl_info. > 2. Реализуй класс оператора. > 3. Реализуй функции register и unregister. > 4. Добавь код для запуска скрипта напрямую из редактора (if __name__ == "__main__").

    Результат генерации (пример кода):

    Математика трансформаций

    Давайте на секунду остановимся на строке obj.scale *= 2. Хотя это выглядит просто, за этим стоит линейная алгебра. В 3D-пространстве масштабирование — это умножение вектора масштаба объекта на скаляр (число).

    Если — это исходный вектор масштаба , а — коэффициент масштабирования, то новый масштаб вычисляется так:

    Где: * — итоговый вектор масштаба объекта. * — текущий вектор масштаба объекта перед операцией. * — коэффициент увеличения (в нашем коде он равен 2).

    Это означает, что каждая компонента вектора умножается на :

    Где: * — компоненты вектора масштаба по соответствующим осям. * Матричная запись показывает, что операция применяется равномерно ко всем осям.

    Понимание этого важно, когда вы захотите сделать неравномерное масштабирование (например, только по оси Z).

    Регистрация и выгрузка

    Чтобы Blender узнал о нашем классе, мы используем функции register() и unregister().

    * bpy.utils.register_class(...) — добавляет класс во внутренние реестры Blender. * bpy.utils.unregister_class(...) — удаляет его. Это важно для чистоты памяти, когда вы отключаете аддон.

    Обратите внимание на блок if __name__ == "__main__":. Он позволяет протестировать код, просто нажав Run Script в текстовом редакторе, не устанавливая аддон как файл. Это очень удобно на этапе разработки.

    Установка вашего первого аддона

    Теперь, когда код готов, давайте сделаем его «настоящим» аддоном.

  • Сохраните код в файл с расширением .py, например simple_scale.py.
  • Откройте Blender.
  • Зайдите в Edit -> Preferences -> Add-ons.
  • Нажмите кнопку Install... вверху справа.
  • Выберите ваш файл simple_scale.py.
  • Найдите его в списке (по названию из bl_info) и поставьте галочку, чтобы активировать.
  • Теперь закройте окно настроек, выделите куб, нажмите F3 и введите "Simple Scale". Если вы нажмете Enter, куб увеличится. Поздравляю, вы разработчик аддонов!

    Заключение

    Мы создали каркас. У нас есть метаданные, оператор и регистрация. Но пока наш аддон «немой» — его нужно искать через поиск. В следующей статье мы научимся создавать пользовательский интерфейс (UI): добавим свои панели в N-панель (Sidebar) и кнопки в заголовки 3D-окна, чтобы наши инструменты всегда были под рукой.

    4. Разработка пользовательского интерфейса и сложной логики с помощью нейросети

    Разработка пользовательского интерфейса и сложной логики с помощью нейросети

    Мы прошли путь от простых скриптов в консоли до регистрации собственного оператора. Но давайте будем честны: вызывать команды через поиск (F3) — это неудобно. Настоящий аддон должен иметь лицо — пользовательский интерфейс (UI). Кнопки, ползунки, галочки и выпадающие списки — вот что делает инструмент дружелюбным.

    В этой статье мы научимся создавать панели в интерфейсе Blender, добавлять настройки (свойства) и связывать их с нашей логикой, используя Antigravity.

    Анатомия интерфейса Blender

    В Blender интерфейс не нарисован картинками, он описан кодом. Любая панель, которую вы видите (например, настройки рендера или свойства объекта), — это класс Python, наследуемый от bpy.types.Panel.

    !Как код превращается в панель: метод draw определяет содержимое.

    Чтобы создать панель, нам нужно определить три главные вещи:

  • Где рисовать? (В каком окне: 3D View, Properties, Shader Editor?)
  • Как назвать? (Заголовок панели).
  • Что рисовать? (Кнопки, текст, свойства).
  • Свойства: Как дать пользователю выбор

    До сих пор наши скрипты использовали жестко заданные значения (например, scale *= 2). Но что, если пользователь хочет увеличить объект в 3 раза? Или в 1.5? Для этого существуют Свойства (Properties).

    В модуле bpy.props живут специальные типы данных, которые Blender умеет отображать в интерфейсе:

    * IntProperty — целые числа (количество копий). * FloatProperty — дробные числа (размер, смещение). * BoolProperty — галочки (True/False). * StringProperty — текст (имя объекта). * EnumProperty — выпадающие списки.

    Практика: Генератор города

    Давайте поставим перед Antigravity амбициозную задачу. Мы создадим аддон "City Builder". Он будет генерировать массив зданий (кубов) с разной высотой.

    Нам понадобятся:

  • Панель в боковом меню (N-panel) 3D-окна.
  • Настройки: количество зданий по X и Y, разброс высоты.
  • Кнопка "Построить город".
  • Шаг 1: Формируем промпт (R.C.T.F.)

    Вспомним нашу формулу промпта из второй статьи. Нам нужно четко связать свойства сцены с оператором.

    Промпт для Antigravity: > Роль: Ты Python-разработчик для Blender. > Задача: Создай аддон "City Builder". > Компоненты: > 1. Свойства: Создай группу свойств (PropertyGroup), привязанную к сцене (bpy.types.Scene). В ней должны быть: > - building_count_x (Int, min=1, default=5) > - building_count_y (Int, min=1, default=5) > - max_height (Float, min=0.1, default=2.0) > - gap (Float, расстояние между зданиями, default=1.5) > 2. Оператор: При нажатии создает сетку из кубов. Высота каждого куба случайная (от 0.5 до max_height). Используй random. > 3. Панель: Размести её в 3D View > Sidebar (N-panel) > вкладка "City Gen". Добавь туда все свойства и кнопку вызова оператора. > 4. Регистрация: Корректно зарегистрируй классы и свойства.

    Шаг 2: Анализ сгенерированного кода

    Antigravity выдаст довольно объемный код. Давайте разберем ключевые блоки, отвечающие за UI.

    #### Класс Панели

    Обратите внимание на метод draw. Мы не говорим "нарисуй пиксель здесь". Мы говорим layout.prop(...), и Blender сам решает, как выглядит слайдер, где он стоит и как реагирует на мышь. Это называется декларативный интерфейс.

    Шаг 3: Логика генерации (Математика)

    Внутри оператора (execute) будет цикл, расставляющий здания. Чтобы расставить объекты сеткой, мы используем координаты.

    Пусть — номер ряда, а — номер колонки. Пусть — это расстояние между центрами зданий (gap). Тогда координаты центра здания вычисляются так:

    Где: * — координаты объекта в плоскости основания. * — индексы цикла (от 0 до количества зданий минус 1). * — шаг сетки (расстояние).

    Однако, когда мы меняем высоту куба в Blender, он масштабируется от своего центра. Если просто увеличить высоту, куб "провалится" под пол наполовину. Нам нужно поднять его.

    Если высота куба равна , то его центр по оси Z должен быть:

    Где: * — координата центра объекта по вертикали. * — полная высота объекта.

    Antigravity обычно учитывает это, если в промпте указать "основание должно быть на уровне Z=0", но часто это приходится править вручную.

    Связывание данных: PropertyGroup

    Чтобы настройки не терялись, мы создаем отдельный класс для хранения данных. Это хорошая архитектура.

    А при регистрации мы "пришиваем" этот класс к сцене:

    Теперь bpy.context.scene.city_props доступен из любой точки Blender — и из панели, и из оператора.

    Усложнение логики: Случайность и Материалы

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

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

    Здесь мы сталкиваемся с оптимизацией. Создавать 100 материалов для 100 кубов — плохо. Лучше создать один материал и менять цвет объекта (object.color), но это требует настройки рендера.

    Простейший алгоритм для случайной высоты, который напишет нейросеть:

    Где: * — итоговая высота здания. * — минимальная высота (константа или настройка). * — функция, возвращающая число от 0.0 до 1.0. * — максимальная высота, заданная пользователем.

    Отладка UI

    Частая ошибка при создании UI — скрипт запускается, ошибок нет, но панели не видно.

    Чек-лист проверки:

  • Context: Правильно ли указан bl_space_type? Если вы указали 'VIEW_3D', панель будет в 3D окне. Если 'PROPERTIES', то в окне свойств.
  • Region: Для N-панели это 'UI'. Многие путают с 'TOOLS' (левая панель T).
  • Регистрация: Не забыли ли вы зарегистрировать сам класс панели в register()?
  • Заключение

    Сегодня мы превратили "черный ящик" кода в удобный инструмент с кнопками и ползунками. Мы научились:

  • Создавать классы Panel.
  • Использовать PropertyGroup для хранения настроек.
  • Связывать интерфейс с математической логикой оператора.
  • Теперь ваш аддон выглядит профессионально. В следующей статье мы займемся работой с геометрией на низком уровне: будем двигать вершины и создавать полигоны вручную, минуя стандартные операторы, что даст нам невероятную скорость работы скриптов.

    5. Отладка кода, исправление ошибок через Antigravity и финальная сборка

    Отладка кода, исправление ошибок через Antigravity и финальная сборка

    Поздравляю! Вы прошли долгий путь от первых экспериментов в консоли до создания собственного интерфейса. У вас есть код, есть кнопки, и, возможно, даже что-то работает. Но в программировании есть неизбежный этап, который занимает порой больше времени, чем само написание кода. Это отладка (debugging).

    В этой, финальной статье курса, мы научимся не бояться красных ошибок в консоли, использовать Antigravity как «лечащего врача» для вашего кода и правильно упаковывать ваш аддон, чтобы им можно было поделиться с миром.

    Психология ошибки: Почему код ломается?

    Новички часто впадают в панику, видя сообщение об ошибке. Профессионалы видят в этом подсказку. Ошибка — это способ Blender сказать вам: «Я не понял, что делать вот в этой конкретной строчке».

    Существует три основных типа ошибок, с которыми вы столкнетесь:

  • Синтаксические ошибки (Syntax Errors): Вы забыли двоеточие, скобку или сделали опечатку в слове import. Python даже не начнет выполнять скрипт.
  • Ошибки времени выполнения (Runtime Errors): Скрипт запустился, но в процессе что-то пошло не так (например, вы пытаетесь покрасить объект, которого не существует).
  • Логические ошибки: Скрипт работает, ошибок нет, но результат неверный (здания строятся под землей или накладываются друг на друга).
  • !Цикл исправления ошибок с использованием нейросети.

    Системная консоль — ваш черный ящик

    Мы уже упоминали системную консоль в первой лекции, но сейчас она станет вашим главным инструментом. Когда вы нажимаете кнопку своего аддона и ничего не происходит (или Blender вылетает), ответ всегда находится в черном окне консоли.

    То, что вы ищете, называется Traceback (след ошибки). Это текст, который показывает последовательность действий, приведших к сбою.

    Пример типичного Traceback:

    Этот текст говорит нам:

  • Ошибка случилась в файле my_addon.py на строке 45.
  • Тип ошибки: AttributeError.
  • Суть: Мы пытаемся обратиться к location у чего-то, что равно None (пустоте).
  • Алгоритм лечения кода с Antigravity

    Вместо того чтобы гуглить ошибку, мы используем нашу нейросеть. Antigravity отлично понимает Traceback.

    Шаг 1: Локализация

    Найдите ошибку в консоли. Скопируйте не только последнюю строку, но и 3-4 строки перед ней, чтобы ИИ понял контекст.

    Шаг 2: Формирование запроса

    Не пишите просто «не работает». Используйте следующий шаблон промпта:

    > Контекст: Я пишу аддон для Blender 4.0. > Код: (Вставьте проблемный участок кода или весь класс оператора). > Ошибка: (Вставьте текст из консоли). > Задача: Объясни, почему возникла ошибка, и исправь код. Добавь проверку, чтобы ошибка не повторялась.

    Шаг 3: Анализ решения

    Antigravity, скорее всего, предложит добавить проверку if obj is not None:. Это называется «защитное программирование». Мы заранее предполагаем, что данных может не быть, и обрабатываем этот случай.

    Исправление логических ошибок (Математика)

    Самые коварные ошибки — логические. Blender не выдает красного текста, но ваш город летает в небе. Здесь Antigravity нужен не как корректор, а как математик.

    Допустим, вы хотите поставить объект на поверхность, но он проваливается центром в пол. Это происходит потому, что location объекта — это его центр масс (обычно геометрический центр).

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

    Формула коррекции позиции:

    Где: * — новая координата центра объекта по вертикали. * — желаемый уровень основания (например, 0). * — полная высота объекта (размер по оси Z).

    Если ваш аддон ставит объекты неправильно, опишите проблему Antigravity языком геометрии:

    > Проблема: Кубы создаются с центром в точке (0,0,0), поэтому нижняя половина находится под землей. > Задача: Измени формулу расчета координаты Z так, чтобы нижняя грань куба лежала на плоскости Z=0. Учти, что высота куба хранится в переменной cube_height.

    Метод Poll: Защита от дурака

    Частая проблема — пользователь нажимает кнопку в неподходящий момент. Например, пытается применить оператор «Сделать фаску», когда не выделен ни один объект.

    В классе оператора есть специальный метод @classmethod poll. Он запускается Blender'ом постоянно, когда курсор мыши проходит над кнопкой. Если метод возвращает False, кнопка становится серой (неактивной).

    Попросите Antigravity добавить этот метод:

    > Добавь в оператор метод poll. Кнопка должна быть активна только тогда, когда пользователь находится в 3D-окне, выделен хотя бы один объект, и этот объект является мешем (Mesh).

    Пример кода, который сгенерирует нейросеть:

    Рефакторинг и чистка кода

    Перед финальной сборкой код нужно причесать. В процессе экспериментов у вас наверняка скопились лишние import, закомментированные куски и переменные с названиями a, b, temp.

    Скормите весь ваш итоговый код Antigravity с промптом:

    > Задача: Проведи рефакторинг этого кода. > 1. Убери неиспользуемые библиотеки. > 2. Переименуй переменные согласно стандарту PEP8 (понятные имена). > 3. Добавь docstrings (описания) к классам и функциям. > 4. Не меняй логику работы.

    Чистый код легче поддерживать в будущем, когда вы решите выпустить версию 2.0.

    Финальная сборка: Упаковка аддона

    Ваш аддон готов. Как передать его другу или продать на Gumroad?

    Вариант 1: Однофайловый аддон

    Если весь ваш код помещается в один файл .py, вы просто передаете этот файл. Это то, что мы делали на протяжении курса.

    Вариант 2: Пакет (Многофайловый аддон)

    Если ваш проект разросся (отдельный файл для UI, отдельный для логики генерации, отдельный для материалов), вам нужно создать структуру пакета.

  • Создайте папку с именем аддона, например antigravity_city_builder.
  • Внутри создайте файл __init__.py. Это главный файл, который Blender будет читать первым.
  • Перенесите словарь bl_info и функции регистрации в __init__.py.
  • Остальные файлы положите рядом и импортируйте их в __init__.py.
  • Промпт для помощи: > У меня есть три файла: ui.py, generator.py и materials.py. Напиши содержимое файла __init__.py, чтобы правильно импортировать эти модули и зарегистрировать все классы из них. Не забудь про bl_info.

    Версионирование

    Перед упаковкой обязательно обновите версию в bl_info.

    Это кортеж из трех чисел: (Major, Minor, Patch). * Major: Глобальные изменения, ломающие совместимость. * Minor: Новые функции. * Patch: Исправление ошибок.

    Создание ZIP-архива

    Blender устанавливает аддоны из ZIP-архивов.

  • Если у вас один файл: просто заархивируйте my_addon.py в my_addon.zip (хотя Blender умеет ставить и просто .py).
  • Если у вас папка: заархивируйте саму папку.
  • Важно: Внутри архива должна быть папка antigravity_city_builder, а в ней — __init__.py. Если __init__.py лежит сразу в корне архива, это может вызвать конфликты имен.

    Заключение курса

    Мы прошли путь от пустой сцены до собственного программного продукта. Вы узнали: * Как устроен Blender API (bpy). * Как формулировать задачи для нейросети (Промпт-инжиниринг). * Как создавать операторы и интерфейсы. * Как находить и исправлять ошибки.

    Нейросеть Antigravity — это мощный ускоритель. Она снимает барьер «чистого листа» и берет на себя рутину написания шаблонного кода. Однако пилотом остаетесь вы. Именно ваше понимание логики, математики и структуры определяет, будет ли аддон полезным инструментом или набором случайных команд.

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

    Удачи в разработке!