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