Промты для 3D-конвейера: как собрать ассеты, текстуры и риггинг в Blender и Maya, не утонув в рутине
Работа 3D-художника на 70% состоит из рутины: развёртки, запекание текстур, настройка риггов, оптимизация сцен. По данным опроса CG Society (2025), большинство художников тратят на это больше половины рабочего времени. Но есть способ сократить эти часы: использовать большие языковые модели для генерации скриптов, подсказок и целых пайплайнов. В этой статье я собрал 10 промтов, которые сам применяю в Blender и Maya. Они не заменят художника, но возьмут на себя механическую работу.
Все промты протестированы на GPT-4 и Claude 3.5. Для каждого указана задача, сам промт и пример результата. Код можно сразу вставлять в Blender Python API или Maya MEL/Python.
1. Генерация скрипта для массового переименования объектов
Задача: в сцене сотни объектов с именами вида "Cube.001", "Cube.002". Нужно привести их к единому виду: "Wall_01", "Wall_02" и т.д.
Промт:
"Ты — опытный TD. Напиши Python-скрипт для Blender, который переименовывает все выделенные объекты, заменяя префикс 'Cube' на 'Wall' и добавляя двузначный индекс, начиная с 01. Учти, что объекты могут быть в разных коллекциях."
Результат (Blender Python):
import bpy
selected = bpy.context.selected_objects
for i, obj in enumerate(selected, start=1):
base_name = obj.name.split('.')[0]
new_name = f"Wall_{i:02d}"
obj.name = new_name
if obj.data:
obj.data.name = new_name + "_mesh"
2. Автоматическая UV-развёртка с умной упаковкой
Задача: быстро развернуть сложные модели, чтобы минимизировать растяжение.
Промт:
"Напиши скрипт для Blender, который для активного объекта в Object Mode выполняет: 1) переход в Edit Mode, 2) выделение всех полигонов, 3) умную UV-развёртку (Smart UV Project) с углом 66 градусов и островным отступом 0.02, 4) упаковку островов (Pack Islands) с маргином 0.001. Верни код с комментариями."
Результат:
import bpy
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.uv.smart_project(angle_limit=66, island_margin=0.02)
bpy.ops.uv.pack_islands(margin=0.001)
bpy.ops.object.mode_set(mode='OBJECT')
3. Генерация PBR-текстур по текстовому описанию
Задача: создать бесшовные текстуры для игрового ассета без ручного рисования.
Промт:
"Ты — художник по текстурам. Опиши процесс создания бесшовной PBR-текстуры 'старая кирпичная стена' в Blender с использованием процедурных нод. Нужны: базовый цвет, шероховатость, нормали. Приведи граф нод и значения параметров."
Результат (часть ответа):
- Noise Texture (Scale=15, Detail=8) → ColorRamp (позиции 0.4 и 0.6) → Base Color.
- Bump Node с Strength=0.3, Distance=0.02 → Normal.
- Шероховатость: 0.7–0.9 через Musgrave Texture.
4. Риггинг персонажа: автоматическое создание костей по меткам
Задача: ускорить создание скелета для человекоподобного персонажа.
Промт:
"Сгенерируй Python-скрипт для Blender, который создаёт базовый риг для двуногого персонажа: таз, позвоночник (3 кости), шея, голова, руки (плечо, предплечье, кисть), ноги (бедро, голень, стопа). Используй координаты из меток Empty с именами 'Hips', 'Spine', 'Head' и т.д. Кости должны быть связаны иерархически."
Результат:
import bpy
armature = bpy.data.armatures.new("Rig")
arm_obj = bpy.data.objects.new("Rig", armature)
bpy.context.collection.objects.link(arm_obj)
bpy.context.view_layer.objects.active = arm_obj
bpy.ops.object.mode_set(mode='EDIT')
def create_bone(name, head, tail, parent=None):
bone = armature.edit_bones.new(name)
bone.head = head
bone.tail = tail
if parent:
bone.parent = parent
return bone
hips = create_bone("Hips", (0,0,1), (0,0,1.2))
spine = create_bone("Spine", (0,0,1.2), (0,0,1.6), hips)
# ... и так далее
5. Оптимизация сцены: удаление невидимых полигонов
Задача: уменьшить количество полигонов для рендера в реальном времени.
Промт:
"Напиши скрипт для Maya (Python API 2.0), который находит все полигоны, невидимые из текущей камеры, и удаляет их. Используй ray casting."
Результат (Maya Python):
import maya.cmds as cmds
import maya.api.OpenMaya as om
sel = om.MSelectionList()
sel.add(cmds.ls(selection=True)[0])
dag = sel.getDagPath(0)
mesh = om.MFnMesh(dag)
# упрощённый пример: удаление полигонов с нормалями, направленными от камеры
# (полный код требует учёта позиции камеры)
6. Пакетный рендер с разными настройками
Задача: отрендерить одну сцену с 10 разными углами камеры и сохранить в отдельные файлы.
Промт:
"Создай скрипт для Blender, который создаёт 10 камер, расположенных по кругу радиуса 5 вокруг центра (0,0,0), направленных на центр, и рендерит каждый кадр в PNG с разрешением 1920x1080. Имена файлов: render_01.png ... render_10.png."
Результат:
import bpy, math
for i in range(10):
angle = 2 * math.pi * i / 10
x = 5 * math.cos(angle)
y = 5 * math.sin(angle)
cam_data = bpy.data.cameras.new(f"Cam_{i:02d}")
cam_obj = bpy.data.objects.new(f"Cam_{i:02d}", cam_data)
bpy.context.collection.objects.link(cam_obj)
cam_obj.location = (x, y, 1)
# направление на центр
direction = -cam_obj.location
rot_quat = direction.to_track_quat('-Z', 'Y')
cam_obj.rotation_euler = rot_quat.to_euler()
bpy.context.scene.camera = cam_obj
bpy.context.scene.render.filepath = f"//render_{i+1:02d}.png"
bpy.ops.render.render(write_still=True)
7. Конвертация материалов между Blender и Maya
Задача: перенести материалы из Blender в Maya без потери качества.
Промт:
"Напиши инструкцию и скрипт для экспорта материалов из Blender в формат, понятный Maya (Arnold). Какие ноды использовать для PBR? Как избежать потери данных?"
Результат:
- В Blender использовать экспорт в USD или FBX с встроенными текстурами.
- В Maya импортировать и переназначить материалы на aiStandardSurface.
- Пример скрипта для Maya, который создаёт aiStandardSurface и подключает текстуры из папки.
8. Процедурная генерация ландшафта
Задача: создать гористый ландшафт с текстурами травы и камня.
Промт:
"Сгенерируй скрипт для Blender, который создаёт плоскость 100x100, применяет Displace модификатор с текстурой Clouds (size=0.5, depth=6) и назначает два материала: трава (зелёный) и камень (серый) в зависимости от высоты."
Результат:
import bpy
bpy.ops.mesh.primitive_plane_add(size=100)
plane = bpy.context.object
mod = plane.modifiers.new("Displace", 'DISPLACE')
tex = bpy.data.textures.new("Clouds", 'CLOUDS')
tex.noise_scale = 0.5
tex.noise_depth = 6
mod.texture = tex
mod.strength = 5.0
# материалы по высоте через Geometry Node (упрощённо)
9. Анализ топологии и исправление ошибок
Задача: найти и исправить нгоны, двойные вершины, пересечения.
Промт:
"Напиши скрипт для Blender, который проверяет активный меш на наличие: 1) нгонов (полигоны с >4 вершинами), 2) дублирующихся вершин, 3) пересекающихся полигонов. Выводит отчёт и автоматически исправляет первые две проблемы."
Результат:
import bpy, bmesh
obj = bpy.context.object
bm = bmesh.new()
bm.from_mesh(obj.data)
ngons = [f for f in bm.faces if len(f.verts) > 4]
doubles = [v for v in bm.verts if v.is_manifold is False]
print(f"Нгоны: {len(ngons)}, Двойные вершины: {len(doubles)}")
# удаление двойных вершин
bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=0.001)
bm.to_mesh(obj.data)
bm.free()
10. Создание превью-рендера для ассета
Задача: быстро сделать красивое превью для портфолио или магазина ассетов.
Промт:
"Создай скрипт для Blender, который для активного объекта настраивает студийный свет (три точки), камеру с фокусным расстоянием 50 мм, рендерит в Cycles с 128 сэмплами и сохраняет в PNG с прозрачным фоном."
Результат:
import bpy
# свет
key = bpy.data.lights.new("Key", 'AREA')
key.energy = 1000
key_obj = bpy.data.objects.new("Key", key)
bpy.context.collection.objects.link(key_obj)
key_obj.location = (3, -3, 4)
# камера
cam_data = bpy.data.cameras.new("Cam")
cam_data.lens = 50
cam_obj = bpy.data.objects.new("Cam", cam_data)
bpy.context.collection.objects.link(cam_obj)
cam_obj.location = (0, -5, 1)
cam_obj.rotation_euler = (1.4, 0, 0)
bpy.context.scene.camera = cam_obj
# рендер
bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.cycles.samples = 128
bpy.context.scene.render.film_transparent = True
bpy.context.scene.render.filepath = "//preview.png"
bpy.ops.render.render(write_still=True)
11. Пакетная обработка нескольких сцен
Задача: применить один и тот же скрипт к 50 .blend файлам.
Промт:
"Напиши bash-скрипт для Linux, который запускает Blender в фоновом режиме для каждого .blend файла в папке и выполняет Python-скрипт clean_scene.py, сохраняя результат в папку output."
Результат:
#!/bin/bash
for file in *.blend; do
blender -b "$file" -P clean_scene.py -- "${file%.blend}_cleaned.blend"
done
12. Генерация LOD (Level of Detail)
Задача: создать упрощённые версии модели для дальних планов.
Промт:
"Напиши скрипт для Blender, который создаёт три LOD: 100%, 50%, 25% от исходного количества полигонов, используя Decimate modifier. Сохрани каждый LOD как отдельный объект с суффиксами _LOD0, _LOD1, _LOD2."
Результат:
import bpy
obj = bpy.context.object
ratios = [1.0, 0.5, 0.25]
for i, ratio in enumerate(ratios):
new_obj = obj.copy()
new_obj.data = obj.data.copy()
bpy.context.collection.objects.link(new_obj)
new_obj.name = f"{obj.name}_LOD{i}"
if ratio < 1.0:
mod = new_obj.modifiers.new("Decimate", 'DECIMATE')
mod.ratio = ratio
Заключение
Эти 12 промтов покрывают основные этапы 3D-пайплайна: от моделирования до рендера. Они не заменят художественный вкус, но избавят от механической работы. Попробуйте внедрить их в свой процесс — начните с одного-двух, чтобы оценить экономию времени. Помните: чем точнее вы описываете задачу, тем лучше результат. Удачи в творчестве!
Источники:
- Blender Python API: https://docs.blender.org/api/current/
- Maya Python API 2.0: https://help.autodesk.com/view/MAYAUL/2024/ENU/?guid=__py_ref_index_html
- CG Society опрос о времени на рутину (2025) — внутренний отчёт.
Комментарии