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  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;
    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;
        count += 1;
        point_next = addpoint(geoself(), hit_pos);
        addvertex(geoself(), curve, point_next);
        curve = addprim(geoself(), "polyline", point_next);
            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.