jjburton/cgmTools

Muzzle lip seal with drax

jjburton opened this issue · 5 comments

Ran into some issues with Drax with the split seal setup because of how the distance fall off was measured.
Old method
each point was given a distance to the mid and to the corners and these were normalized to be fed back to a driver attribute as to when the lips would be closed

New method
first verify that my understanding of the issue is off by manually feeding in my expected values list
if this is correct move to a new curve based method to more accurately generate the distance data of the u values along the curve rather than world space distances

#...vars going in
{'buildNetwork': True,
 'driven1': [(node: 'R_uprLip_1_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'R_uprLip_2_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'R_uprLip_3_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'R_uprLip_4_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'CTR_uprLip_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'L_uprLip_4_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'L_uprLip_3_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'L_uprLip_2_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'L_uprLip_1_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>)],
 'driven2': [(node: 'R_lwrLip_1_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'R_lwrLip_2_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'R_lwrLip_3_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'R_lwrLip_4_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'CTR_lwrLip_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'L_lwrLip_4_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'L_lwrLip_3_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'L_lwrLip_2_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
             (node: 'L_lwrLip_1_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>)],
 'inTangent': 'linear',
 'maxValue': 10.0,
 'nameSeal1': 'left',
 'nameSeal2': 'right',
 'nameSealMid': 'center',
 'outTangent': 'linear',
 'sealDriver1': (node: 'L_lipCorner_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
 'sealDriver2': (node: 'R_lipCorner_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
 'sealDriverMid': (node: 'midSealMarker' | mClass: cgmObject | class: <class 'cgm.core.cgm_Meta.cgmObject'>),
 'settingsControl': (node: 'mouthMove_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmControl'>)}

Partial output to compare after rework

{1: {'dist1': [19.266300349401526,
               18.363268186868556,
               18.46250465100387,
               18.92503471891123,
               18.06996526981382,
               15.278388547229838,
               10.652332561957435,
               6.141117182036292,
               2.1581917930713383],
     'dist1Norm': [9.0,
                   8.578160346542651,
                   8.624517361694528,
                   8.840582228102342,
                   8.441147728363749,
                   7.137099205937579,
                   4.976097710456122,
                   2.868742500427359,
                   1.0081710440191185],
     'dist1On': [10.0,
                 9.578160346542651,
                 9.624517361694528,
                 9.840582228102342,
                 9.441147728363749,
                 8.137099205937579,
                 5.976097710456122,
                 3.868742500427359,
                 2.0081710440191185],
     'dist2': [2.158192337563681,
               6.141117669363973,
               10.65233300319028,
               15.27838897394638,
               18.069965743222824,
               18.925035171587716,
               18.46250492955262,
               18.363268433058987,
               19.26630077950054],
     'dist2Norm': [1.0081712758652712,
                   2.8687426640345732,
                   4.976097805486347,
                   7.137099245944717,
                   8.441147761071205,
                   8.840582242207939,
                   8.624517299282045,
                   8.578160270049274,
                   9.0],
     'dist2On': [2.008171275865271,
                 3.8687426640345732,
                 5.976097805486347,
                 8.137099245944718,
                 9.441147761071205,
                 9.840582242207939,
                 9.624517299282045,
                 9.578160270049274,
                 10.0],
     'distMid': [17.47129795330754,
                 13.562858612458937,
                 9.182951904961513,
                 4.6244141510603285,
                 2.1612047118129563,
                 4.6244143504731605,
                 9.182952071930746,
                 13.562858819774558,
                 17.471298220775772],
     'distMidNorm': [8.999999862218935,
                     6.986643234500888,
                     4.730419348367341,
                     2.382177147548852,
                     1.1133026384488638,
                     2.3821772502725,
                     4.730419434378299,
                     6.986643341295504,
                     9.0],
     'distMidOn': [9.999999862218935,
                   7.986643234500888,
                   5.730419348367341,
                   3.382177147548852,
                   2.1133026384488636,
                   3.3821772502725,
                   5.730419434378299,
                   7.986643341295504,
                   10.0],
     'driven': [(node: 'R_uprLip_1_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmControl'>),
                (node: 'R_uprLip_2_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmControl'>),
                (node: 'R_uprLip_3_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmControl'>),
                (node: 'R_uprLip_4_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmControl'>),
                (node: 'CTR_uprLip_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmControl'>),
                (node: 'L_uprLip_4_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmControl'>),
                (node: 'L_uprLip_3_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmControl'>),
                (node: 'L_uprLip_2_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmControl'>),
                (node: 'L_uprLip_1_direct_anim' | mClass: cgmControl | class: <class 'cgm.core.cgm_Meta.cgmControl'>)],
     'mPlugs': {'1': {0: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx0_blend1'),
                      1: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx1_blend1'),
                      2: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx2_blend1'),
                      3: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx3_blend1'),
                      4: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx4_blend1'),
                      5: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx5_blend1'),
                      6: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx6_blend1'),
                      7: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx7_blend1'),
                      8: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx8_blend1')},
                '2': {0: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx0_blend2'),
                      1: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx1_blend2'),
                      2: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx2_blend2'),
                      3: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx3_blend2'),
                      4: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx4_blend2'),
                      5: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx5_blend2'),
                      6: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx6_blend2'),
                      7: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx7_blend2'),
                      8: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx8_blend2')},
                'mid': {0: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx0_blendmid'),
                        1: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx1_blendmid'),
                        2: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx2_blendmid'),
                        3: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx3_blendmid'),
                        4: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx4_blendmid'),
                        5: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx5_blendmid'),
                        6: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx6_blendmid'),
                        7: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx7_blendmid'),
                        8: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx8_blendmid')},
                'off': {0: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx0_off'),
                        1: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx1_off'),
                        2: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx2_off'),
                        3: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx3_off'),
                        4: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx4_off'),
                        5: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx5_off'),
                        6: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx6_off'),
                        7: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx7_off'),
                        8: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx8_off')},
                'on': {0: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx0_on'),
                       1: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx1_on'),
                       2: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx2_on'),
                       3: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx3_on'),
                       4: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx4_on'),
                       5: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx5_on'),
                       6: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx6_on'),
                       7: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx7_on'),
                       8: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx8_on')},
                'sum': {0: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx0_sum'),
                        1: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx1_sum'),
                        2: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx2_sum'),
                        3: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx3_sum'),
                        4: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx4_sum'),
                        5: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx5_sum'),
                        6: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx6_sum'),
                        7: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx7_sum'),
                        8: <class 'cgm.core.cgm_Meta.cgmAttr'>(node: 'mouthMove_anim', attr: 'set1_idx8_sum')}}},
l_upr=['R_lipCorner_direct_anim',
 'R_uprLip_1_direct_anim',
 'R_uprLip_2_direct_anim',
 'R_uprLip_3_direct_anim',
 'R_uprLip_4_direct_anim',
 'CTR_uprLip_direct_anim',
 'L_uprLip_4_direct_anim',
 'L_uprLip_3_direct_anim',
 'L_uprLip_2_direct_anim',
 'L_uprLip_1_direct_anim',
 'L_lipCorner_direct_anim']
l_lwr = ['R_lwrLip_1_direct_anim',
 'R_lwrLip_2_direct_anim',
 'R_lwrLip_3_direct_anim',
 'R_lwrLip_4_direct_anim',
 'CTR_lwrLip_direct_anim',
 'L_lwrLip_4_direct_anim',
 'L_lwrLip_3_direct_anim',
 'L_lwrLip_2_direct_anim',
 'L_lwrLip_1_direct_anim']

First pass, just need to get mid split out sorted

import cgm.core.lib.rigging_utils as CORERIG
import cgm.core.lib.distance_utils as DIST
import cgm.core.lib.attribute_utils as ATTR
import cgm.core.lib.math_utils as MATH
def get_uValues(l_use, attrMax = 10.0):
    ml = cgmMeta.asMeta(l_use)
    #Create a curve, uniform through our joints
    _crv = CORERIG.create_at(create='curve', l_pos=[mObj.p_position for mObj in ml])
    mCrv = cgmMeta.asMeta(_crv)
    #Get U values for each joint
    _shape = mCrv.getShapes()[0]
    _minU = ATTR.get(_shape,'minValue')
    _maxU = ATTR.get(_shape,'maxValue')
    #pprint.pprint(vars())
    _res = {'dist1On':[],'dist2On':[],'distMidOn':[]}
    _l = []
    _params = []
    for mObj in ml:
        _d = DIST.get_closest_point_data(_shape,mObj.mNode)#...get our closest point data
        #pprint.pprint(_d)
        _l.append( MATH.get_normalized_parameter(_minU,_maxU,_d['parameter']))#...store our normalized param to the min/max
        _params.append(_d['parameter'])
        
    pprint.pprint(_params)
    pprint.pprint(_l)
    _l = MATH.normalizeList(_l,attrMax)#...normalized this list to our target peak
    
    #Normalize those
    #get midValues
    _rev = [v for v in _l]
    _rev.reverse()
    pprint.pprint(_l)
    _res['dist1On'] = _l
    _res['dist2On'] = _rev

    pprint.pprint(_res)
    
get_uValues(l_upr)

chunk to do the mid split...

l = [0.0,
 2.158193934359861,
 6.148615164707669,
 10.670237037914859,
 15.335657129745137,
 18.721405497344495,
 22.10715381353707,
 26.772573904979456,
 31.29419582640394,
 35.284617094662224,
 37.442811018929184]


_maxValue = 10.0
_normMin = _maxValue *.1
_normMax = _maxValue - normMin

l_norm = MATH.normalizeList(l,_normMax)#...norm to our max

_min = min(l_norm)
_max = max(l_norm)
 
_mid = (_max - _min)/2
_pre = []
_post = []
#...split our lists
for v in l_norm:
    if v >= _mid:
        _post.append(v)
    else:
        _pre.append(v)
    
_preShift = [_mid - v for v in _pre]
_postShift = [v-_mid for v in _post]
_postShift

l_new = _preShift + _postShift
l_new
l_newNorm = MATH.normalizeList(l_new,_normMax)#...norm to our max
l_newOffset = [v + _normMin for v in l_newClean]#...offset to not be on at 0
l_newOn = [MATH.round_float(v,4) for v in l_newOffset]#...clean our float values

this seems to be getting me my values. need to test with the actual build

def get_uValues(l_use, attrMax = 10.0):
    #...get some values
    _normMin = attrMax *.1
    _normMax = attrMax - normMin    
                
    ml = cgmMeta.asMeta(l_use)
    #Create a curve, uniform through our joints
    _crv = CORERIG.create_at(create='curve', l_pos=[mObj.p_position for mObj in ml])
    mCrv = cgmMeta.asMeta(_crv)
    #Get U values for each joint
    _shape = mCrv.getShapes()[0]
    _minU = ATTR.get(_shape,'minValue')
    _maxU = ATTR.get(_shape,'maxValue')
    
    #pprint.pprint(vars())
    _res = {'dist1On':[],'dist2On':[],'distMidOn':[]}
    _l = []
    _params = []
    for mObj in ml:
        _d = DIST.get_closest_point_data(_shape,mObj.mNode)#...get our closest point data
        #pprint.pprint(_d)
        _l.append( MATH.get_normalized_parameter(_minU,_maxU,_d['parameter']))#...store our normalized param to the min/max
        _params.append(_d['parameter'])
        
    pprint.pprint(_params)
    pprint.pprint(_l)
    
    l_norm = MATH.normalizeList(_params,_normMax)#...norm to our max

    #_l = MATH.normalizeList(_l,attrMax)#...normalized this list to our target peak
    
    #Normalize those
    #get midValues
    _rev = [_normMax - v for v in l_norm]
    
    #...now, prcoess the the mid split ==========================================================
    
    _min = min(l_norm)
    _max = max(l_norm)
    _mid = (_max - _min)/2
    _pre = []
    _post = []
    
    #...split our lists
    for v in l_norm:
        if v >= _mid:
            _post.append(v)
        else:
            _pre.append(v)
        
    _preShift = [_mid - v for v in _pre]
    _postShift = [v-_mid for v in _post]
    
    l_mid = _preShift + _postShift
    l_mid = MATH.normalizeList(l_mid,_normMax)#...norm to our max

    #...do our our offsets and what not
    
    _res['dist1On'] = l_norm
    _res['dist2On'] = _rev
    _res['distMidOn'] = l_mid
    
    #pprint.pprint(_res)
    for k,d in list(_res.items()):        
        _l1 = [v + _normMin for v in d]#...offset to not be on at 0
        _res[k] = [MATH.round_float(v,4) for v in _l1]#...clean our float values
    #pprint.pprint(_res)
    
    mc.delete(_crv)
    return _res