You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:15:33