我的模型导出器大多数都起作用,但是我在模型中添加了一个额外的骨骼,名为骨骼“ gun”,在我的脚本中,该骨骼的索引为5(连接到“ stump”)。附着在此骨骼上的顶点的索引为10。我在窗口中单击鼠标,图形编辑器显示枪骨是最后一个,即第十个。这是一个并排的图片:
错误的订单:
如何在Python中获得正确的订单?
答案 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