示例#1
0
    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)
示例#2
0
 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)
示例#4
0
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
示例#5
0
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