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.