17 February 2022

Abandoned Truck – Vehicle Breakdown – Alexander Sheynin

01_r_pickup5-scaled

Introduction

 

Hi, my name is Alexander Sheynin, I’m a self-taught 3d artist, currently working at Dekogon. In this article I will show you my approach to creating vehicles for games; the usage of Megascans combined with my own captured textures to create a realistic abandoned style.

Goals & software

This pickup is a part of our Abandoned Service Garage set, created by our team in Dekogon for Unreal Marketplace. The main things we wanted to achieve were the ability to change the color of the paint inside Unreal so that the customer could edit the car according to his goals, while all the wear would remain, and make all doors openable, so the locking system should look realistic and geometry doesn’t penetrate into itself.

However, I didn’t concentrate on the car’s bottom and the suspension too much, so I kept them pretty simple, but still visible from different sides. This led me to software choice for this task – I wanted to be able to quickly reshape the model and there was no need in any big unique damage, so I didn’t use Zbrush and made full highpoly in SUBD in 3ds Max. For the other stages, I used RizomUV, Marmoset Toolbag 3 for baking and Substance 3D Painter for texturing.

References & Inspiration

02_refs

This vehicle is a part of our upcoming scene, showing a post-apocalypse abandoned garage, full of rusty and worn tools, but still in use. For this task, I referenced most to Days Gone, COD: Modern Warfare and The Last Of Us style. The main shape of the car was inspired by several pickups of mid 2010ths like Nissan, Renault, Toyota and some others.

Blockout/Modeling

 

I must say, that before this task I spent several months creating vehicles, and used different parts, like wheels, mirrors, or doors as blockouts, so I didn’t have to do everything from scratch every time. This can be done in two ways: 1) I put a mid-poly or low-poly mesh and tweak it to match a new shape. This is extremely helpful to save time creating curvy doorways; 2) In some cases, I place small parts, like suspension, dashboard, wheels, front or backlights and mirrors, and then model the body. It is useful when you don’t have a  strict concept or a blueprint, or even a side view, but you have several references which you want to combine.  I store all the pictures in Pureref and set them to the transparent mode when modeling.

 

Highpoly & Lowpoly

Nothing fancy here – only old good SUBD modeling. I create a mid-poly mesh from blockout, add a Chamfer modifier (a modifier, that controls bevels in 3ds Max), and another one Edit Poly modifier to add some support loops or change geometry, if needed, and then apply Turbosmooth modifier, instanced across all highpoly parts.

03_chamfer_stack

With the instanced modifier I can edit all the parts at once by changing settings in one part only; I use this for Chamfer and Turbosmooth modifiers when I need to have the same SUBD level or bevel width or curvature across several meshes.
Another thing to mention here – with SUBD I try to avoid n-gons, because usually I make my low-poly by removing  Turbosmooth and Chamfer modifiers and it is easier to simply delete additional loops than to fix geometry entirely.

N-gons in high poly modeling are ok because you don’t spend much time fixing the polygon flow, cause the SUBD iteration will create quad geometry for you, however in some cases, it may cause tension and artifacts on baking, so it still requires a bit of manual control.

04_hp-scaled
05_lp-scaled

When creating a low poly, I try to keep the silhouette smooth and add as much detail to the geometry as the polycount allows. I use the Weighted Normals modifier with the “Use Smoothing Groups” option turned on for meshes with beveled and sharp edges both, so the modifier tightens smooth areas and doesn’t break my smoothing groups.

06_weighted

Uv/Bakes

I use RizomUV for unwrapping – powerful and very intuitive software for creating UVs. The map resolution for this project was 2k, so the minimum texel density was 5.12px/cm. It gave me 6 UV tiles for the entire pickup: some small visible parts, such as the steering wheel or dashboard buttons were scaled up, while less visible parts, especially on the bottom were given a lower texel density. I didn’t use trims for bottom parts or interior, cause I wanted to have more flexibility texturing them.

Glass has its own shader with translucency, so it was moved to a separate texture set with higher texel density too. All UV islands were aligned and straightened as much as possible without topo stretch and packed with 16 px spacing in between (2048 px texture).

07_namingtd-scaled

When UVs were done, I imported my model back to 3ds max, checked smoothing groups and hard edges, duplicated mirrored parts and moved their UVs to the next tile, renamed highpoly and lowpoly meshes with “_low” and ”_high” suffixes respectively and exported into 2 FBX files (highpoly and lowpoly) to Marmoset.

In Toolbag I use Quick loader for importing my meshes. Because of the proper naming, I have everything set up in the correct folder. I manually explode my mesh to have more control over ao baking, when I need some parts like seats not being affected by the rest. I don’t do this step before exporting to marmoset, because I want my model to be assembled, and in Painter, I can always isolate any mesh with the geometry mask function.

The settings are pretty simple – max 64 samples for baking, 16bit format to avoid any stepping issues on normal and small soften value to clear some sharps. Flip Y in normal bake settings for DirectX project in Painter; 1024 rays and Add Cavity function turned on in ao baking. Object ID map – is the ID map; I found Marmoset does it much faster better than Painter. All the other maps, like Curvature, Thickness, Position and World normal I use to bake in Substance Painter.

Texturing

 

Before we go into texturing, I turn on ACES Color Profile, set Tomoco Studio environment, as it has the purest lighting I try to match colors in the final unreal scene and Painter project file. For this purpose, I use the Color Calibrator, which you can export from unreal to Painter and using the simple color picker in Photoshop I tried to match Painter to Unreal color values. This can be done with White Point value or any other in Post Effects options.

And then comes the magic. For texturing,  I use a special set of effects in each of my projects. These are layers that I put at the top of the layer stack. They can be divided into 3 groups, from the very top to bottom:

  • FIX layer with Automatic_Pbr_fixer effect – it keeps all my values in PBR limits https://gregoriopiscitelli.gumroad.com/l/pYpWJ
  • Albedo adjustments and coat effects. I’ve learned this technique from my colleague, Wahuy Nugraha https://www.artstation.com/revel/profile. It is a folder with a bunch of layers masked by ao and curvature, which make a much more visible contrast between edges, cavities, and flat surfaces. Usually, it is a fill layer, with ao or curvature map in base color channel set in multiply or overlay mode with a lower value.
10_ao

AO layers make occlusion areas darker, while curvature layers make edges bump up in albedo.

11_curvature

Also, I have here a sun-fade layer – it makes the roof of my pickup brighter when the parts that  are closer to the ground;

12_sun_fade

Some dust layers with top dust and AO masks.

13_dust

There is a sharpen layer on the top of this folder;

  • Overall dirt and damage. Here I have a folder with overall effects, such as ground dirt, bottom moss, small scratches and so on.
14_breakup-scaled

Everything in these folders are Fill layers with different overlay modes (like Linear Dodge, Overlay, Multiply, or even Passthrough) in base color, roughness and other channels. I use these modes to keep previous channel information from the stack, so you can still see some glossy red paint under subtle rough dust, or the edges would always be brighter than the rest, no matter what color do I use, cause the edgewear layer is set to passthrough mode with brightening in histogram scan or HSL effect.

When everything is ready, I begin to texture. I use a simple structure of folders named by materials, like “car paint”, “tire”, “glass”, “chrome”, etc. Most of them are done by scratch, however, for pure metals (or wood in other projects) I tend to use Megascans or other pbr sets of materials.  Each has a base material, which defines primary color and roughness; then go several layers with albedo and roughness variations in linear dodge or multiply modes. They bring a more natural look and breakup. After this base is done, I add some overall wear effects and stains. For the masks here, I use built-in generators with paint layers to manually edit some areas; Megascans and other surface imperfection masks; and some custom-made stencils. Then, it’s time to add details, like rust, rain leaks or paint fade. Here I usually use my own stencils or surface imperfection masks, like Poliigon, David Gruwier and many others. The key here – is to make something unique, that suits the wear of the current asset.
For the rust, I use a 2-layer set:

  • The first one uses Megascans material as a base; then I replace its base color texture with my own png decal and add an anchor to it to create a mask by this decal. I add a black mask to this layer, add fill to it and insert a previously-created anchor, so now my rust appears only on my decal shape (u need to tweak levels in mask fill to get rid of gray tones). Also, I can add a paint layer and manually erase some portions or a grunge map in subtractive mode.
    After that, I added an anchor to this final mask
  • Rust halo. Duplicate the first rust layer, replace png with the default material texture and remove a mask. Add a new mask, add fill to it and put a Layer 1 Mask anchor into it. Add blur, then add one more filled with a Layer 1 Mask anchor and set it to subtract. This way you will have blurred edges, while the decal area will remain sharp because it comes from the first rust layer only.

When the rust work is done, I added some fallen leaves from Megascans and height bumps

15_rust_breakup-scaled

Tint mask

We wanted to change the color of the car inside Unreal in material instance settings. It shouldn’t have replaced all the albedo information, just tint the values and on car paint only, so we could still see how the color on the roof is brighter and darker in cavities. I added one more channel in the Texture Set settings (user0 by default), then added an empty fill layer to the bottom of the stack with only the user 0 channel enabled, with black color in it. This way, all the parts have no tint mask by default, so we wouldn’t get any tinting on chrome, etc.  After, I enabled user 0 channels on the base layer for car paint, set it to white, and then enabled user0 on each layer, which overlapped my car paint, like rust, dust, rain leaks, scratches and etc. – i.e. everything, that has it’s own albedo and not relies on previous layers; filled it with the black value and set to multiply mode.

16_tint_mask

Rendering/Conclusion

For the rendering, I used a simple 3-point lighting scenario with some post-process volume inside our asset scene for the marketplace in unreal. I didn’t want it to differ much from our products screenshots, so I kept almost everything by default. The material setup and the scene was done by our head Clinton Crumpler.

You can find it here:

https://www.unrealengine.com/marketplace/en-US/product/abandoned-service-garage-vol-4-vehicles-and-service-machines

Hope you enjoyed reading and thanks to GamesArtist for letting me write this article!

17_r_pickup1-scaled