Secrets of Swimsuit Babeby Jimmy Chow, Hong Kong
As you would expect, the hairs within the same layer possess the same properties such as density, thickness, color, etc. So you can also separate patches in different ways based on their properties. The purpose of this separation is to reduce modeling effort and render time (which depends on number of hairs and hair passes) because hairs in front must be controlled more precisely as they’re easier to see while those at the back can largely be ignored.
Moreover, it should be noted that the U direction of the patches should be along the hair length and should start from the root while V direction should be normalized to range from 0 to 1. Details will be explained in next section.
I tried to use the same technique to create eyebrows and eyelashes. So their modeling is similar. The appearance is shown in the following figure:
As you can see, there’re a lot of small patches along the length of the brow and eye’s outline. Each one of them corresponds to one Shave mesh. If you use one Shave mesh for the brow, Shave will try to interpolate hairs which will be all over the place.
Hair Generation
After modeling is finished, profile curves are extracted from the patches. They are then converted into hair systems and paint effects. By adjusting the attributes of the hair system nodes, more paint effect strokes are generated based on the profile curves. The paint effects are converted into curves again which become the actual hair curves. For rendering purposes, the hair curves are converted into Shave meshes. The commands involved in this process are shown in the following table:
The manual steps are written in another page of mine. Its URL is
www.cgriders.googlepages.com/hair.html
Some mel procedures are written to automate the execution of these steps. They are contained in the file jcHair.mel (see appendix section for download URL). Before using the script, you should note the following assumptions:
- Curves are generated along the U direction of the NURBS patch and the direction starts from the root of the hair.
- V direction of the NURBS patch should be ranged from 0 to 1.
- There is at least one existing preset for hair system and at least one for Shave as well.
- Groups called hairCurvesN_1, hairSystemsN_1 and pfxCurvesN_1 are required to contain the profile curves, hair system nodes and hair curves respectively. If they are not present, they’ll be created by the script.
- Ideally, a single procedure should create everything up to Shave meshes with the NURBS patches in your current selection list.
This procedure is
jcCreateHairSystemsShaveNodes(string $HairSystemPreset, string $ShavePreset)
If your hair system and Shave presets are called longhair and redhair respectively, the
command you should enter will be:
jcCreateHairSystemsShaveNodes(“longhair”, “redhair”);
After execution, there’ll be a lot of Shave nodes. It’s likely that you’ll need to
change their attributes collectively. The best thing to do is to assign a master node, connect all the attributes to those in all the other nodes. So when you change the
attributes in the master node, all the other nodes will be updated. The procedure to
connect nodes is:
jcConnectShaveNodes(int $includeHairCount)
// usage: select shave display meshes from outliner, then ctrl-select the master to make itappear at the end of the selection list
You can rename the mesh corresponding to the master node in outliner so that you can select it easier without going through the long list under the Shave Select menu. If (for some reason jcCreateHairSystemsShaveNodes fails when your scene is clean without any Shave node) you want to execute only part of the process, there are other procedures you can use:
jcCreateHairSystems(int $n, string $preset)
jcPFX2Shave(string $preset)
jcCreateShaveNodes(string $preset)
jcCreateHairClumps(int $n)
There are other utility procedures you can used to manage the nodes:
jcModifyHairSystems(string $attr, float $value)
jcDeleteAllHairSystems()
jcModifyHairMeshes(string $surfaceshader)
jcDeleteAllHairTubeShaders()
jcDeleteAllBrushes()
jcDisconnectShaveNodes()
jcDeleteShaveNodes()
jcModifyShaveNodes(string $attr, float $value)
Refer to the usage details written in the script file jcHair.mel itself.
Rendering Hairs
As Shave hair only accepts spotlight lighting, its lighting is largely independent of your character. You can separate its lighting in another render layer or even another file. If it is in the same scene of your character, you must update the list of occlusion objects (hairOcclusionObjects) in the Shave Globals node, otherwise it’ll include everything in the scene and it’ll take forever to render or just fail to render altogether. Because it doesn’t obey visibility of objects or object inclusion in render layer. The lighting setup is shown below:
To cast hair shadow onto the character, Shave is not used because its lighting is different. Some replacement objects were created to cast shadow. They were created by converting those paint effects to polygons. The thickness of the polygon hair can be controlled in the hair system nodes. After deleting history, they were huge objects in terms of storage required to save the scene. So reduce their size by removing portions which can be replaced by a simple object, like those on top of the head and those at the back as shown below. Then export them to another scene file and reference them back to the scene so that the size of your scene would be smaller to save.
|
|
|