從Blender裡萃取模組資料(4)
前言
續前篇從Blender裡萃取模組資料(3),這次說明Skeleton的Hierarchy如何萃取,在此做個紀錄。內容
記得在從Blender裡萃取模組資料(1)時取得"Mesh"的做法嗎?透過"bpy.data.meshes"取得Mesh的資料,但這個方法有個前提是必須知道"Mesh"的名稱,如果要從所屬的物件來取得是如何取?答案是透過"Object.data"這個Property來取得,透過檢查型別或是用"Object.type"來檢查也可以,為什麼要說明這件事呢?因為這次的Skeleton的資料也是用一樣的方式來取得,在Blender的編輯器裡,看到的"Object.data"如下圖Skeleton的"Object.data" |
import bpy tagObj = bpy.data.objects["metarig"] #check data by type print('Check object.data use type()') if type(tagObj.data) == bpy.types.Armature: print('Object has armature data') elif type(tagObj.data) == bpy.types.Mesh: print('Object has mesh data') print('Check object.data use object.type') if tagObj.type == 'ARMATURE': print('Object has armature data') elif tagObj.type == 'Mesh': print('Object has mesh data')
Mesh的資料取得後可以到從Blender裡萃取模組資料(1)裡參考資料如何萃取,這裡就不再贅述。另外,在Blender中,稱Skeleton為"Armature",要找關鍵字請用"Armature"。
接著,進入正題"Skeleton的Hierarchy如何萃取",取得的方法是透過"Armature.bones"來取得每一個"Bone",而每一個"Bone"皆有parent與children的資訊,所以只要抓Root bone(沒有parent的Bone),再從Root bone的children來萃取整個Hierarchy即可,範例的程式碼如下
import bpy def ShowBoneInfo(bone,levelCon=0): for i in range(levelCon): print(" ") # print('Bone name:',bone.name) # for childBone in bone.children: ShowBoneInfo(childBone ,levelCon+1) tagObj = bpy.data.objects["metarig"] if type(tagObj.data) == bpy.types.Armature: armatureData = tagObj.data rootBoneList = [] for bone in armatureData.bones: if bone.parent == None: rootBoneList.append(bone) # for rootBone in rootBoneList: ShowBoneInfo(rootBone)
補充說明,"Bone"裡有"name"這個Property,可以取得Bone的名稱。"ShowBoneInfo()"會遞迴出整個Hierarchy,"levelCon"可以知道目前的階層數。
參考資料
Blender Documentation Contents相關文章
Blender裡萃取模組資料(3)從Blender裡萃取模組資料(5)
沒有留言:
張貼留言