Различное упорядочение костей в Blender, чем в Python - PullRequest
0 голосов
/ 23 ноября 2018

Мой modelexporter в основном работает, но я добавил в модель дополнительную кость, названную костью «пистолет», и в моем сценарии индекс этой кости равен 5 (связан с «пнем»).Вершины, прикрепленные к этой кости, имеют индекс 10. Я щелкнул в окнах, и редактор графиков показывает, что пистолет-кость - последняя, ​​10-я.Вот картинка рядом: неправильный порядок:
wrong order

Как мне получить правильный порядок в Python?

1 Ответ

0 голосов
/ 26 ноября 2018

Все коллекции в блендере имеют тип bpy_prop_collection.Эта коллекция функционирует как словарь и список, позволяя ссылаться на элементы по индексу или по имени.Как и в словаре, вы не можете полагаться на элементы, находящиеся в определенном порядке, ни по имени, ни по порядку создания.

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

Вы должны обнаружить, что перечисление списка костей даст те же номера индексов, которые используютсявнутренне вы можете получить внутренний индекс Blenders для кости, используя наборы find()

for i, b in enumerate(rig.bones):
    print(i, rig.bones.find(b.name), b.name)


0 0 spine
1 1 spine.001
2 2 spine.003
3 3 spine.004
4 4 spine.005
5 5 spine.006
6 6 shoulder.L
7 7 upper_arm.L
...

Кости перемещают вершины, которым присвоен вес в группе вершин с соответствием именикость.Таким образом, кость с именем "плечо. L" будет перемещать вершины, которым был назначен вес, группе вершин с именем "плечо. L".Развернув этот ответ , вы можете получить доступ к весу каждой группы вершин.

grpid = obj.data.vertices[0].groups[0].group
bone_name = obj.vertex_groups[grpid].name
vert_bone_weight = obj.data.vertices[0].groups[0].weight
...