Eye Position Setup

From Valve Developer Community
Jump to navigation Jump to search
English (en)日本語 (ja)Translate (Translate)
Wikipedia - Letter.png
This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages)
Underlinked - Logo.png
This article needs more Wikipedia icon links to other articles to help Wikipedia icon integrate it into the encyclopedia. Please help improve this article by adding links Wikipedia icon that are relevant to the context within the existing text.
January 2024
Broom icon.png
This article or section needs to be cleaned up to conform to a higher standard of quality.
For help, see the VDC Editing Help and Wikipedia cleanup process. Also, remember to check for any notes left by the tagger at this article's talk page.


Before compiling your run-time character, setting up the proper eye position data is needed. If the model is modified later but the eyes are left in pretty much the same position changing the eye settings shouldn't be needed.

This is what the eye data looks like for one of the female models:

//start eye/face data
$eyeposition 0 0 70

// head controllers
$attachment "eyes" "ValveBiped.Bip01_Head1" 0.002 -3.6165 65.0652 absolute
$attachment "mouth" "ValveBiped.Bip01_Head1" 0.10 -5.70 0.00 rotate 0 -80 -90
$attachment "chest" "ValveBiped.Bip01_Spine2" 4.00 4.00 0.00 rotate 0 95 90
// the following attachment (forward) to enable eye movement and facial animations when using sdk models
// as model for generic_actor entity. It may not be needed for hl2mp sdk models
$attachment "forward" "ValveBiped.Bip01_Head1" 0.0 0.0 0.0 0 -80 -90

$model female_06 "female_06_reference.smd"{
     eyeball righteye "ValveBiped.Bip01_Head1" -1.2783 -3.6165 65.0663 "eyeball_r" 1 4 "pupil_r" 0.63
     eyeball lefteye "ValveBiped.Bip01_Head1" 1.2823 -3.6165 65.0642 "eyeball_l" 1 -4 "pupil_l" 0.63

     eyelid  upper_right "female_06_expressions" lowerer 1 -0.2275 neutral 0 0.1475 raiser 2 0.2559 split 0.1 eyeball righteye
     eyelid  lower_right "female_06_expressions" lowerer 3 -0.2879 neutral 0 -0.2046 raiser 4 -0.0462 split 0.1 eyeball righteye
     eyelid  upper_left "female_06_expressions" lowerer 1 -0.2275 neutral 0 0.1475 raiser 2 0.2559 split -0.1 eyeball lefteye
     eyelid  lower_left "female_06_expressions" lowerer 3 -0.2879 neutral 0 -0.2046 raiser 4 -0.0462 split -0.1 eyeball lefteye

     mouth 0 "mouth" "ValveBiped.Bip01_Head1" 0 1 0     // mouth illumination

     flexfile "Female_06_expressions" {
          $include "../../standardflex_xsi.qci"
     }

     $include "../../facerules_xsi.qci"
     $include "../../bodyrules_xsi.qci"
}
//end eye/face data

the applet QCEyes can be used to format the eye data, or do it manually as described below.

Note.pngNote:Before starting move the eye spheres to the appropriate location for your model and make sure to Freeze All Transforms.

To get the eye position data from the model, do the following;

  1. Get the position of the center point on each eye in all 3 axes (be sure to "Freeze All Transforms" on the eye reference spheres first.)
    Righteye_center_X
    Righteye_center_Y
    Eye XY R.jpg
    Righteye_center_Z Eye Z R.jpg
    Lefteye_center_X
    Lefteye_center_Y
    Eye XY L.jpg
    Lefteye_center_Z Eye Z L.jpg
  2. Get the position on the Y axis for the center point of each eyelid in its default position, raised position and lowered position (if the character is relatively symmetrical use the positions from one eye for both eyes).
    Right_upper_def (upper eyelid, frame 0) Eye upper mid.jpg
    Right_upper_lo (upper eyelid, frame 1) Eye upper lo.jpg
    Right_upper_hi (upper eyelid, frame 2) Eye upper hi.jpg
    Right_lower_def (lower eyelid, frame 0) Eye lower mid.jpg
    Right_lower_lo (lower eyelid, frame 3) Eye lower lo.jpg
    Right_lower_hi (lower eyelid, frame 4) Eye lower hi.jpg
    Left_upper_def (upper eyelid, frame 0) Eye upper mid.jpg
    Left_upper_lo (upper eyelid, frame 1) Eye upper lo.jpg
    Left_upper_hi (upper eyelid, frame 2) Eye upper hi.jpg
    Left_lower_def (lower eyelid, frame 0) Eye lower mid.jpg
    Left_lower_lo (lower eyelid, frame 3) Eye lower lo.jpg
    Left_lower_hi (lower eyelid, frame 4) Eye lower hi.jpg
  3. Once the position data for the eyeballs and eyelids has been aquired, as listed above, do some simple arithmetic to get the following values:
    X_avg_pos The average of Righteye_center_X and Lefteye_center_X
    Y_avg_pos The average of Righteye_center_Y and Lefteye_center_Y
    Z_avg_pos The average of Righteye_center_Z and Lefteye_center_Z
    R_lid_up_hi Right_upper_hi - Righteye_center_Y
    R_lid_up_def Right_upper_def - Righteye_center_Y
    R_lid_up_lo Right_upper_lo - Righteye_center_Y
    R_lid_low_hi Right_upper_hi - Righteye_center_Y
    R_lid_low_def Right_upper_def - Righteye_center_Y
    R_lid_low_lo Right_upper_lo - Righteye_center_Y
    L_lid_up_hi Left_upper_hi - Lefteye_center_Y
    L_lid_up_def Left_upper_def - Lefteye_center_Y
    L_lid_up_lo Left_upper_lo - Lefteye_center_Y
    L_lid_low_hi Left_upper_hi - Lefteye_center_Y
    L_lid_low_def Left_upper_def - Lefteye_center_Y
    L_lid_low_lo Left_upper_lo - Lefteye_center_Y
    Note.pngNote:The axes in XSI are rotated 90 degrees CCW about the X axis from the Source Engine axes.
    A triplet [X, Y, Z] in XSI becomes [X, -Z, Y] in Source.
    Please note the change in sign necessary for the Z value.
  4. Now format the eye position data as shown below:
    //start eye/face data
    $eyeposition 0 0 70
    
    // head controllers
    $attachment "eyes" "ValveBiped.Bip01_Head1" X_avg_pos -Z_avg_pos Y_avg_pos absolute
    $attachment "mouth" "ValveBiped.Bip01_Head1" 0.10 -5.70 0.00 rotate 0 -80 -90
    $attachment "chest" "ValveBiped.Bip01_Spine2" 4.00 4.00 0.00 rotate 0 95 90
    
    $model female_06 "female_06_reference.smd" {
         eyeball righteye "ValveBiped.Bip01_Head1" Righteye_center_X -Righteye_center_Z Righteye_center_Y "eyeball_r" 1 4 "pupil_r" 0.63
         eyeball lefteye "ValveBiped.Bip01_Head1" Lefteye_center_X -Lefteye_center_Z Lefteye_center_Y "eyeball_l" 1 -4 "pupil_l" 0.63
        
         eyelid  upper_right "female_06_expressions" lowerer 1 R_lid_up_lo neutral 0 R_lid_up_def raiser 2 R_lid_up _hi split 0.1 eyeball righteye
         eyelid  lower_right "female_06_expressions" lowerer 3 R_lid_low_lo neutral 0 R_lid_low_def raiser 4 R_lid_low _hi split 0.1 eyeball righteye
         eyelid  upper_left "female_06_expressions" lowerer 1 L_lid_up_lo neutral 0 L_lid_up_def raiser 2 L_lid_up _hi split -0.1 eyeball lefteye
         eyelid  lower_left "female_06_expressions" lowerer 3 L_lid_low_lo neutral 0 L_lid_low_def raiser 4 L_lid_low split -0.1 eyeball lefteye
        
         mouth 0 "mouth" "ValveBiped.Bip01_Head1" 0 1 0     // mouth illumination
        
         flexfile "Female_06_expressions" {
              $include "../../standardflex_xsi.qci"
         }
        
         $include "../../facerules_xsi.qci"
         $include "../../bodyrules_xsi.qci"
    }
    //end eye/face data
    

See also

I believe there is an error in Step #3, the instructions state:

Once you've acquired the position data for the eyeballs and eyelids, as listed above, you'll need to do some simple arithmetic to get the following values:

X_avg_pos = The average of Righteye_center_X and Lefteye_center_X

Y_avg_pos = The average of Righteye_center_Y and Lefteye_center_Y

Z_avg_pos = The average of Righteye_center_Z and Lefteye_center_Z

R_lid_up_hi = Right_upper_hi - Righteye_center_Y

R_lid_up_def = Right_upper_def - Righteye_center_Y

R_lid_up_lo = Right_upper_lo - Righteye_center_Y

R_lid_low_hi = Right_upper_hi - Righteye_center_Y

R_lid_low_def = Right_upper_def - Righteye_center_Y

R_lid_low_lo = Right_upper_lo - Righteye_center_Y

L_lid_up_hi = Left_upper_hi - Lefteye_center_Y

L_lid_up_def = Left_upper_def - Lefteye_center_Y

L_lid_up_lo = Left_upper_lo - Lefteye_center_Y

L_lid_low_hi = Left_upper_hi - Lefteye_center_Y

L_lid_low_def = Left_upper_def - Lefteye_center_Y

L_lid_low_lo = Left_upper_lo - Lefteye_center_Y

The averages are fine but you might notice that from the fourth row down, the second column consists of all "upper" lid points (even when the description is for a lower lid) which also means each equation is repeated twice

(ex. R_lid_up hi = Right_upper_hi - Righteye_center_Y)

(ex. R_lid_low_hi = Right_upper_hi - Righteye_center_Y)

This means that you would actually be repeating the point values and they wouldn't give the correct information. So basically, some of the "uppers" need to be changed to "lowers". The correct equations summary should look like this:

X_avg_pos = The average of Righteye_center_X and Lefteye_center_X

Y_avg_pos = The average of Righteye_center_Y and Lefteye_center_Y

Z_avg_pos = The average of Righteye_center_Z and Lefteye_center_Z

R_lid_up_hi = Right_upper_hi - Righteye_center_Y

R_lid_up_def = Right_upper_def - Righteye_center_Y

R_lid_up_lo = Right_upper_lo - Righteye_center_Y

R_lid_low_hi = Right_lower_hi - Righteye_center_Y

R_lid_low_def = Right_lower_def - Righteye_center_Y

R_lid_low_lo = Right_lower_lo - Righteye_center_Y

L_lid_up_hi = Left_upper_hi - Lefteye_center_Y

L_lid_up_def = Left_upper_def - Lefteye_center_Y

L_lid_up_lo = Left_upper_lo - Lefteye_center_Y

L_lid_low_hi = Left_lower_hi - Lefteye_center_Y

L_lid_low_def = Left_lower_def - Lefteye_center_Y

L_lid_low_lo = Left_lower_lo - Lefteye_center_Y

The bolded words are the ones that were changed. It is a simple error with a simple fix. I caught the error before I actually compiled my character and my fixed outcome was correct so I'm not exactly sure what will happen if you use all "uppers" and repeat points. If anyone else has related information please let me know. Basically, it's important to keep your eyelid points correctly organized so that when it comes time to compile in your eye data you get what you're expecting (not some crazy googly eyes, ha ha).