Ryan Honey has told us about his working process behind the 1892 Singer Sewing Machine project, spoke about his approach to the topology and unwrapping the model for texturing, and shared how he set up the wooden and metallic surfaces.
Hello! I'm Ryan Honey, a Model and Lighting Artist at Ubisoft Toronto. My art journey started with an interest in Digital Concept Art. My focus was landscape environments and scene composition. I graduated from Durham College with an Advanced Diploma in Game Art. My focus was 3D Modelling, Texturing, and Environment Art. I went out of my way to participate in 3D art communities and challenges during school. I am now mostly working with Snowdrop at Ubisoft and Unreal Engine 5 in my personal work.
A project I recently contributed to was the Ubisoft NEXT 2022 3D Art challenge which I ended up winning! Here are some clips from that:
You can find the whole project breakdown here on ArtStation.
Inspiration and References
After getting the written prompt about the challenge's environment from Ubisoft, I started making a 'mood board' with a bunch of eBay, Reddit, Pixabay, and Google image references. I like to start a reference board using PureRef.
I knew the "Singer 1892 Sewing Machine" prop needed to look antique. The body needed to show wear and clear use. Details like rust drips, scratches, roughness scuffing, and decals were going to be important. I even extracted some details from photographs provided by my friends (model #, metal brand badge). Their name is Clarissa Salati and you can find them on ArtStation as well.
Texture references can be used to generate grunge alphas as well. By bringing these into Photoshop and doing a black and white filter and levels crunch, we can generate some great alphas for sculpting and texturing.
I started with a low poly blockout of the main body that left out all of the little metal functional pieces in Maya. This is an important step to match the shape, volume, and silhouette of the original Singer sewing machine.
I use all of those gathered references to make sure the proportions match. I then brought the low poly of the body into ZBrush to do a high poly detail pass with all of the small-form details like lumps, metal extrusions, scratches, and dents.
I use a library of generated alphas to project and sculpt detail into the high poly. This was the only part that actually required any sculpting. Every other detail came in the texturing phase.
I then modeled all of the metal mechanical bits, a lot of which started as cylinder and gear primitives. I used a library of generated screws, bolts, and nuts to connect these bits to the body.
The more complicated shapes were made using the Create Polygon tool in Maya and then doing a quick auto retopo in Maya for small objects. I used vert snap (V+drag) to center things on the model.
The wooden foundation was made using a cube with a series of bevels and extrusions. The wooden foundation is all one, watertight mesh. The wheel was modeled with a torus primitive, extruded inwards, and subdivided to add curved detail.
The thread was actually just simple cylinders with a generated string texture and a Normal map on it to fake the tiny details of the thread.
The topology of the sewing machine body was the only thing that did not start from a primitive with proper, even, quad topology. After doing the high poly of the body in ZBrush, I drew ZRemesh guide loops all around the model to direct the edge loops for retopology.
I painted areas in blue that did not need a lot of vert density and painted red the areas that would be seen close up in detail to indicate more vert density (PolyPaint in ZBrush). I used Decimation and then ZRemesher to reduce the high poly down to a manageable low poly with no edge spirals thanks to the ZRemesher Guides. I brought the poly count down to a nice medium amount that would function in a real-time engine but isn’t low enough to lose much detail.
As for UVing, Maya's UV toolkit is my choice software. I started with a planar UV projection on all of my models and then manually cut (Shift+X, while the UV editor is being hovered) and sewed (Shift+S, while hovering) edges. I hid seams on corners and spines on objects. If you know your model will only be seen from a certain set of angles, making a UV island out of the bottom of it can get you some great texel density that can be used on other areas of the model. I used the nudge and optimize brushes in Maya's UV editor to rectangulate my UVs as well as I can.
This is an important step in getting the most out of my 1:1 ratio UV map. I then did a packed layout on all objects I believed should have been included in the material UVs. Making a bit of an atlas out of your UV materials is a great way to save on texture memory and texture draw calls in engines like Unity and Unreal. UV atlases in general are really important, especially in environment art.
After packing all of my UV channels, I bring my model into Substance 3D Painter for baking and texturing.
Only the sewing machine body and wheel needed a bake. I typically increase the ray casts during the bake to double what is the default in Substance 3D Painter. I also turn off the self-occlusion of separate objects and perform an ambient occlusion bake separately at the end, if the model needs it.
A great tool in SP is the low poly and high poly suffix settings, if you name your objects accordingly (I use _LP, _HP, and _BF), you can bake without having to do an exploded bake (separating them in world space, baking, then recombining by replacing the mesh with the un-exploded version). This is an important step to dial in and get right so we don't get any bake artifacts.
I set up every Substance 3D Painter project by adding some important fill and filter layers. First, I set normal and ambient occlusion mixing in my shader settings to replace.
Then I added my Normal and AO map to the BOTTOM of my layer stack and color-coded it purple, so as not to get lost in the many, many layers to come.
I did this so that if a bake becomes unruly, rather than spending the time to make a cage mesh or bring it into marmoset for bake painting, I could just paint over top of the Normal or AO map areas that were a problem in SP. A very quick fix. It's a good idea to set any edited normals or AO as an anchor point so you can reference that, rather than an artifacted Normal or AO map.
Use the anchor point as a reference with smart materials and smart masks, rather than the original baked map. Here’s a great video explaining anchor points in SP, and here is a video explaining fixing baked Normals and AO.
At the top of my layer stack, I always have a fill layer that references curvature in the base color channel and set the blending mode of this layer to Overlay with opacity from 40-80. I then do a levels crunch on this and raise the minimum white levels so that the overlay does not make some areas too dark, and rather just makes edges pop. Optionally, I add a blur filter BEFORE the levels crunch depending on the model so that I can control the thickness of the curvature's influence on the color.
Another top layer is a fill layer set to Multiply blend mode, opacity 20-50. This is used in the base color AND height channel. Blur it and levels crunch it to your liking. Set the height opacity really low for this one. Too much (especially if blurred) is going to make it look lumpy. This height information asks for some extra depth to your normals that you can control the intensity of through masking. Here’s a video showing the layer stack and curvature/AO color layers in action:
Below these two top layers, I had a PAINT layer with the base color AND roughness set to Passthrough. This references ALL color and roughness info below the layer. Add a sharpen filter to the color and height channels from 0.3-0.5 intensity. This adds some great detail to the channels, especially when viewed at a distance.
Then, when my "post" layers were set up and my bake is good, I played with some smart material metals I'd authored to try to find a fit that matches the reference. I went with something dark and rusty that had gold procedural highlights (changed from yellow to whiteish).
I added a rust material layer and duplicated it to make a greener version of the rust as well. This was to make it take on the look of oxidized metal which has a bit of a green tinge. This rust has Roughness, Height, and Normal information that plays with the light and breaks up the metal in a way that makes the object look antique and well-used.
Once I got a metal and color I was happy with, I started placing my decals and stamps that I used Substance Sampler to extract. I used photos provided by friends of their own Singer Sewing machine and off of eBay photos to extract decal and stamp details. For instance, the gold floral pattern, the text, and the metal brand logo.
I brought the photos into Photoshop, masked around what I needed, and then imported these (in a 1:1 ratio) into Substance Sampler. I used Sampler to generate PBR channel textures using their AI-powered "Image to Material" function that produces Roughness, Height, AO, and Normal map texture from just one photo. I exported these textures into Substance 3D Painter and then projected them onto my model using planar, and tri-planar projection fill. This let me move the decals around as I wanted to match my reference. A really great tool here when importing decals like this is to use Anchor Points to use these decals as micro detail for procedural materials.
Adding rust, dirt, or grunge to a decal is easy when the smart material can reference the Normal and AO information through an anchor point to procedurally populate the decal.
As for the wood base, I used something with large, obvious wood grain pattern details to match my reference. I wanted to give it a lacquered wood look so I wanted it to have low roughness, and not too much normal information outside of the big, swooping, grain details. Low amount of micro normal and height detail. To show wear on the wood, I used dirt masks and stain grunge to show the wood chipping, adding a Blur Slope set to 1000 division intensity to make small, microsurface chipping onto the edges more believable.
Here is a video that breaks down the Blur Slope node in SP. You can plug in your own grunge and noise maps to the filter to add personalized detail, too.
A final detail was spreading spider webs all over the model. The webs are just folded two-sided planes. The textures were extracted from photos and found online and turned into an atlas of alphas. I edited the UVs of the planes in Maya to line them up with the spider web texture.
After final wear, tear, and scratch pass using roughness and height channels, I exported my textures with Substance 3D Painter's Unreal preset channel packing where we have 3 maps of Color, Normal, and AO+Roughness+Metallic (channel packed).
Setting Up the Final Model and Rendering
The final model was rendered in Marmoset Toolbag's real-time renderer. I lit the Marmoset scene using an HDRI skylight, a depth fog, and a series of point and spot lights. Each camera angle was its own camera in Marmoset with its own Field of View, depth of field focus, and post-process effects (like tone mapping, bloom, vignette, etc.) to best match the camera angle. Here I use Marmoset’s Light Controller to dynamically light a surface based on its normal vector:
I use the ACES color space in Marmoset and SP (also in UE5). Working in the same color space across all of your software better guarantees that you get the same look and feel across each target render. Here’s a video from the amazing William Faucher on how to set up ACES in your Substance 3D Painter project.
I would say that the most important part of creating appealing props is the reference. Doing a study of the prop you're creating and knowing why, how, and what it is used for is important for making convincing details. You never know when someone might be an expert on a specific prop and call you out for something being wrong. Part of realism is knowing the mechanics of how something functions. You have to become a bit of an expert on the item if you want to craft it yourself.
The main challenges for creating a prop are filling in the gaps about what you don't know, or can't find references for an object. For instance, there were many pieces missing from the sewing machine I used for reference. There were also modified parts that wouldn't usually be found on an antique sewing machine piece. Doing the research on the exact make and model of your prop can help. If you truly can't find a reference online for the prop, try using something from a similar model or similar enough make. If it's close enough, you usually can't tell the difference.
The biggest tip I would give to beginners is to keep learning and get more eyes on your work. Join communities where you can share your work and get feedback on it. Many of us in this industry end up staring at an object, a level, or an environment for so long that it warps into something bigger than we can imagine with our limited perspective. We hyperfocus on details that might not fit the overall need and getting more critique is always good.
You may find these articles interesting