Something wrong about Face Control bones.

Issue #541 resolved
东方夕惕 created an issue

"Lips_Funnel" and "Puff" FACS bone move along the wrong direction compare to DS, and don't affect FACS units at all.

In DS, when we move “Lips_Funnel_L”, it moves to the left and “Lips_Funnel_R” moves simultaneously. But in blender, it moves to the right.

We can change the “Limit Location” constraint’s value to fix this problem. Same way works with “Puff”. I hope this addon can do this automatically.

I’m not sure if I do something wrong.This is my workflow:

  1. Import G81F.
  2. Merge rigs.

    3. Make custom shapes. 4. Import all FACS Units.

Comments (47)

  1. Thomas Larsson repo owner

    Now the location limits are set correctly for these bones. As for the funnel strength, you must move both the left and right bones to get the full strength, because each of them affect the the same shapekey with the half strength. If you turn on Show Final Morph Values, as described in http://diffeomorphic.blogspot.com/2021/05/on-raw-and-final-slider-values.html, you can see how the final value of Mouth Funnel changes when you move the funnel bones.

    Having to move two bones is not elegant, but I think we have to live with it. Setting up drivers to make each funnel bone movable while driving its mirror sounds impossible.

  2. 东方夕惕 reporter

    Now “Lips_Funnel” and “Puff” works fine. Thank you!

    As you say, they can not drive eachother. If I only want to move one bone, I can add driver or constraint to one of funnel bones, and move another one to drive it.

    I’m still testing all FACS bones, there are some other issues. I’ll post them when I have time.

    So I will leave this issue open.

  3. Xin

    You can use “X-Axis Mirror” in Pose mode to move both at the same time without constraints or drivers.

  4. 东方夕惕 reporter

    Thanks for your advice. I tested as you say, enable “X-Axis Mirror” in pose mode, but “Lips_Funnel_R“ doesn’t move properly when I move “Lips_Funnel_L”.

  5. 东方夕惕 reporter

    “Mouth_Press_Bottom” and “Mouth_Press_Top“ should have Location X unlocked and enable X location limit compare to DS.

    Moving them along local X axis will drive “Mouth Roll“ FACS unit.

  6. Rose Odimm

    Can you tell me how can your widget working as rig driver?
    When I import the widget become normal mesh object and the bone underneath it just partial poseable.

  7. 东方夕惕 reporter

    You can use the files I attached to test.

    1.Import G81F.

    2.Merge Rigs in Corrections panel.

    3.Select Face controls mesh and hit Make custom shapes in Corrections panel.(important steps)

    4.Import all FACS unit. Then you can pose it in pose mode.

  8. engetudouiti

    I simply think it may better use mirror name (.L and .R) for those generate controller bone (if Thomas plan mirror work)

    without it blender do not think it is pair. (usually if you change bone name for cotroller, it not break driver or current animation, then you can customize if you need.

  9. Thomas Larsson repo owner

    The Mouth Press morph should be driven correctly now. Mouth Roll is strange, though. The custom shape indicates that the bone should move in the XZ-plane (XY-plane in DS), but (Z in DS) drives the mouth roll property. So the problem persists even if the global settings are as in DS (Z up = False and Bone orientation = Daz Unflipped).

  10. 东方夕惕 reporter

    I think Mouth Press morph is always driven correctly in previous commits. The problem is Mouth Roll morph.

    In DS, the bone drives Mouth Press morph when it moves along Y axis; It drives Mouth Roll morph when it moves along Z axis. And we can change it’s “X Translate” property in Parameters pane, but it seems affects nothing.

    In Blender, the bone drives Mouth Press morph when it moves along local Z axis; It drives Mouth Roll morph when it moves along local X axis. And it’s movement along local Y axis affects notiong.

    I think we can simply unlock the X location of Mouth press bones and enable X location limits to make things work.

  11. 东方夕惕 reporter

    Hi @engetudouiti . I’ve tried changing the name “Lips_Funnel_L/R” to “Lips_Funnel.L/R”, but it seems not work properly as well.

  12. Xin

    I can’t test it because I don’t have Blender or daz installed right now.

    Have you tried by removing the constraints to see if it’s a constraint issue?

    Otherwise it’s likely a bones' axes issue. Check that the two bones have the same rotation in edit mode. Also check that every transform channel is unlocked.

  13. engetudouiti

    Ah I see. at first I said wrong. I did not notice _L and _R blender recognize as mirror pair, actually blender can use the suffix as mirror. so bone name is not problem.

    Then if without any constrain, it should move as mirror. but to work as X mirror. the bone roll need to set as mirror.

    (you already know) in edit mode tool option set X-axis mirror. and grab one move > cancel , it auto set roll and postion as mirror for pair bone rest pose.

    But if you need this step to set roll as mirror, I suppose the driver need to modify too.

  14. 东方夕惕 reporter

    This is what the they look like in edit mode.

    I think they are not mirrored. When I enable X-mirror in edit mode, then select one of “Lips_Funnel” bones and hit “G” key to move ,another one become mirrored right away.

    I come back to pose mode, they look like this.

    Edit:Then I enable x-mirror, they still not work properly because constraints. So I remove constraints and unlock all transform channels. This time they can move mirrored,but drivers stop working. Then I disenalbe x-mirror, drivers can work properly.

  15. engetudouiti

    Yes it should be, you can temporally ignore how bone shape show. but test one bone move to + X direction, can move pair as mirror direciton with pose mode mirror?

    if you confirm it, next you need to set driver direciton correctly. along with the direction. (if it work correctly no problem)

    you may just need to set up bone shape along with current direciton. (shape is not effect how drive work as you know)

    (though I just think, mirror pose is useful for some case, but I do not think, everytime you need to change option as mirror is useful for this controller. about this specific case. (each bone drive another shape key,, so you may hope change strength for both side. or sometimes you hope to add same strength as mirror)

    but I think it maybe one option, when user hope to do same thing master controll bone do for r and L >> affect 2 morphs and deform. by use one bone move. (or you may need to give up, move 2 bone at same time as mirror direction. = get mirror deform. by use one bone transform.

    Though actually we can add new bone, + constrain etc etc,,to make new master bone controlelr, but it may better each user do so .

    ===

    And yes, you already do is all what I just thought ^^; and Xin say it already. so use it or not is depend you (you need some steps to work it correctly.. do not know others may take time to work it so just to get mirror pose)

  16. 东方夕惕 reporter

    I think it has so many work to do with “X-mirror” option. So I prefer add a driver to one of those bones manually if you want, and use another one to drive it.

  17. engetudouiti

    Yes if we do it manually for most of controller widget (bone) I may not plan it.

    Though I do not know, if I use those with daz mirror tool in daz studio. how it will work. usually pair name mesh can use mirror pose tool in daz studio too. (when those mesh node are parented by rig, you can use mirror pose tool. (like d-former) if daz do not make pose controller mesh but only add ERC, I think it seems daz mistake)

    Then to make pose widget work as mirror in blender, (if it will be solved)

    1. arrange edit-bone correctly as blender mirror pos when generate. (from your pic I simply suppose all right side or left side bone not locate as mirror work .
    2. it change bone pose local translate direction for one side. so it need to change expression for driven morphs driver.
    3. adjust custom shape mesh rotation witch along with new bone rotation for visual.

    once bone arrangement change, driver effect reverse for another side. so it can easy break morphs which worked before. if G8.1 widget becom standard for most of user, after all user may request these I suppose.

  18. 东方夕惕 reporter

    I don’t know how DS achieve that also.

    To me , I just need all the FACS control bones to drive the morph correctly. As for whether they can move symmetrically, I don't care too much.

    The technology behind it is too difficult to understand for my poor brain.

  19. 东方夕惕 reporter

    Same thing with “Jaw_out” and “Jaw_in“.

    It’s kind of strange, I remember those bones could drive morphs correctly in previous commits some days ago.

    Edit:

    Because I was testing from bottom to top.

    Edit:

    I’ve tried commit 57630fe again, “Jaw_out” , “Jaw_in“ and “Dimple” can drive morph correctly.

  20. engetudouiti

    I just confirmed ds symmetry tool work in daz for pose widget bones. (= Daz arrange widget bone to mirror work) from see your report about bones limit min and max (opositte), I feel if it may better , 1st impot all widget bone as mirror work. and set driver, limit correctly. (anyway I thanks you report and check all one by one. those step must need to confirm new tool work)

  21. 东方夕惕 reporter

    “Tongue_Narrow” bones should have Limit location constraint along local Y axis.

    “Tongue_Out” and “Tongue_In“ should move along local X axis and they should drive corresponding FACS units. Now they are not.

    I think these are the last two problems.

  22. Thomas Larsson repo owner

    The Tongue In/Out bones are weird. The plugin tried to create them twice, and the second time the relation between the DS and Blender axes was lost. If such a duplicate definition is encountered, the info is now preserved and the In/Out bones move in the right direction.

    As for the Tongue_Narrow bones, it is the child bone whose name ends with a “2” that had location limits. Somehow the pairs of bones work together in DS, but in Blender it does not make sense, so the Make Custom Shapes tool moves the constraint to the parent bone.

    I also removed limit rotation constraints where all axes are limited between -180 and +180 degrees, i.e. de facto unlimited.

  23. 东方夕惕 reporter

    Well done! Thomas! I think everything is working now with commit 8238b31.

    But I'm not sure if the improvements listed below need to be done in code.

    Now the “Brow_up“ bones affect nothing, I add “Child of” constraint to “Eyebrow_Inner” and “Eyebrow_Outer“ , then set the “Brow_up“ bone as target and hit Set Inverse to ensure bone’s location is right. Then “Brow_up” bones can work properly.

    Same thing with “Eyes” bone.

  24. Thomas Larsson repo owner

    In DS, the individual brow-up and eyes bones are driven by the main bones. This mechanism already existed in Blender to deal with eyelids (driven by eye) and pectorals (driven by collar). However, it was only implemented for rotations. now it is also done for translations.

    Since the individual brow and eye control bones are now driven, we must invoke Make All Bones Posable afterwards. Also this tool had to be modified to deal with translations correctly.

    Finally I added an option to remove face control bones without shapekeys. AFAIU they don’t do anything useful in Blender once their constraints have been copied to the parent bones.

  25. 东方夕惕 reporter

    There is an error after I hitting Make all bones posable:

    Python: Traceback (most recent call last):
    File "E:\blender-2.92.0-windows64\2.92\scripts\addons\Diffeomorphic-import_daz-bfe41e80fd07\error.py", line 247, in execute
    self.run(context)
    File "E:\blender-2.92.0-windows64\2.92\scripts\addons\Diffeomorphic-import_daz-bfe41e80fd07\figure.py", line 453, in run
    self.addExtraBones(rig)
    File "E:\blender-2.92.0-windows64\2.92\scripts\addons\Diffeomorphic-import_daz-bfe41e80fd07\figure.py", line 686, in addExtraBones
    self.addFinBone(rig, bname, boneDrivers)
    File "E:\blender-2.92.0-windows64\2.92\scripts\addons\Diffeomorphic-import_daz-bfe41e80fd07\figure.py", line 533, in addFinBone
    for drv in boneDrivers[bname]:
    KeyError: 'lowerJaw'

    location: <unknown location>:-1

  26. 东方夕惕 reporter

    There are some problems.

    “Mouth_Corner“ bone’s location Z is driven by “Mouth_Corner2“ which has been deleted. I don't think it should be driven.

    “Tongue_Out” and “Tongue_In“ should be parented to “Tongue”. In DS, there are two “Tongue_Out” and “Tongue_In” bones. A pair of them are parented to “Tongue”, another are parented to “Face_Control_XYZ”. I think this addon confused about this.

  27. Thomas Larsson repo owner

    Yikes! How can you have different bones with the same name? Anyway, I think all issues have been fixed now. I didn’t notice the lowerjaw crash, because I made bones poseable before loading the facs morphs.

    Mouth_corner is definitely driven in the duf file, even if it doesn’t make any sense in a Blender context. Now Mouth_Corner2 and a few other bones are left on layer 5, but they can be delete manually if you want to. The driver doesn’t matter once Mouth_corner is made poseable.

  28. 东方夕惕 reporter

    Excellent work!Make all bones poseable now works.

    But I think there's one more thing to fix.

    Now “Tongue_Out” and “Tongue_In“ which have custom shapes don’t drive corresponding FACS units. Instead, “Tongue_Out-1” and “Tongue_In-1“ is driving FACS units now.

  29. 东方夕惕 reporter

    I think the “Tongue_Out” and “Tongue_In“ should drive the morph and parent them to “Tongue“.
    Or add custom shape to “Tongue_Out-1“ and “Tongue_In-1“. Then add a Limit location constraint to them.

  30. Alessandro Padovani

    Af for commit fe3d2c6, also the “cross” controls seem to do nothing. I checked “delete unused” in custom shapes. As a side note I’d avoid black as default color for the controls, because it merges with the wireframe. Any other color will do fine but in this case we may use blue that’s the same as daz.

    update. Also tested with commit f246047 it’s the same.

  31. engetudouiti

    In ds the one of same name bones (Tongue_out) / (Tongue_in) child of “face control XYZ”do nothing. any prop or bone drive them and they do not drive anything (no ERC) and they have no weight map which assgined for geometry.

    Actually even though I delete them in ds, the dev-tool control bone work. I suppose these duplicate bones made for test only or, simply vendor miss generate them and did not remove it So I suppose this add on only need to generate one of them. (the face cotnroll product have many un-used bones (have no meaning to morph mesh) , so I think same thing happen about this dev tool)

    So add on only need to generate (Tongue_out) and (Tongue_in) child of “Tongue” and they will be used to move g8.1 pose controller (Thongue out) and (Tongue in)

  32. Thomas Larsson repo owner

    Alessandro, yes, I have also noticed that the cross bones do nothing. They do have a custom shape though, and with the current logic everything with a custom shape is saved. I think that they may reference points, which show the rest position of the associated arrow bones. Alas, the cross bones can move in one direction, which contradits that hypothesis.

    The Make custom shapes tool doesn’t do colors = bone groups. If you add custom shapes or convert to mhx or rigify afterwards, you do get colors. Hm. And having tools called both Add and Make custom shapes is not a good idea.

  33. Alessandro Padovani

    I just noticed that the cross controls weren’t there before. So I guessed they were removed by “delete unused” that I always check. If this is not the case then what “delete unused“ is for ?

  34. engetudouiti

    If add on try to move (make it work) those cross controll bones Eyebrows_Inner_L (real weiight bone) or child cotroll bone Eyebros_inner_L2. , add on must need to make new bone hieralchy. this fact controll drive “rest pose bone transform” to achieve complex things.

    blender never forgive it and it is clear limit (and almost no way) to generate those driver for blender.

    But if you change bone hieralchy (not try to make them as same as daz) and not expect it move with other child bone), it can be used to drive props to deform mesh same as daz.

    but I do not think add on can auto generate those driver. (it actually really complex to understand those cross bone how drive and driven even though check and follow all relation)

  35. engetudouiti

    btw Do I need to import those morphs dsf (offered separately as face controller morphs) or they are not supported at current? these are G8.1 default facs controller morphs

    I think, if you follow all daz ERC for new Facs face controller (widget and driver) you needed to use those morph data. or Thomas not generate those inter mideate props, but directly drive bones or genesis 8 face units (if these are driven) ?

  36. engetudouiti

    after all those cross shape drive those controller morphs first >> it drive other single arrow bones transform values which you already set driver. you already generate each drv- bones (like l_Eyebrow_Inner(drv)), so you only need to edit these expression. which will moved by those cross bones.

    but the Formula descirbed in each morph file. which add on may not use them at current.

    (and even though add on import and generate those props, and add driver, it may not work without you change bone name, which add on not generated)

    ==

    I do not means, request to import those morphs and generate them as slider. if you need to make cross bones work, it should be one option. or if you plan not to generate (import ) those morphs, but try directly move bones. you may need to make kind of dirver tempalte for each bones.

    (because you can not get formula, without import those morphs)

    If manually check and make template (write driver expresison for each cross bone, and edit driven bone driver expresison, I do not think it is difficult but just take time, though I do not know we actually need to move cross as same as daz.

  37. engetudouiti

    For both case (add on import controll morphs / not import those controll morphs), after all add on need to take formula which described as Genesis 8.1 Face controll morphs and convert as blender expression.

    At current add on not generate XXXX_L2 / R2 bones, but ds use those transform value for some complex reason. then you need to pick those formula and convert to blender driver without use L2/R2 bones. actually I think add on need not generate those L2/R2 bones for blender. because it never work (it use rest pose bone transform), so we need to convert formula as blender manner without use L2/R2 bones,

  38. Alessandro Padovani

    Commit 1e426b9 seems to work fine here.

    So just to recap to get the facs working we have to:

    1. load the facs controls in daz studio
    2. import in blender
    3. merge rigs
    4. make custom shapes
    5. import facs units
    6. transfer shapekeys to the eyelashes

  39. Thomas Larsson repo owner

    Now I think that the last two issues are straightened out.

    1. Tongue_in-1 is no longer a driver target, but Tongue_in has everything: custom shape, limits, and drives armature properties. Similar for Tongue_out of course.
    2. l_Mouth_corner2 was driving the z location of l_Mouth_corner. Bone drivers are now removed.

    I am a bit worried that these fixes are too specific to the G8.1 face controls and may lead to problems with other assets. In particular I worry that removing bone drivers

  40. Thomas Larsson repo owner

    Please mark as resolved. I can do that too, but it is better if the reporter does it.

  41. Log in to comment