First, just to check the simple stuff first: Did you remember to check “Set Manual Vertex Corners”? I always forget to do that.
But in the code, I believe it gets the upvector from a function in facial_rigger.eye_rigger.py march_vertex()
And march_vertex() simply looks for the middle vertex between your two corners.
upperVert = pathOne[int(round(len(pathOne) * 0.5) - 1)]
So if you count the middle vertex, you’ll likely find that is where the controls are pointing.
Maybe eye_rigger should have an optional field to specify a top vertex for orientation. Or march_vertex() could have an option to search for the closest to a point that is perpendicular to the corners, like in your drawing, instead of simply the middle one.
The skew might also happen around this line, where it calculates the upvector in worldspace relative to the average of the 4 corner vertices and the bboxCenter, which I think is the center of your eye geometry:
# Tracking
# Eye aim control
t_arrow = transform.getTransformLookingAt(bboxCenter,
averagePosition,
upPos.getPosition(space='world'),
axis="zy", negate=False)
If that’s the case, and you aren’t comfortable with Python, and you want a hack right now, you might be able to use a fake temporary sphere as eye geometry, and line it up so it perfectly matches the middle of your eye socket, even if it doesn’t fit inside the eye socket. And that might straighten out the skew.
(But I’m not sure. I’ve never tested that. I’m just reading the code.)