Blender中通过字典调用骨骼位置添加立方体的异常问题排查
Blender脚本:为骨骼头部添加对应命名立方体的正确方法
问题根源分析
- 直接遍历
armature.edit_bones:编辑模式下的骨骼数据是临时编辑数据,未同步到绑定数据(data.bones),遍历过程中易因上下文变化导致位置错乱。 - 字典存位置失效:若直接存储
bone.head,实际存的是Blender向量的引用而非具体数值,后续操作(如模式切换)会导致引用指向的数据异常,最终位置失效。
正确实现步骤
1. 核心注意点
必须在物体模式下获取骨骼绑定数据,同时将骨骼局部位置转换为世界空间,并存储具体数值而非引用。
2. 完整脚本示例
import bpy # 指定目标骨骼对象(也可通过选中对象获取) armature = bpy.data.objects["你的骨骼对象名称"] # 确保处于物体模式,读取稳定的骨骼绑定数据 if bpy.context.mode != 'OBJECT': bpy.ops.object.mode_set(mode='OBJECT') # 构建骨骼名称与世界空间头部位置的字典 bone_head_dict = {} for bone in armature.data.bones: # 将骨骼局部头部坐标转换为世界空间,存储为元组避免引用问题 world_head = armature.matrix_world @ bone.head bone_head_dict[bone.name] = (world_head.x, world_head.y, world_head.z) # 遍历字典创建对应立方体 for bone_name, head_pos in bone_head_dict.items(): # 创建立方体并定位 bpy.ops.mesh.primitive_cube_add(size=0.1, location=head_pos) # 重命名立方体 bpy.context.active_object.name = f"Cube_{bone_name}_head"
关键细节解释
- 物体模式访问
data.bones:这里的骨骼数据是绑定到对象的稳定存储数据,而非编辑模式下的临时缓存,避免遍历过程中数据异常。 - 坐标空间转换:
armature.matrix_world @ bone.head将骨骼自身局部空间的头部位置,转换为场景世界空间坐标,确保立方体出现在正确位置。 - 存储元组而非向量:把向量值拆分为元组存储,彻底切断与Blender内部向量的引用关联,后续读取位置时不会因上下文变化失效。
内容的提问来源于stack exchange,提问作者cubesareneat
相关产品推荐
相关产品推荐

