Я пишу скрипт экспорта Blender для моего пользовательского варианта OBJ. У меня есть система, в которой я экспортирую цвета вершин очень похожим на нормали и UV. Меня поразило, что эту же систему можно использовать для экспорта идентификаторов костей и весов для такелажа, просто умножив все веса на 0,5, чтобы они никогда не были равны 1.
Это сделало бы простым добавление анимации костей в мой движок рендеринга после того, как я напишу анализатор файлов BVH.
#New line type:
#Red:
vc 1 0 0
#Green
vc 0 1 0
#Extension to f lines:
f v/vt/vn/vc
f v//vn/vc
f v/vt//vc
f v///vc
#Proposal
vc BoneID1 + (BoneWeight1*0.5) BoneID2 + (BoneWeight2*0.5) BoneID3 + (BoneWeight3*0.5)
#This vertex is 80% weighted by bone 2 and 20% weighted by bone 1
vc 1.1 2.4 0.0
Вот как я могу экспортировать строки vc (Контекст: изменен из Blender OBJ Exporter по умолчанию, export_obj.py, полный файл доступен здесь: https://github.com/gordonfreeman424/GeklminRender_OBJ_Exporter/blob/master/export_obj.py)
if hascolors:
co_key = co_val = None
colors_to_idx = {}
co_get = colors_to_idx.get
loops_to_colors = [0] * len(loops)
for f, f_index in face_index_pairs:
for l_idx in f.loop_indices:
co_key = colveckey3d(me_vertcolors[l_idx].color)
co_val = co_get(co_key)
if co_val is None:
co_val = colors_to_idx[co_key] = vc_unique_count
fw('vc %.4f %.4f %.4f\n' % co_key)
vc_unique_count += 1
loops_to_colors[l_idx] = co_val
del colors_to_idx, co_get, co_key, co_val
Однако, когда я смотрю на dir (bpy.data.meshes ['object_name']), я не могу найти ничего, относящегося к группам вершин.
Где я могу найти список групп вершин и где я могу найти веса? Я должен быть в состоянии разбить его на идентификаторы и веса. Если я смогу получить список групп вершин и соответствующие веса, то все будет хорошо.
Я провел некоторое исследование, и, похоже, информация о группе вершин находится где-то еще в иерархии bpy.data. Учитывая, что Blender в какой-то степени преобразовал меш bpy.data.meshes [], с которым я работаю в сценарии, это делает его, возможно, более сложным.
Я надеюсь, что есть некоторый атрибут сетки bpy.data.meshes [], который дает мне информацию о весе группы вершин для каждой вершины.
(я уже показал код)
Я ожидаю, что конечный файл будет выглядеть примерно так:
#GKBONE "Head" 1
#GKBONE "My Leg" 2
#GKBONE "Foot" 3
#[...]
vc 1.1 2.3 3.1
vc 1.5 0.0 0.0
vc 0.0 1.5 0.0
#[...]
f 1/2/5/1 2/3/1/2 8/9/7/3
Я использую Blender 2.79 в Debian для проверки всего. Блендер 2.79 - моя цель. В конечном итоге я проведу тестирование на Windows, но ожидаю, что сценарий будет завершен до этого.
Спасибо.