Blender 中的骨骼顺序与 Python 中的不同
Different ordering of bones in Blender than in Python
我的模型导出器大部分工作,但我向模型添加了一个额外的骨骼,命名为骨骼 'gun',在我的脚本中,该骨骼的索引为 5(连接到 'stump')。附加到该骨骼的顶点的索引为 10。我在 windows 中单击,图形编辑器显示 gun-bone 是最后一个,第 10 个。这是一张并排的照片:
顺序错误:
如何在 Python 中获得正确的顺序?
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 with a name matching the bone. So the bone named "shoulder.L" will move vertices that have been assigned a weight to vertex group named "shoulder.L". Expanding on 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
我的模型导出器大部分工作,但我向模型添加了一个额外的骨骼,命名为骨骼 'gun',在我的脚本中,该骨骼的索引为 5(连接到 'stump')。附加到该骨骼的顶点的索引为 10。我在 windows 中单击,图形编辑器显示 gun-bone 是最后一个,第 10 个。这是一张并排的照片:
顺序错误:
如何在 Python 中获得正确的顺序?
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 with a name matching the bone. So the bone named "shoulder.L" will move vertices that have been assigned a weight to vertex group named "shoulder.L". Expanding on 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