From: ousttrue Date: Sat, 19 Jun 2010 03:43:39 +0000 (+0900) Subject: fix bone weight. X-Git-Url: http://git.osdn.jp/view?a=commitdiff_plain;h=471481f5d66ba01136fc03f6914efc86dc4d0c8a;p=meshio%2Fmeshio.git fix bone weight. --- diff --git a/swig/blender/pmd_export.py b/swig/blender/pmd_export.py index d010503..567edcf 100644 --- a/swig/blender/pmd_export.py +++ b/swig/blender/pmd_export.py @@ -522,7 +522,7 @@ class Bone(object): return "" % (self.name, self.type) class BoneBuilder(object): - __slots__=['bones', 'boneMap', 'ik_list'] + __slots__=['bones', 'boneMap', 'ik_list', ] def __init__(self): self.bones=[] self.boneMap={} @@ -590,6 +590,20 @@ class BoneBuilder(object): bl.ikRotationWeight(c) )) + # boneのsort + self._sortBy() + self._fix() + # IKのsort + def getIndex(ik): + for i, v in enumerate(englishmap.boneMap): + if v[0]==ik.target.name: + return i + return len(englishmap.boneMap) + if isBlender24(): + self.ik_list.sort(lambda l, r: getIndex(l)-getIndex(r)) + else: + self.ik_list.sort(key=getIndex) + def __checkConnection(self, b, p): if bl.boneIsConnected(b): parent=self.__boneByName(p.name) @@ -598,10 +612,11 @@ class BoneBuilder(object): for c in b.children: self.__checkConnection(c, b) - def sortBy(self, boneMap): + def _sortBy(self): """ boneMap順に並べ替える """ + boneMap=englishmap.boneMap original=self.bones[:] def getIndex(bone): for i, k_v in enumerate(boneMap): @@ -627,7 +642,7 @@ class BoneBuilder(object): if b.ik_index>0: b.ik_index=sortMap[b.ik_index] - def fix(self): + def _fix(self): """ 調整 """ @@ -654,10 +669,13 @@ class BoneBuilder(object): assert(false) def indexByName(self, name): - return self.getIndex(self.__boneByName(name)) + if name=='': + return 0 + else: + return self.getIndex(self.__boneByName(name)) def __boneByName(self, name): - return self.bones[self.boneMap[name]] + return self.boneMap[name] def __getBone(self, parent, b): if len(b.children)==0: @@ -678,7 +696,7 @@ class BoneBuilder(object): def __addBone(self, bone): bone.index=len(self.bones) self.bones.append(bone) - self.boneMap[bone.name]=bone.index + self.boneMap[bone.name]=bone class PmdExporter(object): @@ -709,17 +727,6 @@ class PmdExporter(object): # skeleton self.builder=BoneBuilder() self.builder.build(self.armatureObj) - self.builder.sortBy(englishmap.boneMap) - def getIndex(ik): - for i, v in enumerate(englishmap.boneMap): - if v[0]==ik.target.name: - return i - return len(englishmap.boneMap) - if isBlender24(): - self.builder.ik_list.sort(lambda l, r: getIndex(l)-getIndex(r)) - else: - self.builder.ik_list.sort(key=getIndex) - self.builder.fix() def __createOneSkinMesh(self, node): ############################################################ @@ -758,8 +765,8 @@ class PmdExporter(object): v.normal.z=normal[1] v.uv.x=uv[0] v.uv.y=uv[1] - v.bone0=self.builder.boneMap[b0] if b0 in self.builder.boneMap else 0 - v.bone1=self.builder.boneMap[b1] if b1 in self.builder.boneMap else 0 + v.bone0=self.builder.indexByName(b0) + v.bone1=self.builder.indexByName(b1) v.weight0=int(100*weight) v.edge_flag=0 # edge flag, 0: enable edge, 1: not edge