3D Artist Nikita Skotin has shared the workflow behind the Coupris Kineema project and explained how the model was prepared for 3D printing.
Hello! I started learning 3D graphics during my time at university as a Fine Arts student. I began to implement 3D into my traditional workflows, as it seemed to be a really fun way to resolve my studying assignments. After a while, 3D took over my focus completely and as a result, for the last few years, I have been doing it professionally, constantly learning new stuff online as well as from my amazing friends and colleagues.
The idea for the project arose spontaneously when my friend Vladimir Shevchuk offered me to 3D-print any model of my choice. The car from Disco Elysium came up almost instantly, as at the time I was obsessed with this game. The sheer quality of the visuals, sound design, and, most importantly, how this game is written, is still beyond me. With this idea in mind, I wanted to convey all the love and appreciation for the incredible work that the developers have pulled off, as well as to produce something that would look good on the shelf.
Any work starts with collecting references. In my case, the main refs were a couple of screenshots from the game and original concepts by Alexander Rostov and Jüri Saks from the official artbook. Additional sources of inspiration and guidelines came from early 20th-century industrial designs. Those allowed me to compliment the original design in order for it to be a bit more realistic.
As for today, it's not quite easy to find good examples of high-quality print-ready car models online, I decided to look up solutions by studying how real scale model kits are made. It was also necessary to come up with a lot of solutions on the go, as there were many issues to handle along the way.
The first thing I decided to do was to print the rear wheel axle along with the wheels themselves. Since this part carries both small and large elements, it allowed us to do a so-called vertical slice to determine the size of details in the chosen scale for the model, joint density between parts, and other nuances.
After several failed attempts, we finally got an acceptable result. Actually, it was so amazing to physically touch something from your viewport in real life, that I decided to get fully involved in 3D printing myself.
Now the task was to model the rest of the car as well as to develop the assembly process. I decided to SubDivision-model all the parts. Along with the usage of creases, it gave me the amount of control I needed to model this car relatively easily. The software of choice, in this case, was Blender, since its modeling toolset with a couple of add-ons on top allows you to work really fast.
Once the geometry was completed, I divided all the pieces into logical groups for printing and started working out the details' intersections as well as material tagging parts that should form a solid object in the end.
ZBrush is unmatched when it comes to heavy meshes processing, so I decided to filter out initial objects in Blender, export those to ZBrush for all the boolean heavy lifting, and import them back to Blender for scale double-checks and final export to slicing software.
The process for each part was as follows, I chose an engine as an example:
- Sort parts by print logic. For objects that should intersect each other, unique material is applied, in order to have them as a single SubTool in ZBrush.
- A single boolean object with its own material is created for each intersection (outlined in the viewport).
- After all problematic areas were accounted for, I exported meshes with a slightly modified FBX bundle Blender add-on. I tweaked the add-on to export objects by the “one material=one OBJ file” rule.
- MultiAppend from SubTool Master add-on was used to import files as separate SubTools.
- As all SubTools are separated in the same manner as we prepared them in Blender, it is now time to determine all cut-in areas for each segment. This is what the Live Boolean setup represents.
- Merged boolean object gets Autogroups->Split by Groups command. The resulting SubTools represent pieces as they will be printed.
- After importing it back to Blender as FBX, I’m scanning everything for bugs, double-checking the scale, and exporting the model in STL format.
- Then I used Lychee Slicer, a great tool that allowed me to quickly place manual supports and prepare the file for printing.
- Finally, print! All the settings and valuable tips were kindly shared by Vladimir.
After a number of unsuccessful prints and lots of tweaking, I got the assembled model ready to be painted.
Low Poly and UV
After the printed model was completed, the next step was to paint it. Since I have no experience with painting scale models, the most convenient way for me to kickstart this process was to rehearse it on a digital model in Substance 3D Painter first, then to use it as a roadmap while working on the real thing later. I also wanted to practice at low poly, UVs, baking, and presentation.
I started by retopologizing all high poly parts. Now it was also a great opportunity to refine the model in terms of details since many of those had to be sacrificed for printing requirements.
During the low poly stage, I tried to implement as many relevant details as possible using the same tools as for printed model development. I used ZBrush for sculpting leather seats and interior wall elements, and Marvelous Designer to generate base meshes for side and top curtains.
For blocking and refining certain parts I was using Gravity Sketch. A revolutionary tool that makes prototyping and blocking a very fun and enjoyable process. The steps were as follows:
- The whole model or part of it is exported to Gravity Sketch via OBJ format.
- Tweaking shapes and searching for details. The ability to see your model on a 1:1 scale makes decision-making and proportions judgment really easy.
- The sketch is imported back into Blender for further polishing.
This was repeated until I met acceptable results with every part of the model.
The most tweaking was done to the interior, where the task was to make it more or less believable from the driver’s point of view. The fact that interior elements were barely visible on the original concepts and screenshots from the game made it more challenging than in other areas. This was the moment when VR turned out to be especially helpful.
After that, it was time to UV the model. I’ve placed seams and done initial unwrap in Blender, the results were then finalized in RizomUV as it has really great tools for UV management. Packing was also done in RizomUV. I was using the B2RUVL add-on for transferring geometry back and forth. The car was split into 7 4k UV sets, and 1 2k set for additional details which were added at the very end of production.
For initial bakes, I was using Marmoset Toolbag 4, where I got Normal and AO Maps baked from high poly.
After that, maps were imported to SP where I did another pass of detailing, adding small rivets, holes, and marking details’ intersections. As a result, l had final Normal, AO, and Curvature Maps at my disposal. The rest of the texture Maps such as World Space Normals, Thickness, and Position Maps were generated in SP automatically.
Finally, it was time for texturing! At this stage, I’ve gathered more refs for each element of the model. This allowed me to get a more clear understanding of what I needed to achieve with texture work.
I started by breaking the entire model into base materials and setting up the scene in Marmoset for lookdev. I want to pay attention to these settings, which greatly affect the display of the model in Substance 3D Painter and Marmoset.
In Painter it is Sensitometric tone mapping function, as well as shader AO display quality:
In Marmoset it is ACES tone mapping in camera post-process settings:
Once the base was completed, I decided to finalize one single element right at the beginning, in this case, it was the main hull. This allowed me to understand the level of texture details needed for all the other parts and helped to reinforce the excitement about the project overall.
I stuck to the following hierarchy for almost every material in the scene:
- Base with color variations and height details.
- Edges and cavities variation dependent on Curvature and AO.
- Scratches and weathering.
- All sorts of dust, dirt, soot, etc.
- Color correction layers if needed.
The number of variations may be different depending on the desired look. Almost every element gets a hand paint pass, which brings more liveliness to the final look of the material.
To create the base for the wood material, I used Substance 3D Designer. This allowed me to quickly determine the general look of the wood planks I wanted for the interior walls. For a base color, I used a simple photo texture found online, and the default Substance wood material for Normal details. I’ve also exported the panks mask into a separate material channel for more control over the grout line in Painter.
In Painter I followed pretty much the same steps as for every other material, except for this one I decided to vary the color by anchoring roughness output generated from the initial photo texture, tweaking levels and applying it to base color as another layer of variation.
The glass material consists of the glass itself and two variations of dirt on top. One covers general dirt and dirt in the corners, while the other was mostly hand-painted using stencils and different alphas in order to break up the procedural look and add some accent details.
The base for the dirt mask on the windshield was compiled in Photoshop. I’ve exported tiled grunge from Designer to Photoshop and converted it to a smart object. Then warped the grunge to fit the shape of the windshield wiper trajectory. Then I opened the smart object contents and added some details along the sides. The beauty of the smart objects is that I can still work with a square undistorted image, while all the deformations are already made and are being applied automatically. After that, I loaded the mask into Painter and pushed it a bit to fit the desired look.
Render and Presentation
During the texturing process, I was using Marmoset Toolbag 4 for lookdev. It allowed me to quickly apply different lighting scenarios to the model, which made it easier to debug and refine the textures. Despite the fact that Marmoset produces excellent results, especially with enabled raytracing, for the final shots I decided to try out the new Cycles X, and it didn’t disappoint.
Regarding lighting, I used the basic 3-point scheme with additional light sources to emphasize certain details depending on the camera angle and overall composition.
For each shot, I’ve exported a denoised beauty pass and denoised AO pass, as well as alpha for the whole model, which allowed me to separate it from the ground plane in Photoshop.
Each new shot was saved as a separate scene and allowed me to make adjustments to each image fairly efficiently.
In Photoshop, the beauty pass was combined with the background and converted into a smart object.
After that, I applied a Camera Raw filter on it and did basic color correction adjustments, such as exposure, contrast, curves, sharpening, and so on. The non-destructive nature of smart objects makes them very flexible and easy to tweak all the way to the end. On top of that, I also applied some adjustment layers to lighten up some areas, selective darkening by AO and vignette. The same was applied to every other shot.
And that was it.
I want to express my deepest gratitude to the community for the incredibly warm welcome. I hope this article will be useful to you. I would also like to thank the 80 Level team a lot for the opportunity to share my workflow.