写Blender批量重命名脚本
手动挨个改名易出错、耗时长,复制粘贴脚本又怕版本不兼容或逻辑错漏。
有人这样说「这角色骨骼命名乱得像蜘蛛网,得赶紧批量重命名,明天要交稿了。」
能替你选的都选好了。不想动,直接点下面「交给 AI 办」,点一下就开始做;想改,就点一下要的那个。
已替你选好想改就点一下
只有你知道的不填就先空着,成品里留【待填】
还想怎么改可以不选
开工前请确认
高级选项一般不用动 · 这件事通常 1 分钟左右做好
示例成品全文按上面这组示例选项真跑出来的
选中骨架对象,把下面脚本复制到 Blender 的 Text Editor 里运行。TARGET_PREFIX 改成你要的统一前缀,LEGACY_PREFIXES 是要清掉的旧前缀。原名会备份到骨骼属性 old_name_backup,这脚本只跑一次,别重复跑。
import bpy
TARGET_PREFIX = "Rig_"
LEGACY_PREFIXES = [
"mixamorig:",
"mixamo:",
"DEF_",
"ORG_",
"MCH_",
"CTRL_",
"Bip01_",
]
INDEX_DIGITS = 3
MAX_NAME_LEN = 63
def strip_legacy_prefix(name):
lower_name = name.lower()
for p in sorted(LEGACY_PREFIXES, key=len, reverse=True):
if lower_name.startswith(p.lower()):
return name[len(p):]
return name
def sanitize_name(name):
for ch in (" ", ":", ".", "/", "\\"):
name = name.replace(ch, "_")
return name
def walk_hierarchy(bones):
ordered = []
def rec(bone):
ordered.append(bone)
for child in sorted(bone.children, key=lambda b: b.name):
rec(child)
roots = sorted([b for b in bones if b.parent is None], key=lambda b: b.name)
for root in roots:
rec(root)
if len(ordered) != len(bones):
known = set(ordered)
for bone in bones:
if bone not in known:
ordered.append(bone)
return ordered
def make_unique_name(base, used):
name = base[:MAX_NAME_LEN]
i = 1
while name in used:
suffix = f"_{i:02d}"
name = base[:MAX_NAME_LEN - len(suffix)] + suffix
i += 1
return name
def main():
obj = bpy.context.active_object
if obj is None or obj.type != 'ARMATURE':
print("请先选中一个骨架对象")
return
bpy.ops.object.mode_set(mode='OBJECT')
for bone in obj.data.bones:
if "old_name_backup" not in bone:
bone["old_name_backup"] = bone.name
bpy.ops.object.mode_set(mode='EDIT')
edit_bones = obj.data.edit_bones
bones = list(edit_bones)
ordered = walk_hierarchy(bones)
used = set()
final_pairs = []
for index, bone in enumerate(ordered, start=1):
clean = strip_legacy_prefix(bone.name)
clean = sanitize_name(clean)
if not clean:
clean = "Bone"
base = f"{TARGET_PREFIX}{index:0{INDEX_DIGITS}d}_{clean}"
final = make_unique_name(base, used)
used.add(final)
final_pairs.append((bone, final))
for i, bone in enumerate(bones):
tmp = f"__renaming_tmp_{i:04d}"
while edit_bones.find(tmp) != -1:
tmp += "_x"
bone.name = tmp
for bone, final in final_pairs:
bone.name = final
print(f"已重命名 {len(bones)} 个骨骼,原名备份在 old_name_backup")
main()