README.md

Geo Widgets For Rig

Прилагаемые файлы и скрипты созданы в Blender 5.0.1.
SPDX-License-Identifier: GPL-3.0-or-later

Альтернативный вариант изложен в README_ALT


Обзор

Скрипты предназначены для извлечения геометрии меш объекта используемого как прототип виджета с последующей проверкой полученных данных. Целью обработки, получения и тестирования данных является генерация виджетов костей ригов.

С чего начать?

Чтобы превратить готовый меш в код для генерации виджета, нужно извлечь из прототипа два списка: координаты вершин и индексы рёбер. Далее описан процесс с применением Python-скрипта в Blender.


Шаг 1: Подготовка

Необходим меш объект в Объектном режиме (Object Mode) Для примера предполагается объект с именем my_widget_mesh.

Шаг 2: Скрипт для извлечения данных

Прилагаемый скрипт в файле widget_geo_mesh_script.py соберёт данные и выведет в системную консоль два списка готовые к копированию: координаты вершин и индексы рёбер.

# widget_geo_mesh_script.py
# SPDX-License-Identifier: GPL-3.0-or-later

import bpy

# --- НАСТРОЙКА ---
# Имя меш объекта, который служит прототипом виджета
source_object_name = "my_widget_mesh"

# --- ИЗВЛЕЧЕНИЕ ДАННЫХ ---
obj = bpy.data.objects.get(source_object_name)

if obj and obj.type == 'MESH':
    mesh = obj.data

    # 1. ИЗВЛЕЧЕНИЕ ВЕРШИН (verts) - ТОЛЬКО КООРДИНАТЫ
    verts_list = []
    for v in mesh.vertices:
        # Округление для читаемости и сразу создание кортежа
        verts_list.append((round(v.co.x, 3), round(v.co.y, 3), round(v.co.z, 3)))

    # Формирование строки для вывода
    verts_code = "[\n                 " + ",\n                 ".join([str(v) for v in verts_list]) + "\n             ]"


    # 2. ИЗВЛЕЧЕНИЕ РЁБЕР (edges)
    # Используется .format() для более чистого вывода кортежа без лишних кавычек
    edges_list = ["({0}, {1})".format(e.vertices[0], e.vertices[1]) for e in mesh.edges]
    edges_code = ",\n                 ".join(edges_list)

    # --- ВЫВОД ГОТОВОГО КОДА ---
    # Вывод осуществляется в системную консоль (Window > Toggle System Console)
    print("--- СГЕНЕРИРОВАННЫЙ КОД ДЛЯ VERTICES (ИМЯ) ---")
    print(f"verts = {verts_code}")

    print("\n--- СГЕНЕРИРОВАННЫЙ КОД ДЛЯ EDGES (ИМЯ) ---")
    print(f"edges = [\n                 {edges_code},\n            ]")

else:
    print(f"Объект '{source_object_name}' не найден или не является мешем.")
    # --- ФИНИШ --- 

Как использовать скрипт

  • Откройте Blender.
  • Убедитесь, что меш объект существует.
  • Откройте Scripting Workspace (Рабочее пространство для скриптов).
  • Создайте новый текстовый блок и вставьте туда приведённый выше код или загрузите файл скрипта widget_geo_mesh_script.py и откройте его в текстовом редакторе Blender.
  • Перед запуском необходимо указать имеющееся имя объекта если оно отличается от my_widget_mesh.
  • Запустите скрипт (кнопка Run Script).

Важное замечание: Этот метод извлекает геометрию (структуру) меша. Он не учитывает такие вещи, как модификаторы (например, Subdivision Surface), а материалы или UV-развёртки вообще не применяются в рассматриваемом варианте. Если исходный виджет использует модификаторы, перед запуском скрипта примените их (Apply), чтобы получить финальную геометрию или необходимо продумать способ переноса модификаторов на сгенерированный меш объект.


Шаг 3: Результат в консоли

После завершения работы скрипта widget_geo_mesh_script.py в системной консоли (Window > Toggle System Console) можно увидеть вывод, похожий на этот:

# Пример вывода:
--- СГЕНЕРИРОВАННЫЙ КОД ДЛЯ VERTICES (Cube) ---
verts = [
                 (-1.0, -1.0, -1.0),
                 (-1.0, -1.0, 1.0),
                 (-1.0, 1.0, -1.0),
                 (-1.0, 1.0, 1.0),
                 (1.0, -1.0, -1.0),
                 (1.0, -1.0, 1.0),
                 (1.0, 1.0, -1.0),
                 (1.0, 1.0, 1.0)
             ]

--- СГЕНЕРИРОВАННЫЙ КОД ДЛЯ EDGES (Cube) ---
edges = [
                 (2, 0),
                 (0, 1),
                 (1, 3),
                 (3, 2),
                 (6, 2),
                 (3, 7),
                 (7, 6),
                 (4, 6),
                 (7, 5),
                 (5, 4),
                 (0, 4),
                 (5, 1),
            ]

Теперь остаётся только скопировать блоки verts = … и edges = … и вставить их в тело функции генерации виджета, например, в create_root_widget().


Шаг 4: Тестирование

  • Для тестирования необходимо создать новый текстовый блок и скопировать в него приведённый ниже скрипт. Как вариант можно загрузить прилагающийся файл tst_build_script.py и открыть его в текстовом редакторе Blender. Лучшей практикой будет создание новой сцены, поскольку координаты создаваемого объекта могут полностью совпадать с исходным.

  • Из системной консоли необходимо перенести координаты вертексов и индексы рёбер в соответствующие блоки скрипта. Для корректировки положения в тексте можно использовать команды Indent/Unindent целиком для выделенного блока.

  • После настройки необходимо запустить скрипт (кнопка Run Script)

# tst_build_script.py
# SPDX-License-Identifier: GPL-3.0-or-later

import bpy

# ФАЙЛ ТЕСТИРОВАНИЯ

# --- БЛОК ДАННЫХ ---

# ... Вставьте сюда вершины ...
verts = [
    (0.311, 0.0, 0.311),
    (0.406, 0.0, 0.168),
    (0.44, 0.0, 0.0),  
]

# ... Вставьте сюда рёбра ...
edges = [
    (0, 1), # Ребро от вершины 0 к вершине 1
    (1, 2), # Ребро от вершины 1 к вершине 2   
]

# --- КОНЕЦ ВСТАВКИ БЛОКА ДАННЫХ ---

# --- ИСПОЛНИТЕЛЬНАЯ ЧАСТЬ ---

# 1. Создание нового меша и объекта
test_mesh = bpy.data.meshes.new(name="Generated_Test_Mesh")
test_object = bpy.data.objects.new(name="Generated_Test_Object", object_data=test_mesh)

# 2. Заполнение меша данными.
test_mesh.from_pydata(verts, edges, [])

# 3. Обновление меша, чтобы применить изменения
test_mesh.update()

# 4. Привязка нового объекта к текущей сцене
bpy.context.collection.objects.link(test_object)

print("Объект успешно создан из сгенерированных данных!")
# --- ФИНИШ ---

После выполнения скрипт должен создать в сцене новый объект с именем Generated_Test_Object. В системной консоли будет выведено сообщение “Объект успешно создан из сгенерированных данных!”. Если всё пройдёт без ошибок, значит, генерация прошла успешно и данные верны.


Файл для Blender

В файле BuildWidgetsB5_GeoAndTst_KYB280626.blend собраны скрипты и имеется объект для тестирования. Для использования достаточно скачать файл и открыть в Blender версии 5 или новее.


Лицензия

Распространяется на условиях GPLv3.


Описание
Скрипты для извлечения геометрии меш объекта и проверки полученных данных с целью последующей генерации виджетов костей ригов.
Конвейеры
0 успешных
0 с ошибкой
Разработчики