Digital Human Contest 2020 - Facial Hair

Making Of / 18 November 2020

When I was looking for how to do a hair, I found the stream record where Arvid Schneider very clearly showed how to make hair using the Groombear  plugin for Houdini. The plugin seemed great to me and very convenient, but nevertheless, the overall style of work remained the same: to put a guide for the hair, you need to change the direction of the viewport's camera a lot and often, to see guide's position in three- dimensional space. Then I remembered that the most convenient thing I've seen for working with curves is the Gravity Sketch

Despite the fact that VR is still in the early stages of its development, I always have fun sketching in three-dimensional space, especially it’s convenient to manage rigs and mannequins, as well as work with complex shapes of curves, plus references could be placed anywhere and in any size.

Because of inexperience, I overdid a little bit (a lot!) with the density of the guides.

When exporting curves from Gravity Sketch there were two difficulties, the first is that the curves were three-dimensional geometry, and the second is that unlike GroomBear, the curves in Sketch Gravity fall under a geometry.

So, I've made a prototype in Houdini that turns gravity Sketch's cylindrical tubes into curves, and removes parts of the curves that are inside the mesh.

Experimentally, I found out that all the cylindrical curves in the gravity sketch consist of 12 corners, which I fused (weld) to one point.

Note: In the future, I can complete an algorithm that would save the diameter of the cylinder before flattening and write it down as a width parameter for guides to GroomBear, thus achieving a complete external matching of curves from Gravity Sketch and GroomBear.

Curves that got inside the mesh, I easily removed, thanks to the solution proposed by Petz on odforce.net.  Thank you, Petz!


//run over Primitives


int points[] = primpoints(0, @primnum);
int point_end = points[-1];
int point_next = points[1];


vector hit_pos, hit_uv;
vector ray_origin = point(0, "P", points[0]);
vector ray_dir = point(0, "P", points[1]) - ray_origin;
int count = 0;


int cond = inpointgroup(geoself(), "_inside_", points[0]);
int curve = addprim(geoself(), "polyline", points[0]);
setprimgroup(geoself(), "inside", curve, cond, "set");


int i = 1;
do
{
    int prim = intersect(1, ray_origin, ray_dir, hit_pos, hit_uv);
    if(prim == -1)
    {
        point_next = points[i];
        addvertex(geoself(), curve, point_next);
        ray_origin = point(0, "P", points[i++]);
        ray_dir = point(0, "P", points[i]) - ray_origin;
    }
    
    else
    {
        count += 1;
        point_next = addpoint(geoself(), hit_pos);
        addvertex(geoself(), curve, point_next);
        curve = addprim(geoself(), "polyline", point_next);
        if(!cond)
            setprimgroup(geoself(), "inside", curve, count % 2, "set");
        ray_dir = point(0, "P", points[i]) - hit_pos;
        ray_origin = hit_pos + normalize(ray_dir) * 0.001;
    }
}
while(point_next != point_end);
removeprim(geoself(), @primnum, 0);

Because the result is ordinary curves, GroomBear easily converted them into guides.

Then I drew the attributes where the hair will grow.

And moved the eyebrows by looking on a reference photo through Pureref, it is more convenient to do it in Houdini rather than in Gravity Sketch, because the roots of the hair are tied to the mesh.

When I was generating hair, I basically added four effects from Hair Tools shelf in different proportions: Clump, Frizz, Bend, Lift.

In the Hair Utils panel in Houdini, there are Generate Hair Cards and Hair Card Texture buttons, by using them I've transformed my hair into cards and baked color textures. I did it very intuitively and will try to better understand this feature in the near future.

The submission date for the contest is already over, but I want to work in more detail with the hair and their binding to the face of the head, as well as try to make dreadlocks with complex weaving, where all possibilities of Sketch Gravity VR will be revealed in full.


Report

Digital Human Contest 2020 - Iris texture

Making Of / 18 November 2020

Eye shader in Character Creator is pretty versatile, but there was two moments, I wanted to be sure that iris pattern is accurate and to desaturate sclera a bit.

To generate iris texture I've bought HumanEyes Iris #100 on Texturing.xyz.

Following the Standard workflow tutorial, I've imported Low_poly iris base from pack and subdivided it four times.

I decided to work with textures directly on geometry, not in a shader, so I projected iris displacement map to color attribute

Then displaced it inside vex operator (kind of visual coding network), 

Same way as displacement I projected color information.

As I've mentioned at a beginning, Character creator 3 has base eye with uv that why I imported its eye texture and put it on a plane, then I adjusted iris position to iris on the plane and baked it out.

Thank you for reading and see you in the next chapters.

Report

Digital Human Contest 2020 - Texture transfer

Making Of / 12 November 2020

Houdini provides users with a wide range of functional blocks (nodes) with which you can build up logical schemes of any complexity to work with computer graphics.

My follow-up work is based on the analysis, formalization and straight repetition of a tutorials presented on texturing.xyz. I relied most on “Sefki Ibrahim - Realtime Digital Double with Character Creator and TexturingXYZ” and “Pietro Berto / Making of Emmanuel”.

I want to say thanks to the authors for their incredible work and clear demonstration of their workflow.

Step 1. Texture projection on mesh

I imported the character directly from Character Creator through GoZ import node. Removed the eyelashes and subdivided the mesh several times.

Then created and put on against the face a plane and set its proportions to same as in purchased photo of scanned skin.

Then marked the corresponding points between the scan and the mesh in the Topo Transfer node. 

Started the projecting process.

Step 1.1. Fixing the projected plane

When projecting is done, not all areas usually lay as they should, especially on the ear tips an earlobe, as well as nostrils. 

I hand-adjusted my ears and nose with the Push Tool (similar to the Move brush in zbrush) from the Modeler plugin for Houdini.

Then smoothed out in projection mode the problem areas through the nod of Topobuild retopology.

Step 2. Baking textures.

The texturing.xyz’s set contains 3 different multichannel maps - Albedo (Skin Color), Displacement (Pores info), Utility (Additional info). I needed to bake them to UV coordinates of my character. I took one of the SideFX Labs nodes called Simple baker and used a mesh which I transferred earlier from GoZ as a target geometry, and put projected plane as baking source, which I can use to lay textures for baking.


Step 2.1. A bit of automatization.

I won’t to bake textures manually one by one, plus baking high-resolution textures takes a long time, so I decided to delegate some work to Houdini, because Houdini has blocks for tasks automation (PDG or TOP nodes). I created a scheme which tells Houdini that I need to accomplish three times a typical task: 

1.    Change the input texture via a switch with number of current task.

2.    Change the name of the map to import (original texture). 

3.    Change the name of the map to export (processed texture). 

4.    Bake the texture. 

Now I can bake several textures at once with the touch of a button. 

Step 3. Textures mixing.

Since the textures used for baking covered only part of the face, they lack information about other parts of the mesh. I’ve used default base mesh maps to get missing info. 

For mixing I used two masks: 

The first I painted the color in the viewport right on the mesh with Paint node and transferred this information to the UV. 

I figured out how to do this by the examples by Symek and Hughspeers from Odforce.net forum. Thank you, guys. 

vector uv  = set(X,Y,0);
string path = "op:" + opfullpath('../../Baked_Texture_Tweaking/invert_color');
vector clr = uvsample(path, "Cd", "uv", uv);
R = clr.x;
G = clr.y;
B = clr.z;

I drew the second mask right on top of the UV coordinates through Rotoshape compositing node. Then I blurred the contours of the masks and combined it together with previous one. 

In the further I continued to process the images adhering to this non-destructive approach.

Note: at this step I made several mistakes that I tried not to repeat in the next.

1.    I didn't input the original image to Rotoshape, so this mask doesn't scale and only works with maps in 8k resolution, and it doesn't show up correctly on the node previews. 

2.    I didn't use proxy images to speed up work. In the current state Houdini’s compositing nodes doesn’t use the OpenCL library to speed up calculations with GPU, so working with high-resolution images becomes slow, but this issue is solved by using a proxy images with reduced resolution.

Step 3.1 A bit of automatization.

Repetition of step 2.5 only for textures mixing procedure. On the way out, I'll get 3 new temporary textures.

Step 4. Proxy images preparation.

To speed up further image processing, I generated copies of all the maps in ¼ ratio to the origin. And again, automated this process.

Step 5. Textures adjustments.

Throughout a textures there were many small places with extra information to be removed, such as eyelashes on the eyes, too dark nostrils, chin and insides of the ears. 

I used a mixing technique from step 3 but alternated sources to find good looking part of the skin for overlay, these were: 

1.    The map itself simply shifted by UV coordinates. 

2.    Original skin texture from texturing.xyz

3.    The map itself but mirrored. 

Then repeated all the operations for the rest of the maps through the task nodes. 

Step 5.1 Textures stretching.

During the baking process, the lips weren’t projected deep enough inside the mouth, to correct this I cut out the upper and lower lips and stretched them down and up accordingly with the Pin transform compositing node, then put them back on the source map and removed the extra info with a mask.

Step 5.2. Utility map adjustment

From the Utility map I needed information about the face front (for the roughness map), so I painted everything else black. And made a few small adjustments like in step 5. 

Step 6. Textures export.

I split utility maps and displacement maps by channels because each channel contains unique info about the skin and preserved as individual linear image.

Step 7. Roughness map creation. 

Character Creator allows you to flexibly adjust roughness for individual areas of the face, so I was required to create an average map with pores on the skin. To do this, I took the B channel from the utility card and inverted it, then multiplied it into an inverted channel R of displacement map. Then reduced the contrast and brightness. 

To be honest, I’m not satisfied with this method, I'd like to experiment with other ways of generating it in the future.

At this point, the preparation of the additional maps in Houdini was over, and I moved to Zbrush to mix the displacement maps, add details and bake them to a normal map. 

I imported the model from Character Creator through the GoZ again and subdivide the model to level 7. 

Then I created 3 layers for displacement maps and imported them one by one, adjusting the visibility of the layer by the eye.   

Addition layer was created for my own pores and wrinkles, which I was able to see on the references. My character is young, so he doesn't have a strong skin defects. There are some scars on the references but I didn’t sculpt them in order to don’t tie the character to a particular person. At the same time, I can add them later through SkinGen in Character Creator.

I’ve also added the micro skin by adding procedural noise and pushed it out in places where were no displacement maps, this noise is needed to smooth out the sharp transitions of displacement maps while working in Zbrush, but I did not baked it out, because Character Creator has its own micro-normal maps.

When I've done sculpting, I’ve baked and exported normal maps and moved to the eyes. 

I’ve also put the maps to SkinGen multiply layer for minimal checking.

Thanks for reading and see you in the next chapters.

Report

Digital Human Contest 2020 - Head shape

Making Of / 12 November 2020

I decided to use a real person as a guide and reference for the character. I didn’t set myself a task to make a digital double; I just liked the appearance of the young guy, which I accidentally found. It turned out that the photos of this rap singer are all quite old, most of them dating back to 2007. I managed to find photos of a less decent quality on the photo stocks, but even on them, it is difficult to see the small details



To begin with, it was my first time encountering the anatomy of an African American man. In the place where I live, there are many nationalities, but this is mainly uncommon and quite rare; I like learning and discovering new things, so I chose it as a challenge to myself.

I want to note that the book - Anatomy of Facial Expressions has given me a great help in studying the anatomy of a head.



From it, I learned that the shape of the African skull differs from the European one, which in turn leads to a change in the size of the nose, the planting of the eyes, the position of the chin, and many other quite significant characteristics.

I returned to the book occasionally, especially when sculpting different areas of the face tightly adjacent to the skull.

A couple of words about references: already in the working process, I realized that it is necessary to collect not only high-quality references with a neutral expression (which I almost could not find) but also collect good photos taken at various moments and the craziest angles, such photos can help when, for example, some area is constantly in the shade or looks flat, but the camera takes an unusual angle and we can see it in full glory.

At the time of writing this post, I've used the following software:

Character Creator 3 

Zbrush 

Houdini 

The work begins in Character Creator by finding a basic mesh template that will be the easiest to shape in the final character. 

As a base model, I chose the CC3+ African (who would've thought) from the Character Creator’s Basic anatomy set.


As a rule, in design, it is recommended to move from large to small and from large primary forms to secondary and tertiary forms. The official Headshot plugin for Character Creator has an option “Active Sculpt Mode” that allows you to quickly switch between primary and secondary forms on the face and automatically display sliders to fine-tune your chosen area.  There are a lot of sliders in Headshot category of modify tab, so I often used keyword sorting like depth, scale, width, height, rotate, etc.

Note: Headshot adds its own facial morph sliders tab to the modify window, but standard sliders from the base model are still relevant and complement each other with headshot sliders.



On the rare occasions when I couldn't find the right slider or model complex round 3D forms, I’ve switched to Zbrush with GoZ. 

GoZ allows software to seamlessly share data in both directions at the touch of a button, I found it very convenient.  

Note: While modifying the mesh in Zbrush is preferably to be very carefully and try to follow the direction of topology of the base mesh to avoid stretches on UV coordinates and breakdown of topology guides for blend shapes with expressions.

Also, Character Creator have a flexible PBR Shader, with its help I adjusted the color of the skin to more conform to the reference while modeling. I also had to disable some of the default layer effects in the SkinGen editor because they didn't fit to my character's mood and age.

To have a little more control over the color in the Character Creator's viewport, I temporarily turned off all post-effects in Visual Settings.

While I was getting used to the workflow, I made about 20 unsuccessful versions of the character before I found the right direction.

After I achieved matching the shape of the face to the reference, I moved on to work on the texture of the skin.

To do this, I bought the images with scanned skin from Male 30s Multichannel Face #42 pack at texturing.xyz

For projection, editing and baking textures I used my main digital content creation tool - Houdini.

Report