2D portrait to 3D in Blender: translating Loish
My name is Igor Kekeljevic Keki and I’m an assistant professor at the Engineering Animation Studies, at the Faculty of Technical Sciences in Serbia, where I’m teaching future engineers of computer graphics. In my spare time I love to make digital characters using Blender 3D.
For some time I wanted to make a fanart based on illustrations from the amazing Lois van Baarle. Once again, The Netherlands gives us one of the best painters in the history of art. Lois is best known for illustrations of young women and many of her works were inspiration for 3D character artists.
She published this illustration to celebrate 1 million followers on her Instagram page. As soon as I noticed the illustration, I saw it as a 3D sculpt in my mind and just had to make it in Blender. The first step was to analyze this illustration and try to feel it. Bluish indirect illumination, dim lighting and background colors remind me of dawn, as a moment in time when after some dark period, morning comes and brings belief in a bright future. A female figure emerges with dark tones on the hair and dark-light contrast giving dramatic effect.
The pose of the female figure reminds me of someone who is lying in bed. Hands are important, highlighted by color, connected with roses, gentle but strong and muscular. Hands tell me a story about some hard working person, skilled with their hands. I wanted to follow the story about a young woman who is gentle, skilled, creative, and strong. She had some rough times, but is in the important moment in her life, which brings her a bright future.
Turning a 2D illustration into a 3D digital sculpt is not just a copy, it’s a translation into a different language. In 2D illustration the basic tools are lines and 2D shapes, but in 3D digital sculpt, basic tools are 3D forms. Making this translation requires a lot of experimenting in effort to find something that works. It’s a good idea to start with something easy to edit, with some blocking. For blocking I used my predefined figure, each body part was made from a very low poly object with a Multires Modifier. Pivots for body parts are placed on a position of joints in the body, so it’s easier to make a pose. Body parts from one side are instanced and mirrored to another side, so all the changes of geometry on one side are automatically transferred to another side. If you are interested in this method, You can find out more about it in Zach Reinhardt’s tutorial.
Matching with the illustration was done manually. At first, I roughly created the pose using shapes for the torso, head, and arms. It didn’t have to be done great, just to have some reference for setting up the camera. I added a camera with a Background Image option set to use the original illustration and the rendering size was matched with the illustration size. Perspective on illustration looked normal, so the camera's Focal Length was left to default 50mm. Then I started fitting all geometry and camera with illustrations as much as possible. For blocking I needed around 1 day.
Polishing and modeling details
In the polishing phase I joined separate objects used for blocking into single mesh. Voxel Remesher for Blender can produce good enough results for joining large forms, but it’s not suitable for forms with fine details, such as hands with fingers or a face. Instead, I used a Boolean Modifier. It gives the best start results, but it’s the slowest method and has some pitfalls, caused by instances, object scale, and flipped normals. My workflow with Boolean is:
- Select all objects and convert all instances to single objects.
- To reset scale, use CTRL+A and pick Scale.
- Then apply modifiers with CTRL+A and pick Visual Geometry to Mesh.
- To fix normals, enter into Edit Mode for all objects, do ALT+N and pick Recalculate Normals Outside.
It sounds like a lot of work, but when you get used to it, it can be done in a minute. But the Boolean Modifier can still produce issues. The image below is from some other project I did, but it shows the workflow I used for this project also. I set the display to a bounding box for the secondary object and use Difference for Boolean to check if it’s okay before using Union. But, to be honest, this is obsolete in the new Blender, because the new Boolean with the Exact algorithm works like a charm.
Then I polish the joints and sculpt the fine details using Dyntopo. The final model has over 2 million vertices (maybe I should try to make exactly 1 million, just to be in sync with the artwork name). I didn’t care about optimization or polygon count, because I planned to make just static renders. Eyebrows, eyelashes, eyeballs, teeth, nails are all separated objects. All these body details were modeled using hard-surface techniques, with extensive use of modifiers (ShrinkWrap, Solidify).
The shirt was made with BSurfaces addon, which is really great for manual retopology. Manual retopology gives the best possible starting point for sculpting clothes, but I did some latest sculpts using Mask Extract from the body (available in Sculpt Mode), then used Quadriflow for autoremeshing, this method is fast to do and gives good enough results.
For the face I decided to add some facial characteristics from Lois van Baarle’s face. It just felt suited for the idea I had for this sculpt, to tell a story about a beautiful, gentle, strong, and creative young woman.
When I was doing research for this project, I found some negative feedback about how badly drawn the hands were on the original illustrations. Critique was the hands are too manly and strange. But I like the effect of these unusual hands, they tell a story about someone who works with hands and adds some character to the digital sculpture.
Roses were done using hard-surface modeling techniques, with modifiers. For example, the flower stems were made from single lines, with Skin Modifier and Subdivision Modifier.
Polishing and modeling everything, except the hair, was done in 3 days of work. Hair made me a little bit intimidated and I left it for last.
As usual, I struggled a lot with the hair. It was done as 2 separate objects: one with larger clumps of hair, and second with small clumps of hair. Each clump is made with a curve with another curve used for the hair clump profile. For more about this method you can find a tutorial from Pancake_Manicure.
For this project I needed 2 days to make the hair and this is the part of my workflow needed to be optimized more. In my latest project, I experimented with the Draw Curve tool (available in Edit Mode for curves) used on the surface, emulating the workflow used in ZBrush with the Hair Clump Brush and managed to produce decent looking hair in an hour.
Shading, lighting, rendering
I planned to do only still frames in real-time rendering using EEVEE, so I saved some time and didn’t use retopology, unwrapping, and textures. I used vertex colors instead. On the image below you can see 4 vertex color layers used for the female figure:
- Col - Used for base color. Base tone picked from the original illustration, then some areas painted in reddish color to add color variation and a more natural look.
- Glow - Originally planned to be used for self-illumination on hands, but after some testing used as a mask to change base color on hands to be brighter.
- Glossy - This is used for glossiness. All vertices are painted in 50% of gray and then some areas are painted in brighter color to have more glossiness.
- Cavity - To have cavities in a shader, you cannot use EEVEE because it requires raytracing. But there is a trick to use the Dirty Vertex Color algorithm in available in Vertex Paint Mode. The fine tuning of Cavity values is done in the shader using Color Ramp node.
As shown at the image below, the shader for the female figure used Principled BDSF, with a small amount of Subsurface Scattering (0.01) and some purple underskin tone. Base Color input was a combination of Col, Glow and Cavity vertex color layers. Col vertex color layer using Hue Saturation Value node to compensate an influence of environment light and main light, and to have final color similar to the color on the original illustration.
The image below shows the difference between hair with fine details added with normal map (on the left) and without normal map (on the right). These fine details were done with the procedural Noise Texture node with X scale set to 0 to have fine lines alongside hair clumps. This is possible because curves used for hair automatically generates a UV map.
World shader has different colors for image background and for environment lighting. For image background I used the procedural Gradient Texture node similar to the gradient on the original illustration. But this was not suitable for environment lighting, which had to be some kind of maroon red. This was done with the Light Path node, using the Is Camera Ray check.
For final rendering there were 3 light sources:
- Environment light - The simplest way to achieve colored shadows is to use tinted environment light. For this project some tint of maroon red gives a result similar to the original illustration.
- Main light - Because the shirt is white, I looked at the shirt on the original illustration to determine the color needed for the main light and some tint of turquoise blue looked fine. Shadows on the nose and under the chin showed me a good position for the main light, just above the figure. I used an area light for the main light.
- Focus light - This light is used to bring focus on hand and face. For focus light I used point light set to larger size to get softer shadows.
This personal project took me around one week from start to finish, done in free time, after regular job. I did it for fun, for myself, no money earned for time spent on it. Was it worth my time?
I got many positive feedbacks for this project; it was received great on Artstation, Instagram, Blenderartists, Blendernation. Most of all, I was so glad to see this project was picked for the 3dtoal Staff Picks gallery, it is a big deal for me to be placed alongside such amazing 3D artists. Having something to be proud of, being good at something, having more confidence in yourself; this is why this project was worth my time. Many thanks to 3dtotal for giving me this.