Imad Messaoudi has shared the working process behind the Antique Coffee Grinder project, talked about modeling in Blender, and explained the texturing process in Substance 3D Painter.
Hi, my name is Imad Messaoudi, I’m a self-taught 3D Environment/Prop Artist from Algeria. Like many other 3D Artists, I’ve been passionate about art from a young age. I always loved drawing and playing video games. My 3D journey started about 3 years ago when I was watching some 3D animations on YouTube and discovered they were made in a program called Blender. Wanting to learn more I looked into it and came across the now famous Blender Donut Tutorials. I loved the process so much that it became a hobby while I was still studying at university. I would make small projects on the side experimenting and learning for over a year and a half but never specializing as I didn’t know what direction I wanted to take. It’s only in the last year and a half that I decided I wanted to be a 3D Environment/Prop Artist in the game industry and I’ve been working hard towards that goal ever since, learning all the theory, techniques and tools necessary. Now that I am in my final year in university I can finally focus all my energy on bringing this dream to life .
My main learning sources have been YouTube, Polycount, and all the amazing articles here on 80 Level, in addition to some courses from Gumroad and ArtStation.
I have done mainly freelance work as there is practically no industry for 3D art in my country and I couldn’t take any big long-term freelance project since I was still in university, but that’s about to change now that I’m nearing the end of my final year.
Antique Coffee Grinder
Starting this project, I knew I wanted to make something that had a nice balance of materials and shapes and would be fun to model and texture. I wanted to make sure it had a wood material because I wanted to practice texturing wood in Substance 3D Painter. My go-to for finding inspiration and references is Pinterest, that’s where I stumbled upon an image of an old coffee grinder, I really liked its colors, shapes, and texture details so I decided to make it.
Now that I knew what I wanted to make it was time to gather references, this is a very important step in every project but especially in this one since I was going to focus on texturing a lot so finding good references was going to be crucial. We sometimes trick ourselves into thinking we know what something looks like and that we don’t need references but that’s most of the time false, things are usually a lot more complex and detailed than we imagine them. So I made sure to take the time to research and gather as many references as possible from different camera angles as well as trying to find high quality images of the texture details and varying levels of damage. One of my favorite sources for finding references for props like this coffee grinder is eBay as it often has nice high-quality images and the sellers provide details about the product that are useful, e.g. the dimensions.
I also try to see if I can find restoration videos on YouTube which show nice close-ups of materials and can have more interesting camera angles and information on the asset. If I have an interesting reference but it’s too low quality I try to reverse image search it and see if there is a higher quality version somewhere else. Yandex is great at this, I find its reverse image search to be much better than Google's most of the time. Once I have all the reference I need I organize it in PureRef.
My modeling workflow is pretty basic: I go from blockout to high poly, then low poly, and this is all done in Blender with a combination of booleans, traditional SubDivision modeling, and remeshing. While you can do a lot with the modeling tools in the vanilla Blender, I find it lacks some features and there are lots of tasks that can be automated and optimized. To assist me in my workflow I use several add-ons some of which are:
The first step is blockout, here I make sure to study my references and try to match the proportions as close as possible with basic shapes without worrying too much about details. The important thing at this stage is getting the right shape and position of all parts and figuring out the relation between them. This isn’t the most fun part of the process but it’s an essential one, it’s better to take time to get all the right shapes now then rushing into details and finding out later that our proportions are wrong and having to redo things.
Once I’m happy with my blockout, I move on to a more fun part which is the high poly modeling. This is one of my favorite stages of any project as this is where I get to add all the details. I went mostly with SubDiv workflow for this project because I personally enjoy it and since this is a personal project it’s an opportunity to practice modeling.
To start, I boolean all the blockout meshes that go together and then proceed to clean up the resulting mesh. Since in the blockout phase I made sure to match segments between boolean meshes, the cleanup process is going to be a lot easier and result in a cleaner mesh. Afterward, it’s just basic SubDiv modeling, adding support loops where they are needed, redirecting edge flows, and tweaking topology. I made my bevels a little thicker than in the references because I wanted them to catch the light nicely and hold up from a distance. I don’t get too obsessed with getting the cleanest topology, what matters to me is getting nice shading on my mesh that will bake nicely having a few Ngons or triangles here and there does not matter as long as they don’t affect the shading.
Next up was adding text to the wheels and the base. To do that I looked up some font that looks close enough to my reference and then proceeded to add a text object in Blender, write all the text needed, and deform it around a circle.
As for the text on the front of the grinder, I had to make it conform to the surface underneath it, and to do so I used a combination of the Surface Deform and ShrinkWrap modifiers.
Once I have all my text objects in place, I boolean join them onto the underlying mesh and make sure to place the Boolean modifier after the SubDiv modifier. To give the text a nice bevel and make it look like it’s fused to the underlying mesh, I use the Remesh modifier set to voxel (this is like DynaMesh in ZBrush) followed by the Smooth modifier to control the bevel size of the text and smooth out any imperfections and finally a Decimate modifier to bring down the polycount to a reasonable amount. The best part about this process is that it’s non-destructive.
The Remesh modifier is great but it can get pretty slow based on voxel size and so is the Decimate modifier so I would recommend turning them off in the viewport once you find the right settings for them until you are ready to export them for baking.
After this, I wanted to add some edge damage to the wood base, so I decided to take it into Sculpt mode since this is only a small part and it is a basic detail so there is no need to export it to ZBrush this helps save time. I used the Flatten and Scrape brushes.
Once I was happy with my high poly, it was time to move on to the low poly. Because I kept everything non-destructive when making my high poly, all I had to do was to duplicate the high poly meshes and remove the modifiers. After that I added a Decimate modifier set to planer to quickly get rid of most support loops and edges that don’t contribute to the silhouette of the object, you may need to tweak the angle limit based on the object.
After this, I manually get rid of any leftover edges from the Decimate modifier and continue cleaning up triangulating Ngons and remove edges that don’t affect the silhouette as well as any details that can be baked like small screws or holes and small concave areas. Since this was a personal project and my priority was to get a nice silhouette for the closeup camera shot, I was pretty generous with the polycount.
Blender is great for many things but UV mapping isn’t one of them. I find its tools to be outdated and lacking some basic functions. You can fix some of that with add-ons, but I prefer to use RizomUV which is a standalone UV mapping tool.
Before exporting to RizomUV, there are a few things I had to do in Blender. First, I made sure to set AutoSmooth angle to 180, select all the hard edges, and mark them sharp. After that, I set all those sharp edges as seems, select all, and hit U to unwrap so when I export to RizomUV, I don’t have
to reselect all the hard edges to make UV cuts.
Because I wanted to get nice high-res details on my textures, I decided to go with 2 texture sets for this project one 4K for the main body and a 2K set for the wooden parts. I made 2 materials – “body” and “wood” and assigned them accordingly in Blender.
Once that's done, I’m ready to export, and to do so I use the Bridge add-on which makes it quick and easy to export/import between RizomUV and Blender. I export objects of one texture set at a time, so starting with the body, I select all my objects and simply hit Export.
In RizomUV, it’s just a matter of adding some cuts where they make sense trying to cover as much of the texture space as possible while also minimizing seams.
I always try to align and straighten my UV islands whenever possible, this will result in a tighter pack using more of the texture space as well as getting nice bakes since non-straight UV islands cause aliasing in the baked maps and this is a problem.
Since I knew that in the texturing phase I would be adding directional details on parts like the wheels and wood grain on the wooden parts needed to follow a specific direction, I made sure to align my UV islands accordingly. To help with that, I imported a wood grain texture to RizomUV to better visualize the direction of my islands. I also scaled down some UV islands that won’t be viewed often and scaled up some others to increase their texture resolution.
Finally, once I’m done cutting and aligning all my UVs, I pack everything. r
RizomUV’s packer does an incredible job at packing everything tightly, I rarely have to do any manual adjustments, compared to the default Blender packer it’s a huge improvement. After this, I just hit Import using the Blender-RizomUV Bridge add-on, import the UVs, and that’s it. I repeat the same process for the remaining objects of the second texture set.
For the baking process, I like to use Marmoset Toolbag because of its quick loader that loads each of the high poly and low meshes into separate groups that don’t affect each other unless specified otherwise, so I don’t need to explode my mesh. I also use it because of its Paint Skew and Offset tools which allow to quickly fix baking errors.
I did bake a couple of masks for the letters and pattern on the wheel to use in texturing, this was done in Blender because it’s a simple bake.
Getting to texturing which is my favorite part this is where I get to bring my asset to life, I used Substance 3D Painter. It’s been my main texturing tool for the past 5 months, before that, I was using Blender because I didn’t have a PC that could run SP. It wasn’t the most optimal way to texture, sure there is a lot that can be done in Blender but it’s just too time-consuming and tedious. Switching to SP made my texturing process so much more enjoyable and efficient.
Before starting the texturing process I take time to carefully study my references and break down all the texture details and materials that make my asset and gather additional references if needed. It’s also a good idea to research these materials to see how they are made and how the texture is affected with time.
Most of my materials were made from scratch. To start I assign a base fill layer to all the different materials and give each a basic color. Afterward, I begin with the orange paint material adding some normal/height variation, more will be added later this is just a base.
Then I proceed to add some variation to the base color by experimenting with different grunge textures and colors trying to match my references.
Afterward, I add several layer of imperfection like smudges, spots, scratches, and deposits grunge varying color, roughness, and normal.
So far, the imperfections I added were mostly subtle, so I added more heavy dirt and dust layers.
For the sticker, I used the Projection tool, painted them, then did some additional adjustments to make them look old.
Throughout all these steps I like to add painted details with Stencils to make my details more unique and interesting, breaking up the procedural look from all the generators and smart masks.
Moving on to the wheels' metallic parts, it’s pretty much the same workflow as the paint. I start with adding color variation, then some Directional Noise, followed by rust and surface imperfections.
As for the wood parts, I started by looking for a good wood texture that best matched my reference to use as a base. I also made a few woodgrain stencils in Photoshop to add some unique details. I began by adjusting the HSL of my base texture and deriving roughness and height from it, then adding a few layers of color and value variation using different grunge textures, and painting in extra details manually with stencils followed by dirt, surface imperfections, and edge damage.
To better sell the look of an old coffee grinder that has been sitting unused for a while, I decided to add spider webs. I remembered watching a tutorial a while ago on adding spider webs in Blender so I followed a similar workflow. Starting with an alpha texture I mapped to a plane then cut out some parts of the spider webs from the plane and placed them on my asset where they made sense. When done, I joined them all into a single mesh and exported it to Marmoset Toolbag.
Lighting and Rendering
This is a very important stage as the right lighting can make all the details pop and bring the model to life, while poor lighting can ruin texture details and make the model look dull and boring, so it is crustal to take the time to properly light your model.
For the rendering, I decided to go with Marmoset Toolbag as I find it pretty quick and simple to set up a scene. After importing my asset I first start by setting up my camera angles, making sure to set the tone mapping of each to ACES then put each in a separate folder because I know I will be making different lights for each shot so this helps organize the scene .
Afterward, I add a shadow catcher and set my render mode to ray tracing, I set my samples in the viewport to a low value between 64-128 and denoising between 0.3-0.7 for better performance than in the render output. I increase my samples and keep the denoising pretty low like 0.1 for the best quality as the denoiser tends to blur a lot of the details at high values.
I use a pretty standard 3-point lighting setup, I start by adding a Sky HDR for the ambient light and I make sure it’s fairly even in light intensity so no strong Directional light sources, and has neutral colors something like an overcast sky, I set its intensity to a low value so it doesn’t conflict with the lights I’ll add later and doesn’t washout the texture details.
Next, I add my key light which in this case is a Spot Light with a rectangular shape. I increase its size a bit to get nice soft shadows then play with different angles trying to get interesting highlights and contrast. There is a nice new tool in Marmoset Toolbag 4 that can make this process quicker it’s the “light controller” tool. It allows you to simply select a light then click on an area of the model to get a highlight there.
Afterward, I add a Fill Light which is also a Spot Light with a bigger size than the key light and smaller intensity to bring more soft light into dark areas without competing with the key light.
Then I add a couple of Rim or Back Lights to better separate the asset from the background, and with this my basic lighting setup is complete. Now I look to see if there are any flat areas that can be better defined or details I want to emphasize and add some extra lights accordingly keeping the intensity subtle so they don’t compete with the key light.
I repeat the same process for the other shots. Once I’m happy with my lighting, I render and export in 16bit-PSD with transparency and move on to post-processing in Photoshop because I have better control in it so I don’t add any extra post effects in Marmoset.
My post-processing workflow for this project was pretty simple, starting with the background I personally like dark backgrounds, so I used a dark blue color with a vignette and added some particles. Then I adjusted the exposure, contrast, and color balance of my render adding a bit of sharpening as well. I also painted some soft glow around the asset to better separate it from the background and create more contrast. Finally to add some glare and bloom I took my raw render I exported from Marmoset into the Blender Compositor and using its Glare node I exported only the glare and bloom and in Photoshop I gave it a black mask and added it only in some areas. And that’s it, I also repeated the process for other shots.
This has been a really fun project. I got to experiment and learn new techniques in Substance 3D Painter, improving my texturing skills along the way. Although looking at it now there are multiple things I could improve, I’m overall happy with the result, this has been a great learning experience and I can’t wait to apply what I’ve learned to my upcoming projects.
You may find these articles interesting