Website Youtube GitHub

Brow rigger script


Thanks so much for the assistance! I’m an animator and not a TD so I need as much help as I can find with facial rigging.


Hi @Krzym ,
The brow rigger looks great.
I tried applying it to a character I’m working on, but I’m getting an error:

Traceback (most recent call last):

File “C:\Users\tsahi\Documents\maya\mgear_3.2\scripts\mgear\custom\”, line 1417, in buildRig


File “C:\Users\tsahi\Documents\maya\mgear_3.2\scripts\mgear\custom\”, line 138, in browRig

c_Loop = [pm.PyNode(e) for e in pm.polySelect(geoTransform, edgeLoopPath=(l_inner.indices()[0], r_inner.indices()[0]), ass=True, ns=True)

TypeError: ‘NoneType’ object is not iterable

Attaching a screen shot.

What am I doing wrong?

Also, another question, can you provide a typical simple custom step post script for building the eye rigger from the json file?

Disclaimer… I don’t code. I did manage to set up import geo and import skin pack custom steps following instructions.

Thank you!


Hi! Glad you like it, well there is a lot to improve and you just faced one more issue :wink: I think, that the script is not that smart (Symmetry mode => ON would look for edges on the same poly mesh), so if you have brows like these, you need to turn off symmetry and prepare separate configs for each eye (you could set up side manually).

Let me know if that’s working, here is script example:

import mgear.shifter.custom_step as cstp
import pymel.core as pm

from mgear.custom import brow_rigger2

class CustomShifterStep(cstp.customShifterMainStep):
    def __init__(self): = "simpleFacial"
        self.charName = pm.PyNode('guide').rig_name.get()

    def run(self, stepDict):

        if self.charName == "MyCharRig":
            # facial_rigger.eye_rigger.rig_from_file(r"D:\Dropbox\data\facial\L_eyeSetup.eyes")
            # facial_rigger.eye_rigger.rig_from_file(r"D:\Dropbox\data\facial\R_eyeSetup.eyes")
            # facial_rigger.lips_rigger.rig_from_file(r"D:\Dropbox\data\facial\lipSetup.lips")



Both brows are the same poly mesh, they’re just not connected with geometry as one shell.
Creating a separate brow for left and write worked. The only thing is that this way the brows aren’t connected through the middle like they are when created as symmetrical. I wonder if there’s a simple work around. Perhaps I’ll create a simple alternative brows mesh that is connected through the middle, just for rig creation, and then skin the real mesh to be used.

Thanks for the custom steps script. It doesn’t work for me so far. It doesn’t give any error either.
It actually says it succeeds, but non of the facial rig parts are created and the skin script skips the head because it looks for the missing facial joints.
Could it be something with the line: if self.charName == “MyCharRig”: ?



Yes, you should create an alternative mesh that would be connected, that’s the way it’s designed. You could create separate modules or a single one, but the loop must be continuous.

Well, actually you could skip the whole if, but “MyCharRig” is the Rig Name from guide settings, so it won’t run until you put your rig settings.



The alternate mesh worked great. Also managed with the custom scripts, thanks to your reply in the pre-post scripts thread.

I encountered something that doesn’t seem right in the rig itself.
Built the rig with symmetry on.
On the left side brow_L_in_tangent_ctl moves together with brow_L_in_ctl.
But on the right side brow_R_in_tangent_ctl doesn’t move with brow_R_in_ctl.
See attached video…

brows in tangent ctl sides comparison


Hmm, just try to break connections on “brow_R_in_tangent_npo”. My bad again, sorry it’s fixed already but will need some time to clean up a bit


That worked. Thank you.