Gemmy
Introduction
Hello everyone! My name is Robin Mariančík and I am a 25-year-old 3D artist from the Czech Republic. About half a year ago I finished a double degree master’s program in Ostrava and Cieszyn. Shortly after that, I had the pleasure to work as a freelancer with NVIDIA on projects like Digital Twins and Racer X.
Project
As it is with most of my projects, Gemmy is based on a reference I found on the internet, namely Pinterest. At first sight, it might look like a gun, but it is in fact an antique Japanese photo pistol from around the year 1950. Its peculiar design and inner mechanism immediately caught my attention, so I decided to try my hand at recreating it.
References
References are one of the most important parts of creating something believable. Usually, the more and high-quality references you have, the better. With Gemmy, I went only with references to the pistol itself, as it had decent wear and tear, plus the image quality was not terrible.
Had I wanted a different final look for the project, I would have definitely gathered more references, but for this one a few pictures were satisfactory.
Modelling in Moi3D
As the main modelling tool, I used Moi3D. It is CAD software, which allows you to model without worrying about topology as you would with polygonal modelling. Although recently I adopted a workflow in Blender with Boxcutter, Mesh Machine and Machine Tools addons, which can make modelling with polygons quite similar to CAD software in terms of not having to worry about topology as much.
I won’t be talking about this workflow here, as it is not what I used for this project, but in case of interest, I recommend a video from Joshua Gambrell’s channel, who explains the aforementioned workflow.
The modelling process here is pretty straightforward, if you’re lucky with your references like I was, you can just trace the silhouette of the object. From there it was just eyeballing the rest of the proportions and trying to make the model as close to the reference as I could.
In the images below you can see the final version of Gemmy in Moi3D. You may notice some of the parts don’t have any fillets (Moi word for chamfer/bevel). It is because it would have been too time-consuming to try and figure out a way for them to work on some of the complex boolean parts. You can easily create all those fillets in ZBrush, which is an inevitable part of the workflow anyway.
Detailing in ZBrush
Moi3D has an excellent exporting solution for polygons. All you need to do is select all the parts you wish to export, go to file>export, name your file and select OBJ. file format, click save and a setting window will pop up. I usually change the file output to quads and triangles and change the “divide larger than” to a value between 0.01 – 0.1.
The lower you go, the denser your mesh will be. The desired amount is the amount, which won’t leave any visible faceting during the Dynameshing process in Zbrush.
Once you import your model into ZBrush, you’ll need to Dynamesh all the parts you wish to work on. Thanks to Dynamesh you can also create all the missing fillets. When Dynameshing I usually start with lower resolution values, if a lower value isn’t dense enough to keep all the shapes, I go back with ctrl + z, increase the resolution and try again, until I reach a resolution that will maintain all shapes.
When you get to the desired resolution, you can apply polish, which will smooth out the mesh and create fillets in all the sharp corners. (You can find Polish in the Tool palette > Deformation > Polish).
In case the polish feature is smoothing unwanted parts, or you wish to create a variable fillet, you can combine it with Store Morph Target and apply it only locally. For example, what you can do is save the Morph Target before applying polish.
Then after polishing, you can paint out the fillets with the morph brush, or switch the whole Morph Target and paint the fillets locally.
The rest of the ZBrush work consists of detailing, which means sculpting in various wear and tear and really trying to break the whole perfect CG look by introducing imperfection. Here I focus mostly on making things slightly crooked/misaligned and breaking the uniformity of edges.
For the diamond pattern, I used Substance Designer. I basically created a simple alpha mask, which I then used for making an extrusion in Zbrush. For such a simple pattern you can also use software like photoshop, or illustrator, but I wanted to use Designer, as it was easier to make the pattern slightly imperfect by adjusting a few values.
I usually assign Polypaint color by all the different materials during the modeling process, as I prefer to have those parts visually separated, but if you’re someone who prefers to work on a monochromatic mesh, assigning Polypaint as the last step is also important, because we’ll use this information during the baking process.
Retopology and UVs
In the preparation for retopology, I combine/separate all the different subtools based on how I plan to retopologise them and name them uniquely with the _high suffix. This also prepares the high poly for baking. After that, I export the high poly as FBX and import it in Topogun 3.
It is possible to use the Moi3D exporter to create the low poly. If you play with the settings enough, you can get a good base. That base would need some fixing to make it a viable low poly anyway, so I usually do most of the retopology by hand in Topogun, as it feels faster to me, rather than fixing all the export issues. In some cases, it might be preferable to do it this way though, so it’s good to keep that option in mind.
While doing retopo, I pay attention to silhouettes, I want to keep them smooth from the distance I plan to make renders, so no faceting will be visible. Otherwise, this process is very automatic, it’s the part, where you play some DOOM music and just do it until it is done.
When the retopo is done, I name all the parts in a way that they correspond to their high poly counterparts with the _low suffix and export them from Topogun. Import them all in a modeling software of choice (3DsMax, Maya, Blender…).
For UVs I use RizomUV, which is a software designed solely for doing UVs and will possibly make you love doing UVs as they are pretty quick once you learn the software (Official RizomUV YT Channel – Good for learning the software).
I highly encourage anyone, who uses RizomUV to download a bridge for your modeling software, as the constant back-and-forth exporting hassle can be pretty painful in the long run.
The general approach for UVs is to make the least number of cuts possible, while not going overboard with stretching (A small amount of stretching is not a problem). The feature I use probably the most are constraint tools, which help unwrap your islands in a straight way, so they can pack better.
Another favorite feature is TopoCopy, it is very useful when you have many identical or similar parts and you want to unwrap them all at once. All you need to do is unwrap one, click the button and the rest will unwrap based on that.
RizomUV is full of great features like that, some of which I probably don’t even know about. Therefore, if you want to learn more about RizomUV, I recommend their previously mentioned YouTube channel.
Baking
I do all my baking in Marmoset Toolbag 4, if you have everything set up correctly, most of the time it is a very quick process. To save some time for every time I have to bake something, I made a template scene, which opens every time I launch Marmoset. This way I have all the settings I’ll mention in the following paragraph ready for use and don’t have to set them up every time.
To bake something, you have to click the toast bread button in the scene window. This will create a baking project and shows you all the various settings for it. For the default template, the maps I use are Normals, Normals (Object), Position, Curvature, Ambient Occlusion and Vertex Color.
I have the checker mark off for Position and Vertex Color because these maps need to be baked with a different setting. I set the default texture size to 4K (this is up to you) and samples to 64x.
Then set the ray count for Ambient Occlusion to 1024 and I like to keep the Two-Sided option on as it helps prevent some baking issues sometimes (Note that it can also cause them). I also have lighting presets in the template scene as well as a backdrop object, as it is something I use often. Plus, a camera with my favorite settings. To save all these settings as a template scene, go to Edit>Templates>Set Template Scene.
Now for the actual baking. To import the high poly and low poly I use the Quick Loader option in the baking settings. For the high poly, I use the same file I exported for Retopo, as it has everything I need.
For low poly, it is important to use the file exported from the same software, where you will also be exporting the final low poly file, so the triangulation stays the same and no shading artifacts will occur. I like to do bakes on a triangulated low poly as it also helps prevent shading artifacts.
After loading both HP and LP FBX. files, Marmoset will assign all the different corresponding parts to their own groups (If all the naming is correct). Then just hit the bake button, click on the preview button and see if the bake is clean or not.
Marmoset has great tools for editing the cage of the low poly, or the normal skew. You can access these tools by clicking on the “low” folder under the part
you wish to edit.
There you can adjust the overall cage with a live preview, or paint the offset and/or skew locally. These tools can help you mitigate some of the most common baking issues, but if they don’t, Google is always a good friend (For more in-depth baking tutorials go here).
As I mentioned before, Position and Vertex Color need to be baked separately with different settings. The position is a map I use only when texturing in Substance Painter, as Marmoset Toolbag doesn’t use it for texturing as far as I know.
To make this map work, you need to change the format to a 16-bit channel, if you don’t do that, some of the mask generators in Substance will not work correctly. For Vertex color, go back to the 8-bit channel and change the samples to 1x, this will assure there is no blending between different material colors and the transition will stay sharp.
Also don’t forget to uncheck all the other maps, while you’re baking Position and Vertex color!
Texturing
For texturing I use both Marmoset Toolbag 4 and Substance Painter. This really depends on, if I will need certain features to achieve the desired look. In comparison to Painter, Marmoset feels quite a bit faster and you get a better preview of the final result.
If you’re doing your final renders in Marmoset, the preview is 1:1. But also from my experience of importing into Unreal Engine, all the textures look just like they did in Marmoset to me. Since Marmoset team added stencils into their beta recently, pretty much only features I miss in Marmoset are anchors and some of the processing filters which go hand in hand with anchors like slope blur.
Since I used Marmoset to texture Gemmy, I will be talking about this workflow here. I will not be explaining the basics and setup, as Marmoset has great tutorials for all that on their website. Most of the time I use ACES tone mapping in my renders (ACES is also used by default in Unreal Engine), therefore I turn on this setting during texturing as well. You can find tone mapping in the camera settings.
At the start of every texturing, I like to assign all the base materials and only then start working on details. One thing I love about Marmoset is the layer nesting feature. I adopted a workflow from Georgian Avasilcutei, where you don’t use groups, but nest all the layers together.
Hopefully, you can see what I mean in the picture below. You can attach a new layer to a layer, which will constrain its information based on the layer it is attached to, essentially masking it, just like you would with a group. This works for both regular layers and mask layers, which makes the texturing very flexible and comfortable. And it is also a good way to organize your project.
After I create all the base materials, I start nesting in all the details, while closely observing references.
I really like to achieve a unique look for all my assets and try to avoid making the textures too generic. This means I do a lot of manual painting, either by painting in detail or painting out details from generators or grunge map masks that don’t make much sense on the model. One great way to achieve uniqueness is stencils.
It is really easy to create your own library from photos. For using stencils, I recommend this tutorial by Rick Greeve (Although it is for Substance Painter, for Marmoset it will be really similar though).
One last tip I’d like to share for texturing in Marmoset is to use the viewport quality modes.
There are two: Fast and Full.
If I want to paint on my layers without any lag, I use the fast mode.
This mode has one disadvantage though, if you want to switch between layers, Marmoset will take a while to process.
This especially becomes notable, if you have a lot of layers in your project. So, if I want to for example find a certain layer, or change some slider values, I quickly switch to the full mode, which won’t be pre-processing every time I click on a new layer.
Presentation
The final presentation was done in Marmoset Toolbag 4. Probably the first thing to do is to set up your camera. The camera values I will mention are of course a matter of personal preference and you can change them however you want.
For the field of view, I like to use lower values, somewhere between 10-15. This will make the perspective less apparent, I really like this look, but it might not necessarily work for every asset, so feel free to experiment here. There is of course no need to keep this value static and some renders can have variable FOV.
Even though it might not look like it at first sight, I like to use depth of field in every render. I always keep this at least slightly apparent, as it gives renders a more realistic look. Another good value to change is Chromatic Aberration under the distortion tab. This value I keep this at 0.06 and don’t usually fiddle with it. What it does is, simulates what a real-world camera does. It basically shifts the RGB channels and creates a blue-green-red tint on the contrasty edges of the image.
Sharpen is another value I like to change. This really depends on the project, for gemmy I used a value of 0.5. Bloom is very much a personal preference, as I dislike renders, which have this value set too high. This is why I keep this one pretty low. Brightness value at 0.03 and size at 0.063.
The vignette really depends on the whole composition, sometimes it works, sometimes it doesn’t, but nearly
always I like to keep this one subtle too. And lastly, grain is a great way to make your renders look a little bit less CG. For Gemmy, I used digital grain with a value of 0.07.
For lighting I use the good old rule of key, fill and rim light as a base and always change the diameter setting to create softer shadows. After that, I start adding other lights, which usually aren’t as bright. These lights often serve the purpose of highlighting an interesting detail. In this phase, I like to experiment a lot.
A good tool, which can help with that is the light controller tool, which shows up after you select a light in your scene. With this tool you can move the light by clicking on your object, this will position the light perpendicular to the part of the mesh you are clicking at. This way you can quickly try different positions and see if you can find an interesting one.
When experimenting with lighting, I also like to create a few different lighting scenarios. This can be done easily if you add a new sky object (Scene>Add Object>Sky). You can attach your lights to this object. And because only one of these sky objects can be active in a scene, you can easily switch back and forth between different lighting scenarios and see which setup you prefer.
To create the reflective surface, I added in the Shadow Catcher object from Scene>Add Object>Shadow Catcher. You have to click on the Indirect Shadow checker, which will make the surface reflective (Works with ray tracing).
Conclusion
I am constantly striving to optimize my workflow to achieve the best possible results with maximum efficiency. This is an ongoing process for me, as there are always opportunities for improvement. In this article, I have shared some tips that I have found to be most valuable in my workflow. My hope is that at least some of these tips will be beneficial to others, as the 3D community was helpful to me.