Short Summary/Elevator Pitch:
We are in need of someone with a background in mathematics to assist in the creation of a formula that can convert a set of 3 angles (Euler angles) into a set of numbers that represent how much the muscles in the human eye are contracting.
We are creating a 3D application in Unity3D that emulates the movement of the human eye. The human eye contains 6 muscles that are used to rotate it, and a primary feature of this application is that each individual muscle can be weakened/paralyzed, which alters the way the eye works. In some cases the eye may be limited in how it can move, while in others it may droop or not follow a target correctly. Since 4 of the 6 muscles are angled, we had to use quaternion math in order to accurately represent how the eye rotates.
Despite having an eye that rotates properly, we have been unable to get the eye to track the position of the onscreen mouse.
More Info About the Project:
In our application, we have represented how much an eye muscle contracts as a number between -1 and 1, with -1 being fully contracted, 0 being neither contracted nor stretched, and 1 being fully stretched out. It was designed this way since there are three pairs of "antagonist muscles" in the eye, and when one muscle in the pair contracts, the other stretches proportionally. While there are some real world situations where both muscles in the set can contract simultaneously, our application assumes that only one muscle in the set can contract at any given time. If one muscle is assigned a value, the antagonist muscle is automatically assigned the opposite value.
To change the rotation of the eye in our application, all that needs to happen behind the scenes is changing these muscle values. All of the restrictions and problems that come with muscle weakness are automatically accounted for when the eye goes to rotate.
What makes eye movement so complex is that two sets of muscles in the eye (the vertical muscles which are on the top and bottom, and the oblique muscles which wrap around the eye) are angled. Horizontal movement of the eye is easily represented by contracting one of the two horizontal muscles, but vertical movement of the eye usually requires both a vertical muscle and an oblique muscle. Furthermore, because these muscles are angled, contracting them and pulling the eye usually affects all 3 axes of rotation. Again, we have used quaternion math to properly represent these rotations, and the eye rotates properly when the muscle values are changed.
For our eye, the resting position is looking straight ahead, with the rotation being 0,0,0 (x,y,z). This corresponds to all 6 muscles having a value of 0.
In regards to tracking the mouse, Unity3D has a built in function called "Look At" which can take our digital eye and make it look directly at a point in virtual space. The issue with this is that while the eye would be looking at the mouse, the function does not update the muscle values (which means that all of the extra calculations for muscle weakness are not run). "Look At" does give us the correct rotation of the eye (described as a set of 3 Euler angles), so we can still use it to see what rotation the eye is supposed to be at when it is functioning perfectly.