
Недавно автор решил попробовать что-то помоделить в Blender. На данный момент он ещё только начинает осваиваться в 3D, но имеет небольшой опыт в разработке ПО, преимущественно с использованием Git, потому хотел бы и тут избежать версионирования проектов в духе "projectN_final5_20260305_fix3.blend", который подразумевается при "инкрементальном" сохранении.
На первый взгляд ничего сложного тут быть не должно: в Blender работа ведётся с набором точек-координат-чисел и их связей, настроек модификаторов, ссылок на текстуры и референсы и т.п.; потому всё это должно иметь некоторую стандартизированную структуру, возможно упакованную в ZIP-архив. Файл проекта .blend же является таким ZIP-архивом, ведь так? Распакуем его и просто занесём в Git? Неправильно!
В данном случае придётся прибегнуть к помощи фреймворка OpenUSD. Но для начала хотелось бы рассказать о том, какие проблемы он был изначально призван решить и какими ограничениями обладает.

Очередной Универсальный формат
OpenUSD -- это фреймворк, созданный Pixar, выпущенный в open source в 2016 году и ставший де-факто стандартом для обмена данными 3D-графики. Сейчас его поддержка и развитие осуществляется Alliance for OpenUSD, который в 2023 году основали Pixar, Adobe, Apple, Autodesk и NVIDIA, в качестве дочерней организации Joint Development Foundation, аффилированной с Linux Foundation.
В данной статье автор намеренно не использует аббревиатуру "USD" (Universal Scene Description), как сокращённое название фреймворка OpenUSD или как общее название производимых им форматов файлов, с целью избежания двусмысленности.
Если читатель когда-либо пробовал себя в геймдеве, то наверняка знает, что разное ПО для манипулирования 3D-объектами может по-разному себя вести с ними. Например, в одном случае в трёхмерной системе координат вверх идёт ось Y, а в другом -- Z.

Это всего лишь одна из проблем, которую решает OpenUSD. Также, например, он обеспечивает перенос материалов и шейдеров с помощью полноценного API -- UsdShade. Имеется поддержка скриптов на Python, позволяющих генерировать модели с помощью кода, минуя взаимодействие с условными Blender или Unity в принципе. Поскольку данный фреймворк уже довольно широко распространён и имеет открытый формат производимых файлов, он потенциально может стать стандартом и в AI-slop индустрии.
OpenUSD поддерживает экспорт в три разных формата:
.usda -- plain-text формат (ASCII);
.usdc -- бинарник собственного формата OpenUSD (crate);
.usdz -- ZIP-архив.
(для первых двух типов ещё есть общее расширение .usd)
Причём тут Blender и Git
Вернёмся к первоначальной проблеме. По умолчанию Blender сохраняет проект в архиве zstd, но при распаковке мы получаем другой бинарник -- формата Blender3D. (Тип файла проверяется командой file.) Такой же тип файла мы получим, если укажем в настройках, чтобы сохраняемый проект не сжимался.
Поскольку Blender является свободным и открытым ПО, мы ожидаем, что файл проекта будет возможно прочитать вне этого ПО. Однако исторически сложилось так, что вне Blender просто так разархивировать и прочесть содержимое проекта не удастся (по крайней мере, не используя рандомные малоизвестные утилиты с GitHub). Git же хорошо работает именно с текстовыми файлами, потому даже несжатый бинарник нам не подойдёт.
OpenUSD поддерживается в Blender с версии 4.0, что даёт нам "из коробки" возможность экспорта проекта в текстовый формат с расширением ".usda" (которое пока что надо вручную указывать в имени файла проекта).

Решена ли изначальная проблема? Не совсем.
Поскольку от OpenUSD ожидается универсальность с точки зрения использования в разном 3D-софте, сейчас он устроен по принципу "наибольшего общего делителя" -- например, модификаторы из Blender экспортируются и импортируются как примененные и неотменяемые, а ссылки на референсы не сохраняются -- такие вещи при импорте в условный игровой движок попадать не должны.
Решение
Можно экспортировать проект в .usda с выбором только мешей и оставить базовый проект .blend с данными, которые постоянны на протяжении всего процесса моделирования. Соответственно фиксировать изменения нужно уже будет по файлу .usda вместо .blend. С учетом ограничений выше, размер файла должен получиться намного меньше даже сжатого проекта .blend (в случае автора вышло 19.7 КБ против 134.1 КБ). Пример такого файла приведен на скриншоте ниже.

Интерфейс командной строки Blender предоставляет возможность экспортировать проект одной командой для последующего использования в стороннем скрипте:
blender -b "tutorial.blend" --python-expr 'import bpy; bpy.ops.wm.usd_export(filepath="tutorial.usda", selected_objects_only=True)'
Конечно же, такой воркфлоу имеет свои ограничения и неудобства (поскольку читатель скорее всего не захочет вручную редактировать координаты точек мешей для разрешения конфликтов), однако автору достаточно линейного отслеживания прогресса, возможного отката назад и удобного описания изменений -- в сообщении коммита вместо имени файла.
А как устроен ваш творческий процесс?