Как получить группы вершин и веса меша для каждой вершины (Blender Export Script)? - PullRequest
0 голосов
/ 06 мая 2019

Я пишу скрипт экспорта 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, но ожидаю, что сценарий будет завершен до этого.

Спасибо.

...