def normRotation(self, tmpSkel = None, refPtIdx = None):
'''tmpSkel: normalize every palm pose to the tmpSkel pose (template skeleton)
refPtIdx: indexes of joints on the palm
'''
if tmpSkel is None:
tmpSkel = self.frmList[0].norm_skel
if refPtIdx is None:
refPtIdx = self.refPtIdx
refIdx = []
for idx in refPtIdx:
refIdx += [idx*3, idx*3+1, idx*3+2]
keep_list = set(range(3*self.skel_num)).\
difference(set(refIdx+range(self.centerPtIdx, self.centerPtIdx+3)))
keep_list = list(keep_list)
temp = tmpSkel[refIdx].copy()
temp.shape = (-1,3)
for frm in self.frmList:
model = frm.norm_skel[refIdx]
model.shape = (-1,3)
R = np.zeros((3,3), np.float32)
for vt, vm in zip(temp, model):
R = R + np.dot(vm.reshape(3,1), vt.reshape(1,3))
U,s,V = svd(R, full_matrices=True)
R = np.dot(V.transpose(), U.transpose())
frm.quad = Quaternion(R)
frm.norm_skel.shape = (-1,3)
frm.norm_skel = np.dot(R,frm.norm_skel.transpose())
frm.norm_skel = frm.norm_skel.flatten('F')
# frm.norm_skel = frm.norm_skel[keep_list]
评论列表
文章目录