Jelena Jovanovic shared how she is working on a realistic portrait of her dog in Maya, Arnold, and UE4.
I’m Jelena Jovanovic, a self-taught 3D artist specializing in 3D animation, and a photographer. I worked for Serbian national television in the graphic department when I was about 20 years old, and as a 3D animation teacher at the School of Electrical and Computer Engineering of Applied Studies. After that, I got an offer to work on our first full feature 3D animated movie, a few small independent animated movies, and I also did some commercial animations and game animations as a freelancer.
Dog Portrait & Real-Time Fur: About the Projects
I want to emphasize that this project is still WIP in Maya and just a test in UE4. Maya project started in April-May 2020. At the time, we were under lockdown in Serbia and I couldn’t go outside to take photos of my dog so I decided to create a simple 3D version of him that could be used for some creative photo editing. After quickly tweaking the mesh to conform to his real measurements I realized that I would need at least some simple fur on him. After adding the first few hair guides it already started looking like him a bit, so my boyfriend told me “why don’t you recreate his famous Batman portrait in 3D?”. In the process, it also changed so as you see, there was no defined idea in the beginning.
First iteration Arnold CPU render:
First hair detail Arnold CPU render:
As this was meant to be just a quick mesh tweaking, I used ZBrush's dog model as a base and did the rest in Maya. There is no high poly sculpt, everything was done on a low poly model but I still paid attention to my dog’s head and neck anatomy. It was incredibly helpful that he was around me, so I could touch him to feel his skin, muscles, and bones under all that fur. As a low poly model, it’s not perfect in terms of sculpting, but some important features that define him are there. Also, as a photographer (specializing in pet photography), I have a good understanding of dogs' face uniqueness, asymmetry, eye gaze, fur highlights, and shadows under different light conditions, and I could take all the photo references I needed.
Grooming was done with XGen Core and I used hair guides to control the flow and length of different areas. I modeled my dog based on his real measurements so when I started placing guides it was easier to get the initial results right. I got some hair samples from his face and neck (I didn’t pluck them, those were loose hairs), put them on a white paper with a tape measure, and took a photo with a macro lens for a reference. Every guide that was placed has a length corresponding to true measures.
Next, I needed to get clumping right which depends on multiple factors: his current guard hair length, undercoat density (it changes seasonally and yearly), cleanliness, and moisture. For this portrait, which is still WIP, I didn’t create his undercoat because hose hairs basically start from his neck (they are very sparse on his head). However, if I wanted to go hyper-realistic I would have needed to include them because they have different properties than guard hairs. Another challenge was to test everything on my old computer because I needed to render fur for every adjustment I made and that took too much time.
There are also some unfinished parts regarding mesh, like detailed sculpt and underlying skin shader, but the basic color and normal map for the nose and around the eyes is there. This first iteration was done in a few days. I have retouched it a few times since then and I think that final version was done in July last year but I didn’t render it until now. Final hairs are about 2x wider than the original (and realistic measurement) for the sake of faster Arnold GPU render time, which took around 1 hour for 2160x2700pix with RTX 3080.
Final Arnold GPU render:
Hair photo references:
A macro shot of the guard and undercoat hairs:
I had only one day to finish the whole Unreal test, so I used AdvancedSkeleton to create a quick test rig and added a few extra bones for his ears and jowls to create some simple follow through animation. There are just 4 blendshapes (for each side): blink, raised eyebrows, ears rotation, and nostril flare. The animation is also super simple, just a few keyframes. This whole process didn't take more than an hour and a half so the result is not the best but it's enough to bring the model to life for this short test.
Rig and blendshapes setup, and keyframes:
Scene Setup in UE4
Moving everything to Unreal was relatively easy. Everything can be found in Unreal Documentation. I used Jungle Pack assets by PolyAsset3D to quickly build the environment. Lighting is also fairly simple, just a sky blueprint with a few directional lights to fill the environment, a few additional point lights to help with the fur highlights, and fog for atmospheric effect. Differences in the Day and Night scenes mostly come from not using some directional lights in the Night scene.
There is no additional post-production except PostProcessVolume in Unreal which only included some basic tweaking done by my better half @FlatVoxel a.k.a. VoodooFox.
Lighting (for day and night) and environment setup:
Challenges and Rendering Rig
The main challenge was to finish everything in one day and working on my ancient CPU i7-2600K with 16RGB RAM. I had no problems with Groom transfer. I was lucky that my dog is solid black because there is a bit of a workaround for exporting Maya XGen with UVs, but that is a story for another time.
The test was done on RTX 3080 and overclocked i7-2600K with 16GB RAM, which gave me about ~20FPS (unfortunately, I don’t remember the exact number), but with significant frame drops and stutter. The final export was done a few days later when I got my new CPU AMD Ryzen 9 5900X and 64GB RAM which gave me about 30FPS almost without drops or stutter.