Blender 3D в качестве интерактивного учебника (простой скрипт)

—

от автора

Все мы изучаем что‑то, чтобы применять полученные знания на практике — от школьников до студентов и далее до профильных специалистов. Передо мной однажды встала задача изучения матчасти судна. Любому понятно, что сопоставление изображений и текста в книгах — та ещё задача, а видеоматериал нагляден, но не интерактивен (нельзя изучать в собственных последовательностях, темпах и ракурсах). Проблем с изучением не было особых, но облегчить процесс достижения цели — вполне разумное решение при любой задаче, и я решил использовать Blender 3D как базу знаний, так как знал, что обновления функционала работы с коллекциями в Blender 3D происходили вполне кординальные (в частности любой объект можно вкладывать в несколько коллекций одновременно, что позволяет организовывать достаточно сложные иерархии связей). Год назад была моя публикация по скрипту на портале 3D печати, а недавно я показал её попутчику, с которым мы разговорились в поезде и он спросил — «Можно это использовать для изучения астрономии или биологии?», «Да» — ответил я, и вот он и предложил сделать более массовую публикацию на другом портале. Поэтому выкладываю тут.

Так как Python я не знаю, но с алгоритмизацией уж точно знаком не по наслышке, да и с программированием, то я полностью делегировал работу с кодом ИИ, сам отлавливал только ошибки, но это чисто логическая часть. Даже если не знать конкретный язык программирования, то ошибку всё равно можно вычислить опытно — экспериментальным путём. Код конечно тоже приходилось просматривать и определять где могла бы быть ошибка, так как некоторые ошибки требовали слишком больших отрезков времени их выявлений через пробы и изменения, потому что ИИ я использовал бесплатный и с логикой у него не всё было хорошо (зато документацию он находит и читает очень быстро). Разумеется я не знал не только Python, но и Blender 3D API.

Мы долго много обсуждали с ИИ как это лучше сделать, он предлагал варианты — я выбирал. Несмотря на простоту скрипта работа длилась несколько вечеров — нужно было выбрать самые эффективные инструменты Blender 3D и опробовать их работе, то же самое и с алгоритмами, по скорости я их не тестил — просто старался руководствоваться здравым смыслом при сравнении их описаний.

В результате получился такой инструмент

Интерфейс самого скрипта минималистичен — он работает из вкладки «Text» панели Sidebar (Боковая панель, N‑панель вызываемая клавишей N, каждый называет по разному) и имеет всего две кнопки. Одну вверху, для работы с выделениями, которая работает как с объектами выделенными на сцене, так и в аутлайнере. После выбора объекта или коллекции скрипт определяет наличие текстового блока описания выделенного объекта или коллекции. Если у выделения нет текстового блока, то верхняя кнопка вкладки «Text» будет отвечать за его создание, а если таковой есть — то за удаление. Нижняя кнопка отвечает за удаление ненужных текстовых блоков, которые образуются при переименовывании (я не стал добавлять зеркального переименовывания текстов и объектов с коллециями из риска потерять быстродействие, но код открыт и внизу будет ссылка, кому надо может доработать сам).

Скрипт, в отличии от аддона, для работы всегда требует запуска. Нужно скопировать текст скрипта, создать текст нажатием кнопки «+». Текстовый блок самого скрипта необходимо именовать в AScript, так как кнопка удаления лишних текстов удалит из файла и сам скрипт в противном случае, потому что работает от парсера сравнивающего названия текстов с объектами и коллекциями. Если ваши объекты на сцене или коллекции имеют названия такие, что для запуска скрипт придётся отыскивать среди текстовых блоков, то можно исправить строку 130 ( код в репозитории по ссылке ниже)

            if text.name == "AScript":

где указано название скрипта «AScript» на своё название, которое будет всегда поверх имён других текстов в списке текстовых блоков.

Можно было сделать обвес и вообще плагин, но плагин мог иметь проблемы от версии к версии самого Blender 3D, и я решил, что кому надо улучшит и доработает как ему надо, минимум вполне функционален, хоть и требует некоторых мер предосторожности в работе.

Чтобы работать с скриптом, для удобства желательно слева от рабочего пространства 3d вьювера, держать рабочее пространство работы с текстами (скриптинг). Сам интерфейс скрипта располагается в инструментах 3D окна, для работы с ним нужно нажать N открывающую боковую панель инструментов и выбрать вкладку «Text». Для удобства я разделяю рабочую область 3D редактирования на две, и потом в левой выбираю текстовый редактор, чтобы интерфейс скрипта был рядом с аутлайнером, но можно наверное тексты и внизу, или как‑то ещё, но мне видится оптимальным вариантом именно такой:

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

Контент

Процесс создания текстового контента достаточно прост — выделяем объект на сцене или в аутлайнере, либо коллекцию в аутлайнере, нажимает кнопку создания текстового блока (верхняя), и печатаем руками или копипастим — сохранение изменений в тексте происходит автоматически функционалом Blender 3D. Если для выделенного объекта уже существует текстовый блок, то эта же кнопка будет отвечать за его удаление. Для чистки текстового контента используется вторая — нижняя кнопка, тогда скрипт просто будет искать текстовые блоки не соответствующие названиям объектов или коллекций и при обнаружении удалит их.

Иерархия

В Blender 3D реализована возможность множественных коллекций, позволяющая добавлять в них один и тот же объект. Чтобы добавить объект в другие коллекции нужно выделить его, нажать Shift+M, и в выпадающем списке выбрать название коллекции. Тут всё просто, но благодаря этой возможности можно организовывать иерархии любых сложностей.

Небольшая анимация GIF (программа бесплатная, поэтому без курсора и визуализации нажатых клавиш и кнопок).

На этом у меня всё, потому что нет возможности углубляться в тонкости кода написанного ИИ под моим руководством, но Вы можете сами проанализировать его даже с помощью ИИ, и может что‑то улучшить или даже добавить. Код мной выложен тут https://github.com/Andrei‑Y/doc‑manager/blob/main/AScript и доступен для любого применения желающими, будь то применение, доработки или улучшения.

ссылка на оригинал статьи https://habr.com/ru/articles/1087700/