blender python api 使用指令碼對骨骼進行重新命名(保證唯一性)

大话人生發表於2024-04-18

一、先列印出要重新命名的內容,不真正重新命名

程式碼:

import bpy

for arm in bpy.context.selected_objects:
    if arm.type != 'ARMATURE':
        print("%s bu shi gu jia" % str(arm.name))
        continue
    print('Dealing with', arm.name) 
    
    for object in arm.children:
        for vg in object.vertex_groups:
            new_name = arm.name +'_'+vg.name
            print('Renaming to', new_name)

print('Done!')

帶中文註釋程式碼:

import bpy

# 遍歷當前選中的所有物件
for arm in bpy.context.selected_objects:
    # 如果當前物件不是骨架型別,則跳過
    if arm.type != 'ARMATURE':
        continue
    
    # 列印當前正在處理的骨架物件的名稱
    print('正在處理', arm.name)
    
    # 遍歷骨架的所有子物件
    for object in arm.children:
        # 遍歷子物件的所有頂點組
        for vg in object.vertex_groups:
            # 建立新的名稱,格式為骨架名稱加下劃線加頂點組名稱
            new_name = arm.name + '_' + vg.name
            # 列印要重新命名的新名稱
            print('重新命名為', new_name)

# 列印完成資訊
print('完成!')

注意:要先選中骨骼,然後再執行程式碼

二、真正重新命名程式碼:

import bpy

# 遍歷當前選中的所有物件
for arm in bpy.context.selected_objects:
    # 如果當前物件不是骨架型別,則跳過
    if arm.type != 'ARMATURE':
        continue
    
    # 列印當前正在處理的骨架物件的名稱
    print('正在處理', arm.name)
    
    # 遍歷骨架的所有子物件
    for object in arm.children:
        # 遍歷子物件的所有頂點組
        for vg in object.vertex_groups:
            # 建立新的名稱,格式為骨架名稱加下劃線加頂點組名稱
            new_name = arm.name + '_' + vg.name
            # 列印要重新命名的新名稱
            print('重新命名為', new_name)
            
            # 將骨架的相應骨骼名稱改為新的名稱
            arm.pose.bones[vg.name].name = new_name
            # 將頂點組的名稱改為新的名稱
            vg.name = new_name

# 列印完成資訊
print('完成!')

在這段程式碼中,除了列印出要重新命名的新名稱外,還新增了實際的重新命名操作。具體來說:

  • arm.pose.bones[vg.name].name = new_name 這行程式碼將骨架中對應頂點組名稱的骨骼名稱改為新的名稱。這裡使用了骨架物件的 pose 屬性來訪問骨架的蒙皮繫結資訊,然後透過頂點組的舊名稱找到對應的骨骼物件,並將其名稱更新為新的名稱。

  • vg.name = new_name 這行程式碼將頂點組的名稱更新為新的名稱。

請注意,這段程式碼假設骨架的骨骼名稱和頂點組的名稱是一致的,這樣才能正確地找到並重新命名對應的骨骼。如果不一致,那麼重新命名操作可能會失敗或者產生意料之外的結果。此外,重新命名操作可能會影響依賴於特定名稱的動畫、約束或其他設定,因此在執行這樣的操作前應當謹慎。

相關文章