def calcTransform(self, recursive=True): if self.parent: self.transform = self.parent.transform[:] else: self.transform = makeUnit() m = makeTranslation(*self.offset) self.transform = mmul(self.transform, m) m = euler2matrix(self.rotation, "syxz") self.transform = mmul(self.transform, m) self.normalTransform = _transpose(invTransform(self.transform), 4, 4) if recursive: for child in self.children: child.calcTransform(recursive)
def updateFrame(self, frame, scale=0.10): if self.parent: self.transform = self.parent.transform[:] else: self.transform = makeUnit() #makeScale(scale) m = makeTranslation(self.offset[0], self.offset[1], self.offset[2]) self.transform = mmul(self.transform, m) #parent postmultiply with offset if frame >= 0 and frame < len(self.frames): index = 0 Ryxz = [0.0, 0.0, 0.0] Txyz = [0.0, 0.0, 0.0] for index, channel in enumerate(self.channels): if channel == 'Xposition': Txyz[0] = scale*self.frames[frame][index] elif channel == 'Yposition': Txyz[1] = scale*self.frames[frame][index] elif channel == 'Zposition': Txyz[2] = scale*self.frames[frame][index] if channel == 'Xrotation': Ryxz[1] = self.frames[frame][index] * degree2rad elif channel == 'Yrotation': Ryxz[0] = self.frames[frame][index] * degree2rad elif channel == 'Zrotation': Ryxz[2] = self.frames[frame][index] * degree2rad #self.translation = Txyz[:] self.rotation = Ryxz[:] m = euler2matrix(Ryxz, "syxz") m[3], m[7], m[11] = Txyz[0], Txyz[1], Txyz[2] self.transform = mmul(self.transform, m) # parent post multiply with transformations for child in self.children: child.updateFrame(frame)
def setupFkBones(srcRig, trgRig, boneMapping, anim): keepOffsets = KeepRotationOffset + FootBones keepOffsInverts = [] if USE_SPINE_OFFSET: keepOffsets += SpineBones keepOffsInverts += SpineBones if USE_CLAVICLE_OFFSET: keepOffsets += ClavBones keepOffsInverts += ClavBones # Simplified mapping: src to MHX for (srcName, trgName) in boneMapping: try: srcBone = srcRig.getJoint(srcName) trgBone = trgRig.getJoint(trgName) except: print(" -", trgName, srcName) continue # Create direct mapping between bones boneData = CBoneData(srcBone, trgBone) anim.boneDatas[trgName] = boneData anim.boneDataList.append(boneData) # Assign rest pose matrix (position relative to root) boneData.trgRestMat = trgBone.rest_mat boneData.trgRestInv = aljabr.invTransform(trgBone.rest_mat) boneData.trgBakeMat = boneData.trgRestMat # Inherit rotation from parent bone if trgBone.parent: #trgBone.bone.use_inherit_rotation: try: boneData.parent = anim.boneDatas[trgBone.parent.name] parRest = boneData.parent.trgRestMat parRestInv = boneData.parent.trgRestInv offs = sub(trgBone.position, trgBone.parent.tail) # calculate offset in global coordinates (relative to root) boneData.trgOffset = aljabr.mmul( aljabr.mmul(parRestInv, aljabr.getTranslation(offs)), parRest) boneData.trgBakeMat = aljabr.mmul(parRestInv, boneData.trgRestMat) #print(trgName, trgBone.parent.name) except: pass trgRoll = getRoll(trgBone) # TODO will be 0 srcRoll = getSourceRoll(srcName) * Deg2Rad diff = srcRoll - trgRoll # Determine whether offset between src and target has to be kept for this bone if srcName in keepOffsets: # rotation offset transformtaion between src and target bone rest offs = aljabr.mmul(trgBone.rest_mat, aljabr.invTransform(srcBone.rest_mat)) boneData.rotOffset = aljabr.mmul( aljabr.mmul(boneData.trgRestInv, offs), boneData.trgRestMat ) if trgName in keepOffsInverts: boneData.rotOffsInv = aljabr.invTransform(boneData.rotOffset) # If not keepOffsets and rotation is above threshold, make rot matrix elif abs(diff) > 0.02: #boneData.rollMat = Matrix.Rotation(diff, 4, 'Y') boneData.rollMat = aljabr.makeRotMatrix(diff, [0,1,0]) boneData.rollMat = aljabr.rotMatrix2Matrix4(boneData.rollMat) boneData.rollInv = aljabr.invTransform(boneData.rollMat) boneData.trgBakeInv = aljabr.invTransform(boneData.trgBakeMat) return
def setupFkBones(srcRig, trgRig, boneMapping, anim): keepOffsets = KeepRotationOffset + FootBones keepOffsInverts = [] if USE_SPINE_OFFSET: keepOffsets += SpineBones keepOffsInverts += SpineBones if USE_CLAVICLE_OFFSET: keepOffsets += ClavBones keepOffsInverts += ClavBones # Simplified mapping: src to MHX for (srcName, trgName) in boneMapping: try: srcBone = srcRig.getJoint(srcName) trgBone = trgRig.getJoint(trgName) except: print(" -", trgName, srcName) continue # Create direct mapping between bones boneData = CBoneData(srcBone, trgBone) anim.boneDatas[trgName] = boneData anim.boneDataList.append(boneData) # Assign rest pose matrix (position relative to root) boneData.trgRestMat = trgBone.rest_mat boneData.trgRestInv = aljabr.invTransform(trgBone.rest_mat) boneData.trgBakeMat = boneData.trgRestMat # Inherit rotation from parent bone if trgBone.parent: #trgBone.bone.use_inherit_rotation: try: boneData.parent = anim.boneDatas[trgBone.parent.name] parRest = boneData.parent.trgRestMat parRestInv = boneData.parent.trgRestInv offs = sub(trgBone.position, trgBone.parent.tail) # calculate offset in global coordinates (relative to root) boneData.trgOffset = aljabr.mmul( aljabr.mmul(parRestInv, aljabr.getTranslation(offs)), parRest) boneData.trgBakeMat = aljabr.mmul(parRestInv, boneData.trgRestMat) #print(trgName, trgBone.parent.name) except: pass trgRoll = getRoll(trgBone) # TODO will be 0 srcRoll = getSourceRoll(srcName) * Deg2Rad diff = srcRoll - trgRoll # Determine whether offset between src and target has to be kept for this bone if srcName in keepOffsets: # rotation offset transformtaion between src and target bone rest offs = aljabr.mmul(trgBone.rest_mat, aljabr.invTransform(srcBone.rest_mat)) boneData.rotOffset = aljabr.mmul( aljabr.mmul(boneData.trgRestInv, offs), boneData.trgRestMat) if trgName in keepOffsInverts: boneData.rotOffsInv = aljabr.invTransform(boneData.rotOffset) # If not keepOffsets and rotation is above threshold, make rot matrix elif abs(diff) > 0.02: #boneData.rollMat = Matrix.Rotation(diff, 4, 'Y') boneData.rollMat = aljabr.makeRotMatrix(diff, [0, 1, 0]) boneData.rollMat = aljabr.rotMatrix2Matrix4(boneData.rollMat) boneData.rollInv = aljabr.invTransform(boneData.rollMat) boneData.trgBakeInv = aljabr.invTransform(boneData.trgBakeMat) return