Blender中的骨骼顺序与Python中不同

时间:2018-11-23 03:08:26

标签: python blender

我的模型导出器大多数都起作用,但是我在模型中添加了一个额外的骨骼,名为骨骼“ gun”,在我的脚本中,该骨骼的索引为5(连接到“ stump”)。附着在此骨骼上的顶点的索引为10。我在窗口中单击鼠标,图形编辑器显示枪骨是最后一个,即第十个。这是一个并排的图片: 错误的订单:
wrong order

如何在Python中获得正确的订单?

1 个答案:

答案 0 :(得分:1)

blender中的所有集合均为bpy_prop_collection类型。此集合的功能类似于字典和列表,允许按索引或名称引用项目。就像字典一样,您不能依靠名称或创建顺序来按特定顺序排列项目。

由于不能保证添加到集合中的新项目将获得最高的索引号,因此每次导出时都需要与导出时的索引对齐,并且不要尝试重用先前导出的索引。

您应该发现,枚举骨骼列表将提供与内部使用的相同的索引号,您可以使用集合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
...

骨骼移动vertex group中具有权重的顶点,其名称与骨骼匹配。因此,名为“ shoulder.L”的骨骼将移动已分配了权重的顶点到名为“ shoulder.L”的顶点组。在this answer上展开,您可以访问每个顶点组的权重。

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