Breakdown: Bringing to Life Moș Ifrim From All Sails Up in 3D
Sriram Venkatesh shared an in-depth breakdown of his Moș Ifrim project, detailing how the body was sculpted from scratch, how he textured the character with the intention of showing his story, and how he gave the props their wear and tear.
Introduction
Hello! I'm Sriram, and I'm a 3D Character Artist for films and high-end cinematics. I currently live in Bahrain, but I'm originally from Mumbai, India. Art was always an integral part of my life.
Growing up, I spent a lot of my time sketching and painting. I discovered 3D during the pandemic and, like many, started with the Blender вonut, but I didn't really commit to learning 3D. It was more of a side quest.
2 years later, I graduated from college and realized how much I wanted to pursue 3D and potentially fulfill my dream of creating something that would be part of a film. So then I decided to enroll at Think Tank Training Centre with the long-term goal of making my own short film one day.
I don't think anything could have prepared me for how much I was going to learn, and I can safely say that almost all of my 3D knowledge comes from the people I met at Think Tank.
Today, I'm going to talk to you about my final project at Think Tank, my mentorship with Claudio Tumiati: here's my journey creating Moș Ifrim, an old lighthouse keeper.
Moș Ifrim
For my final project, I knew I wanted to improve in 3 areas: realistic anatomy, grooming, and texturing/surfacing. I spent a good while looking for the right concept, and when I came across Iulia Grosu's illustration of an old lighthouse keeper, I was intrigued by all the small storytelling elements of the character and felt like the props had great potential to stand out as hero assets. My mentor and I decided to go ahead with the concept because it ticks all the boxes: a great balance of anatomy, props, and storytelling.
A little bit about the character himself: Moș Ifrim is an old lighthouse keeper from the book "All Sails Up" by Radu Tudoran, set in the 1800s. He looks after the lighthouse where the Danube River flows into the Black Sea. A liar and a drunk, he trades fish and other items to feed his alcohol and tobacco addiction.
He helped pirates by turning off the light in the lighthouse so that they could hide their ships and trap other ships to loot them. His drunk ramblings often get him in trouble, earning a blow to the face or two, especially from his wife. Probably not the most reliable fella to recruit for your crew.
Inspiration and Preparation
For this project, I was mainly inspired by the Armored Core and Crossfire episodes of Secret Level, certain Diablo cinematic trailers, the Bad Travelling episode on Love, Death & Robots, Dune, and certain Magic: The Gathering cinematic trailers.
I dream of being a part of the teams that created Secret Level or LDR, because their visual style, cinematography, and fidelity resonate with me a lot. I imagined Ifrim in a similar series, and this kept me motivated and excited to bring him to life.
During my main reference hunt, I also decided to ask Iulia (my concept artist) for some of the main references she used to make the illustration. I recommend doing this if you can, so you can get a good head start. It helped me a lot to see what she was looking at to better understand her design choices.
You may have heard this before, and it's for good reason: always get good references before you do anything. Going in blind will affect the quality of your work dramatically, and I speak from experience.
I spent a few days gathering references, and often added more as the project developed. I also like to search for episode stills and mood/art style references in Shotdeck and ArtStation, which I keep in a separate PureRef file that I visit often for inspiration and quality checks.
Some other notable resources for me would be the Anatomy for Sculptors books and the gray-shaded images on the 3DScanStore website. These are especially useful because they help us understand form changes and shapes better, which is invaluable when aiming for realistic sculpting.
Since one of my goals with this project was to fine-tune my anatomy, I decided to start by sculpting the body from scratch. While it's likely that every studio will provide its own human base mesh for you to work on, I wanted to pay attention to the body's primary forms and proportions and learn as much as I could in the process.
These forms dictate how the rest of the sculpt will end up and how the clothes will fit on the body, so I put in a lot of love and effort, even if you don't see the full naked body in my final renders.
For the head, I wanted to follow a loose likeness of an old Rutger Hauer. I felt that his pronounced eye bags, crow's feet, and thin lips matched the vibe of the concept pretty well. I took some liberties and modified some shapes here and there, since I wasn't going for a perfect likeness.
Wrapping the Body
After I was happy with an initial pass of primary and secondary forms, I moved on to wrapping the character using ZWrap. I wrapped the body and heads separately with 3DScanStore meshes. I wanted to have more control over the details of the face, so I used 2 different Displacement Maps in ZBrush. I created a layer for each of these, and then a morph layer to blend/omit parts of each map as needed.
I then added a final layer on top of everything, where I sculpted some wrinkles manually and emphasised some of the scan wrinkles. I made my own cornea/sclera, iris, and pupil meshes. The iris has a displacement applied, and the cornea is masked out from the sclera to allow for the refraction, but I'll explain that in more detail when I get into the shading aspect of the project.
As for the rest of the body, I focused on each part one at a time and worked my way down the body. For me, it's important to take my time with this stage, since anatomy can be quite unforgiving. Not rushing the anatomy part meant that I spared myself the frustration of going over my work later, since I put in the time when it mattered most.
My advice here is to listen to yourself. If something doesn't feel right, listen to your gut patiently, and don't be afraid to go back 2 steps if it means you'll be able to go 4 steps forward later. While I didn't have unlimited time, I tried to balance the level of detail and the time I had for each section of the body versus how important they'd be for the outcome.
Another thing I learnt was that it's not enough to pay attention to the bony landmarks of the body. It's also very important to think about how the bony landmarks react with the skin and fat on top. I think this is one of those things that makes anatomy sculpts feel real, while young skin is tighter and hugs bony landmarks closer, older skin is much more elastic and can even hang from them.
My favorite brushes are Move, Move Topological, Clay Buildup, Standard, Dam Standard, and Knife (a sharper version of Dam Standard for finer, controlled wrinkles). And probably the most important thing I have learnt is to always work in the lowest subdivision level possible, and only go up when you can't make any more adjustments where you are. Sculpting on meshes that are too high in resolution can result in lumpy and inaccurate, hard-to-manage forms.
The Clothes
I blocked out the clothes in Marvelous Designer, and then retopologized them in Maya using Derrick Sesson's Marvelous Designer Retopology Tool. It's a great tool to get sensible topology on your cloth, especially if it has a complex pattern. I also had a lot of 3D scan references for clothing/cloth folds, which helped me refine my cloth anatomy in ZBrush later.
I studied the weight of the cloth in various points on the body, as the direction and the type of folds that occur in those places can vary. A nice brush I like to use for this sometimes is the Cloth Nudge brush (hotkey: BCU).
This is useful to add weight at certain points of the cloth, before sculpting over with the Standard brush. I made the torn fibers with a slightly modified IMM Curve brush, and then refined them a bit with the Move brush to get the right shape and feel.
I made the embroidery on the shirt with Substance 3D Sampler. I drew the alpha in Photoshop using a reference from Iulia's PureRef. I imported this alpha into Sampler as a Bitmap to create my embroidery patch. I then used the same alpha as a mask for a plane in ZBrush, and also applied the Displacement Map for the stitches as noise.
Afterwards, I used the Project brush on the individual patches of embroidery to conform the planes onto the rim and shape of the shirt. Finally, I subdivided the planes and then applied the Height Map of the stitches so that they would protrude from the shirt's surface slightly. In the render engine, I used the embroidery's Normal Map to enhance the detail.
The Lamp and the Basket
I modeled the basket and the lamp directly in Maya and then later brought them into ZBrush for various adjustments. For the lamp, I polymodeled the parts in Maya with a set of references I found on an antique site, and then brought it into ZBrush to create the scratches, dents, welding details, and other surfacing details. I UV'ed the parts before bringing them into ZBrush to speed up extracting displacements later.
The basket, on the other hand, I created almost fully using sweep meshes in Maya. I first blocked out the general shape of the basket using a cylinder, and then added a bunch of horizontal edge loops for the strands of the basket.
I extracted these edges as curves and then adjusted them to get the shape. The reference I was following had differently sized branches, so I had to create different sweep meshes for different groups of curves.
Finally, for the smaller parts of the basket, like the stray twigs and the metal wires, I manually placed the twigs and added another sweep mesh for the wires, drawing the curves with the EP curve tool and Live Mesh.
I then took the model into ZBrush to introduce some broader imperfections and also to sculpt the bark ends on the twigs. The actual surfacing and bumping of the wood was done in the engine, which I'll go into later.
I had a similar workflow for the onion bag, except that I first blocked out the shape in ZBrush and then drew the curves on that mesh instead and converted them into sweep meshes.
The rest of the assets I made in ZBrush and UV'd in Maya, then brought them back into ZBrush for extra sculpting passes. With the shoes, I learned how important it is to distinguish which details should be part of your sculpt and which should be done in texturing, since I had to go back to correct the shoes' primary forms after having focused too much on the tertiary details that convey the damaged, worn feel.
Before finishing the high-poly stage, I made sure to retopologize everything so that I'd have clean edge flow, no N-gons or weird poles, and no pinching on my hard surfaces. I also decided to keep the head and the body separate meshes, as it gave me more flexibility in stages further down the pipeline.
I UV'd all my meshes before the high-poly stage, as I needed to extract displacement. Depending on the meshes, I laid the UVs across multiple UDIMs to get the most out of my meshes when texturing.
I set the displacement up here so that it'd be easy for me to implement sculpting changes I make down the line. It would also help me while texturing to see how my sculpted detail would react to my textures.
Since I'm using V-Ray as my rendering engine, I used the VrayDisplacement node and exported my maps from ZBrush as 4k 32-bit.EXR files for maximum detail. I realized some meshes were pixelated when displaced, and this was because I didn't have enough UV space to capture the sculpted detail.
To fix this, I re-did some of my UVs, which went quickly because I had already retopologized my meshes. At this point, I also set up my studio lighting rig, where I used the Studio Tomoco HDRI from Substance 3D Painter and manually placed rect lights.
Texturing
After setting up my displacement, I gathered the meshes I wanted to import into Substance 3D Painter. I decided that clothes, the body, pipe, knife, and belt would be in one file, while the onions, lamp, fish, basket, and onion bag would each be in separate files. Having them all in one file would be too much for my machine to handle.
I made a separate project for the body and the head to do some cleanup for the 3DScanStore albedo textures in Mari. I painted over some of the artifacts I got from wrapping my textures, which tends to happen around the corners of the mouth and eyelids. I like to use Mari for cleanup here because I can work easily in 8k and export it without any loss of data for Substance 3D Painter.
In Substance 3D Painter, I set the environment to Studio Tomoco, my working colorspace to ACES, and adjusted the focal length of the camera to 65mm. I then bake all of my meshes by mesh name, as it helps me to avoid strange artifacts with meshes close to each other.
I first try to pin down what kind of story I'm trying to tell with my textures. Ifrim is an alcoholic, smokes tobacco, is often out by the shore, and neglects to care for his belongings. What helped me communicate these details in my textures was to think thoroughly about the history of each asset and what it had been through.
I then gather references according to the level of aging I want to achieve on an object, and then I use that information to try and build up the wear and tear chronologically. Texturing is something I really enjoy because it gives me so much freedom to really bring an asset to life. Here are a few layer breakdowns for the jacket, lamp, and face.
I kept testing my textures in V-Ray under the neutral lighting rig I set up earlier, while simultaneously working on the shaders. It was just as fun as it was challenging to work on a lot of different materials:
- Skin: I used the VRayAISurface Shader, which does a lot of the heavy lifting when it comes to generating realistic SSS. I plug my roughness and specular maps, with a tiled micronormal, and then the diffuse is plugged into the SSS Mix and base color slots. I then create a VrayBlendMtl and plug the base skin shader into it, and then layer the sweat material on top. This gave me a lot of flexibility and control while iterating on the textures and the masks.
- Fabric: I gave each cloth a different material. It was important to play with the sheen and how the fibers of each fabric react to it. While I gave some meshes a bump map, I used a tiled displacement for the jacket and the pants that I blended with my sculpt displacement, as I thought it broke the roughness up in a more realistic way. Similar to the skin, I created different blend materials for all of the clothes to have more control over things like dirt, wetness, and sand.
- Metal: For the lamp, I played with the roughness and the base color the most to get the effect I was after. To make things easier, I modified the values of the maps in the shader using a remapHSV node, and now I don't have to jump between Substance 3D Painter and V-Ray all the time.
- Fishes: I used a regular VrayMtl and played around with the fresnel to get the sheen. Additionally, I enabled some SSS and clearcoat to sell the wetness and fleshiness of the fish.
- Eyes: As mentioned earlier, I made the eye with 3 parts, the cornea/sclera, iris, and pupil. I gave the pupil a black material, while I assigned a VrayAISurface shader to the iris. For the cornea/sclera, I gave it a VrayBlendMtl with the cornea masked out to leave only the refractive material, and the sclera is a VrayAISurface shader with the diffuse plugged in the same way as the skin.
- Onions: I used a similar approach to the fish, but without the Fresnel modifications, and mainly just playing a bit with the SSS and roughness. For the base color, I also decided to make them purple instead of brown/yellow to break up the overall color palette a bit more.
- Wood: For the basket, I made a blended material with the base wood texture as well as the wood grain in the bump. I layered another Bump Map to introduce the little spikes that occur in the wood. The final layer that I assigned is a sand layer, which goes on top of everything. Lastly, I made the base color lighter and more saturated than the concept for the same reason as I did with the onions.
It took time to iterate on my textures and surfaces because of how long I had to wait for test renders. This definitely slowed things down, especially when testing on expensive materials like the skin, fish, and onions.
Grooming
To make the groom, I used XGen. Before starting, I always like to refer to the Hadi Karimi XGen Tutorial to remind myself of how to approach making a realistic groom. What I've learned with Ifrim's groom is that a good groom mainly relies on how many guides you have and how well you sculpt them to get the result you want.
After I introduced the clumping modifiers, I stayed there and kept adding/sculpting the guides until I was happy with the overall shape of them. I like to use the noise, cut, and coil modifiers at various intensities, and I applied the same workflow to the other descriptions in my groom. I also like to split my descriptions when there's a sudden change in the flow, shape, and/or density of hair.
Another useful tip is to draw over your reference image and trace the clumps of the groom. This helped me to visualise my guide shapes a lot faster and accurately. Lastly, I made sure to enable the colored clumps setting every now and then to check if my clumps were crashing–this is something that I try to avoid as much as I can.
For the hair shader, I assigned a VrayHairNextMtl with a color ramp that I mapped to a DistanceAlongStrand parameter, which I plugged into the base color. The shader comes with a color randomizing function, so I found that useful to get some color variation right off the bat. I made the moustache groom use the same setup, but with different colors on the ramp.
For the wet hair strands on the side of the hair and the forehead, I decreased the roughness and increased the glint strength, and placed some water droplets manually in the beard.
Lastly, I did all of the micro fur/fibres on the clothes and the props with V-Ray's procedural fur system, VrayFur. This is a great tool for procedural fibers on any mesh. It has a lot of parameters that offer great customisability with realistic results.
Posing, Lighting and Rendering
After grooming, I decided to pose him, and this was a relatively straightforward process. I took my meshes from Maya back into ZBrush and used the transpose master to pose him, as well as fixing any strange deformations from posing.
In order to transfer the pose back to my A-pose character in Maya, I imported the meshes back in and added a blendshape for each mesh I changed. This allowed me to iterate non-destructively and check how the poses held up in my renders.
This is another part of the pipeline I enjoy almost as much as texturing. I knew that I really wanted to push the renders to look like a frame from the episodes of Secret Level or LDR, so I picked some of my favourite shots from my reference board and tried to match their lighting, framing, and/or moods.
To achieve this, I placed a lot of rect lights and light blockers in specific positions to mimic the way light falls in my reference shots. In some of the renders, I used assets from Quixel Megascans to construct the environment.
I made each shot a completely different group in my Maya scene, each containing different lighting rigs, environment assets, and camera settings from the other. In each camera, I also used an Aperture Map to control the bokeh shape in my renders.
A general rule of thumb I like to follow is to always frame your shot on the darker side of a portrait. This is how you generate strong shapes and silhouettes with your lighting.
To save myself some render time, I used V-Ray proxies after I had finished posing on certain assets or groups of assets that were quite heavy. This reduced my render times by a lot, but it still took 1-2 hours depending on the frame.
Finally, I added some film grain in Photoshop using the built-in noise and blur tools, a slight vignette, and some color grading touches to get the right mood. I did camera effects like lens flares in the V-Ray Frame Buffer, which has some great tools for this.
Conclusion
Words cannot describe how much I have learnt during this project. I spent around 6-6.5 months bringing Ifrim to life, and in hindsight, I could have brought that down a bit more had it not been for all the troubleshooting in between, as well as some better project/workflow management. Nevertheless, I feel happy and thankful to be on the other side of this project.
My advice for artists starting is to try and surround yourself with people who are just as driven as you are. You'd be surprised by how much you learn, grow, and get inspired when you work with people who love what they do. It's also important not to be afraid to ask for feedback from people you look up to, and eventually, to look for ways to improve your work on your own.
Last but not least, be kind and respectful to each other. We judge ourselves the harshest, and it goes a long way to show someone the same kindness and respect we would like for ourselves.
A huge thank you goes out to Amber Rutherford for this opportunity! I'm truly grateful to be able to share what I've learnt with a wider audience. Claudio Tumiati, my mentor for this project, was invaluable in helping me to improve at every step, and I thank him for his knowledge, patience, and commitment to getting the best out of me.
I also want to thank my dearest friends, Aitziber Azkue, Alfonso Zambrano, Cyrus Kian, and Pontus Bengtsson for their constant love and support. If you would like to keep up with my journey, please consider following me on Instagram, Artstation, and LinkedIn!