Sam is my second attempt at creating a realistic CG human head. My main reason for choosing to create an old man is that there are many more skin details on an older face than there are on a younger person. To me, that would mean "more for less" - by which I mean that because there are more details, it's less of an effort to achieve realism. Younger and smoother skin is a lot harder to create as the line between real and plastic is extremely fine. I think it's something I'd like to try in the future though, just to challenge myself, so hopefully I will be able to show my work to you again at some point.
The software that I used for creating Sam included Maya 7.0, which was the main software used for modelling, laying out UV and hair planting; Mental Ray for rendering; Bodypaint 3D for texturing and ZBrush for creating a displacement map.
I was fortunate to have hi-res photos that I could use as a reference point for this project. After importing the usual left and front reference photos into Maya, I began by modelling just half of the face with as little poly as possible, slowly adding more details along the way. I then mirrored the completed face model and spent some time refining the face to break up the symmetrical look. At this point I imported the quarter view photo into Maya and adjusted the face model to match the photo. It is important to match the model not only to the left and front views, but also to the quarter view because this view can sometimes provide the vital finishing touches to your model. To make the matching up process a little easier, try to remember to find out the focal length of the photo. Each eye ball has two layers: cornea for catching all highlights and actual eye model for shading. Poly cones were used for eye lashes (Fig01 and Fig02).
Texturing and Shading
A good UV (a non stretchy and overlapping UV) is usually the most important aspect when you're trying to create a realistic texture. In the good old days, a realistic UV meant long hours of moving, cutting and sewing UV points. Nowadays, there is a UV layout tool called 'RoadKill', which allows you to get excellent results in seconds. It can be downloaded for free at http://www.pullin-shapes.co.uk/page8.htm
Once you've got a good UV, export the model in OBJ format to Bodypaint 3D for texturing. You can then project those hi-res reference photos onto the model; you can erase, clone, paint, mask and create more layers as and when necessary. Basically the work flow is very similar to Photoshop, but you need a bit more time to get used to the interface. Again, having those hi-res photos makes it a little easier to produce quality textures, although it's important to remove highlights on the photos before using them. You don't really want to include highlights within the textures; the highlights will be taken care of when assigning materials. Also, try making the texture as large as possible. It will certainly make a difference to the final result. I had my textures at 4096 x 4096 resolution (Fig03).
The face texture can now be used to create a displacement map within ZBrush. Convert the face texture into 16 bit greyscale (non RGB) within Photoshop and export it as PSD format into ZBrush to use it as a mask. Load the mask onto the face model within ZBrush and apply "Inflate Deformation" to the face model. Try inflating a few times with low values instead of trying to achieve the result with one go. When you are happy with the result, export the displacement map back into Maya.
I used the misss_fast_skin Mental Ray node to achieve a subsurface skin effect. I generated two other versions of the face texture for Epidermal Scatter Colour (a pale version for outer skin) and Subdermal Scatter Colour (a much saturated for the second inner layer). As for the Back Scatter Colour, I simply assigned a darker red colour to simulate the deepest skin layer. I also applied a mask to isolate the Back Scatter Colour to the ear and neck areas, which shows up nicely when you add a strong back light to the model.
Apply the displacement map to the model. Remember that ZBrush treats 0.5 black as a non displacement value and therefore you need to offset the value by applying an expression (file.alphaOffset = file.alphaGain/2) to the file node (Fig04 and Fig05).