Blender AI Wiki / Русский Поиск

P05: UV UNWRAPPING STRATEGIES

Автоматические и полуавтоматические стратегии UV развёртки для разных типов объектов

📝 Промпты ⭐⭐ 13 блоков кода обновлено 2026-10-01

ID: P05 | Кластер: Geometry Basics | Сложность: ⭐⭐ | Теги: #uv #unwrapping #texturing #procedural


🎯 ЦЕЛЬ

Автоматические и полуавтоматические стратегии UV-развёртки для разных типов объектов


📝 ПРОМПТ (РУС)

Разверни UV для "[OBJECT_NAME]" методом [METHOD]:
- SMART_PROJECT: автоматический, угол [LIMIT]
- LIGHTMAP_PACK: для 베이ка, padding [PX]
- CUBE_PROJECTION: кубическая проекция
- SPHERE_PROJECTION: сферическая
- MANUAL_SEAMS: по швам (нужны预先 отмеченные seams)

📝 ПРОМПТ (ENG)

Unwrap UV for "[OBJECT_NAME]" using [METHOD]:
- SMART_PROJECT: automatic, angle [LIMIT]
- LIGHTMAP_PACK: for baking, padding [PX]
- CUBE_PROJECTION: cubic projection
- SPHERE_PROJECTION: spherical
- MANUAL_SEAMS: by seams (pre-marked seams required)

🔧 MCP: execute_blender_code

SMART UV PROJECT (Универсальный)

import bpy

obj = bpy.data.objects.get("Target")
if not obj or obj.type != 'MESH':
    raise ValueError("Mesh object required")

# Подготовка
bpy.context.view_layer.objects.active = obj
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='SELECT')

# Smart UV Project
bpy.ops.uv.smart_project(
    angle_limit=1.0472,      # 66° - порог для нового острова
    island_margin=0.02,      # отступ между островами
    area_weight=0.0,         # вес площади (0-1)
    correct_aspect=True,     # учитывать соотношение сторон
    scale_to_bounds=False,   # масштабировать в границы
)

bpy.ops.object.mode_set(mode='OBJECT')
print(f"Smart UV Project done: {len(obj.data.uv_layers)} UV maps")

LIGHTMAP PACK (Для бейка)

bpy.ops.uv.lightmap_pack(
    PADDING=4,               # пикселей между островами
    Px_MARGIN=4,             # отступ в пикселях
    share_tex_space=False,   # делить пространство
)

CUBE / SPHERE PROJECTION

# Кубическая (для архитектуры, коробок)
bpy.ops.uv.cube_project(
    cube_size=1.0,
    clip_to_bounds=True,
    correct_aspect=True,
)

# Сферическая (для окружений, неба)
bpy.ops.uv.sphere_project(
    direction='Z',           # ось проекции
    align='POLAR',           # выравнивание
)

ПО ШВАМ (Ручное управление)

# 1. Отметить швы (в EDIT mode)
bpy.ops.object.mode_set(mode='EDIT')
bm = bmesh.from_edit_mesh(obj.data)
bm.edges.ensure_lookup_table()

# Авто-швы по острым рёбрам
for e in bm.edges:
    if e.calc_face_angle() > 1.0472:  # > 60°
        e.use_seam = True

bmesh.update_edit_mesh(obj.data)

# 2. Развернуть по швам
bpy.ops.uv.unwrap(
    method='ANGLE_BASED',    # 'CONFORMAL' для органики
    margin=0.001,
    fill_holes=True,
    correct_aspect=True,
)

bpy.ops.object.mode_set(mode='OBJECT')

📊 СРАВНЕНИЕ МЕТОДОВ

Метод Скорость Качество Лучше для Авто-швы
Smart Project ⚡⚡⚡ ⭐⭐ Хард-сёрфейс, пропсы Да
Lightmap Pack ⚡⚡ ⭐⭐ Бейкинг, игры Да
Cube Project ⚡⚡⚡ ⭐ Архитектура, примитивы Да
Sphere Project ⚡⚡⚡ ⭐ Сферы, небо Да
Unwrap (Seams) ⚡ ⭐⭐⭐ Органика, персонажи Нет (ручной)
Follow Active Quads ⚡ ⭐⭐ Прямоугольные полосы Частично

💡 СТРАТЕГИИ ПО ТИПАМ ОБЪЕКТОВ

Архитектура (стены, пол, потолок)

# 1. Smart Project с большим margin
bpy.ops.uv.smart_project(angle_limit=1.2, island_margin=0.05)

# 2. Выровнять острова (опционально)
bpy.ops.uv.align_rotation(method='AXIS_X')
bpy.ops.uv.align_rotation(method='AXIS_Y')

Персонажи / Органика

# 1. Ручные швы по anatomiи
# 2. Unwrap с CONFORMAL
bpy.ops.uv.unwrap(method='CONFORMAL', margin=0.005)

# 3. Pack islands
bpy.ops.uv.pack_islands(margin=0.01)

Гейм-пропсы (Low-poly)

# 1. Smart Project агрессивно
bpy.ops.uv.smart_project(angle_limit=1.5, island_margin=0.01)

# 2. Упаковать максимально плотно
bpy.ops.uv.pack_islands(margin=0.002, rotate=True)

Текстуры для бейка (Normal, AO, Curvature)

# Lightmap Pack с ненулевым padding
bpy.ops.uv.lightmap_pack(PADDING=8, Px_MARGIN=8)

🔧 ПРО: UV УТИЛИТЫ

Проверить перекрытия

# В EDIT mode
bpy.ops.uv.select_all(action='DESELECT')
bpy.ops.uv.select_overlap()
# Выделены перекрывающиеся острова

Выровнять тексель (Texas Density)

# Установить плотность текселей (пикселей на метр)
bpy.ops.uv.texel_density_set(target=512)  # 512 px/m

Копировать UV между объектами

src = bpy.data.objects["Source"]
dst = bpy.data.objects["Target"]

# Передать активный UV слой
for i, (sf, df) in enumerate(zip(src.data.polygons, dst.data.polygons)):
    for sl, dl in zip(sf.loop_indices, df.loop_indices):
        dst.data.uv_layers.active.data[dl].uv = src.data.uv_layers.active.data[sl].uv

⚠️ ЧАСТЫЕ ПРОБЛЕМЫ

Проблема Причина Решение
Растянутые текстуры Неправильный aspect correct_aspect=True
Перекрытия островов Мало margin Увеличь island_margin / PADDING
Видимые швы Нет швов / плохие Отметь use_seam на острых рёбрах
Неравномерная плотность Разный масштаб Object > Apply > Scale перед unwrap
Инверсия UV Отрицательный масштаб Проверь scale.x * scale.y * scale.z > 0

🔗 СВЯЗИ

Связанные материалы

Подобраны по тегам и категории.