В этом уроке мы посмотрим, как использовать Python-функцию экспорта UV Layout в Blender для экспорта UV-карт, или макетов, всех объектов типа MESH, доступных в сцене.
Видеоверсия этого руководства в настоящее время недоступна на этом языке. Видео на английском языке доступно по этой ссылке:
Текстовая расшифровка видео
Привет. В этом уроке мы посмотрим, как использовать Python-функцию экспорта UV Layout в Blender для экспорта UV-карт, или макетов, всех объектов типа MESH, доступных в сцене.
Этот скрипт может быть полезен, если вам нужно предоставить UV-карты в виде изображений, например при публикации вашей 3D-сцены на сайтах 3D-стоков.
Этот урок был создан с использованием Blender версии 3.3. Иногда разработчики Blender вносят изменения в Blender Python API, сокращенно BPY, но этот скрипт должен работать, начиная с версии 3 и выше.
Функция bpy.ops, которую мы будем использовать, довольно простая. Она требует всего два параметра, а именно путь к создаваемому изображению и размер UV в пикселях. Однако, поскольку нам нужно использовать ее для всех доступных объектов MESH в сцене, мы применим цикл for по объектам MESH.
Кроме того, я укажу расширение файла, которое по умолчанию является PNG.
На самом деле я буду экспортировать макеты в формате PNG, но хочу показать вам, как это указывать, потому что вы также можете экспортировать UV-макеты в файлы SVG или EPS.
Хорошо, давайте начнем.
Откройте файл BLEND.
Вы также можете начать с совершенно нового файла, но вам нужно будет сохранить его где-нибудь, потому что мы будем помещать PNG-файлы в ту же папку, что и проект.
Давайте сделаем несколько базовых импортов:
import bpy
from bpy import *
Как я говорил ранее, функция export_layout требует два параметра, поэтому давайте определим две переменные. Мы могли бы написать значения прямо в самой функции, но я предпочитаю определить их здесь для ясности:
UVpath = bpy.path.abspath("//") + "UV-LAYOUT---"
UVsize = (2048, 2048)
Как вы видите, "bpy.path.abspath" возвращает абсолютный путь на диске к файлу BLEND. Мы добавим префикс "UV-LAYOUT---" ко всем PNG-файлам, но вы можете изменить его или удалить.
Параметр UVsize представляет собой кортеж из двух числовых значений, которые являются размерами создаваемых изображений в пикселях.
Я указываю 2048, тем самым создавая изображение 2k.
Чтобы выполнить функцию для всех объектов MESH, доступных в сцене, нам нужно создать цикл for. Поэтому мы можем написать:
for o in bpy.data.objects:
Затем, внутри блока цикла for, не забывая про отступы, мы можем добавить фильтр по типу объекта:
if(o.type=="MESH"):
Условие очевидно. Тип текущего bpy.data.object должен быть MESH.
Следующие инструкции должны быть помещены внутрь if, поэтому снова не забывайте делать отступы.
bpy.ops.objects.select_all(action='DESELECT');
Нам нужно делать это каждый раз, чтобы снять выделение со всех остальных объектов, иначе мы получили бы изображение с двумя или более наложенными UV-картами.
bpy.context.view_layer.objects.active = o
Это присваивание установит активный объект сцены, назначив текущий меш в context.view_layer.objects.active.
Нам нужно сделать это, потому что следующая операция OPS, то есть операция Blender Python, будет выполняться только над одним единственным активным объектом. Помните, вы можете выделять несколько объектов, но активным в один момент времени может быть только один.
bpy.ops.uv.export_layout(filepath = UVpath + o.name, size = UVsize, mode='PNG')
Эта инструкция ops экспортирует макет активного объекта по указанному пути, который формируется из переменной UVpath с префиксом "UV-LAYOUT---" плюс имя активного объекта, и с заданным размером в пикселях.

Как я говорил ранее, вы можете экспортировать UV-макеты в форматах PNG, EPS или SVG. Вы можете указать формат вывода с помощью параметра mode, как я только что показал.
Если мы посмотрим на выходную папку, мы увидим, что скрипт создал столько изображений, сколько мешей присутствует в сцене.

Поскольку меши в моей 3D-модели "Desk set 3" используют один и тот же макет с неперекрывающимися UV-островами, я могу объединить все объекты вместе, снова запустить скрипт и получить всего одну UV-карту макета без перекрытий для всего ассета.

Перед тем как закончить этот урок, я дам вам задание. Отредактируйте этот скрипт так, чтобы он экспортировал как 2k, так и 4k UV-макеты мешей, доступных в ваших сценах, создавая изображения с двумя разными префиксами, например "UV-2K---" и "UV-4K---".
На этом все для этого урока.
До скорой встречи.