I decided to make a model of Range Rover Classic, because there are not too many models of it and I wanted to make a well-known SUV. I didn’t set myself strict limitations on polycount or texel density. I just wanted to do my best in making this as realistic as possible along with other aspects. I love abandoned environments and especially cars in them so I made them very rusty and dirty.
I use 3DS Max for modeling and unwrapping, Substance Painter for baking and texturing, Marmoset Toolbag for rendering and ImageModeler for placing cameras based on photos. And ofcourse a little bit of Photoshop here and there.
Recently I discovered, myself a good source for car photos – www.bringatrailer.com.
This is a car auction site and there are tons of cars, each of which, has tons of good quality photos, for example, at this moment there are 250 Range Rovers and many of them have about 250 photos each.
Setting Up the Scene with ImageModeler
ImageModeler is a piece of software that reconstructs where the cameras were when the shots were taken and which settings they had when the given photos were shot. Firstly, you need several photos of an object from different angles. The minimum amount for a good result for a car is 5 photos taken from the angles shown below. But the more, the better. I used 12.
Then I loaded these images into the ImageModeler and started placing locators.
To place locators you need to find spots that are visible on 3 or more photos simultaneously. Typically, those are corners on parts like doors, fenders, bonnet and small things like wipers nozzles, screws, etc. Don’t place locators on the wheels or other parts that can be moved between photos unless you are sure that they didn’t.
To create a new locator you need to hold CTRL (the cursor turns green) and click where you want to place it. In the example below, I placed a new locator on the corner of the door. This point is visible on 5 images so I switch to each image and place this locator (without holding CTRL). When the cursor is white that means you are placing an existing locator. When the locator is placed on each image for each part – find another spot for a new locator.
Also, don’t place locators too close to each other. For example, if you found 2 good spots but the distance between them is about 2cm – use only one of them.
Keep placing locators until ImageModeler shows the “calibration successful” message. You can add more locators to achieve a more accurate calibration.
As you can see each image on the bottom bar is marked with a little green square in the corner. That means all images are successfully tied to each other. If only some images are marked green – continue to place locators or check if existing placed correctly. For some reason even if you do everything right the ImageModeler, it can fail to calibrate anyway. In that case, try to find a different set of photos and try again. Yep, that can take some time.
I ended up with 42 locators. In my case, it’s clearly seen that the car remains untouched between photos, so I placed locators on some stones on the ground and the building in front of the car.
After that – export the scene to a .fbx file and then import this file into your 3d software – 3ds Max in my case. The imported file will look like this (red dummies are locators):
Group everything together then rotate and scale to make it properly oriented.
On the top left corner of the viewport select one of the cameras then enable 2d Pan Zoom Mode. In the viewport configuration setting change the background to the image corresponding to the camera.
My set up is like this, 3 viewports and the last one I left for orthographic view:
Talking about the highpoly model – nothing special here, just regular modeling for subdivision. I’m trying to keep everything in quads, but sometimes it’s fine to use some tris or n-gons. I see some people think that triangles are totally illegal and evil but it’s not that bad. I usually leave triangles if I can’t find a quick solution to turn them into quads, after subdivision, there are not too many distortions. Also sometimes n-gons behave better than tris.
Some parts like brake calipers, transmission and part of an axle, shown above are made using booleans and retopology modifier. The result still required some manual adjustments and the mesh is pretty dense but it’s good enough for baking.
For the interior, I usually make the same scene setup as the exterior, only with fewer cameras (usually 3-4). I model everything visible on photos – dash, steering wheel, console, then bring everything to the same scene with the exterior and try to match them. Then do the rest of the interior mostly by eye. In the image below you can see that for the seats and the floor I made only simple placeholders to preserve the position. The seats itself was made separately and then placeholders were replaced with them.
One of my favorite parts is modeling wheels. For the rim, I use the plane with the photo as a reference. In many rims, spokes count matches screw counts like 8 spokes and 4 screws or 10 spokes and 5 screws. In that case, it’s easy to make only a segment with 2 spokes and 1 screw hole and copy them radially. But this car’s rim has 3 spokes and 5 screw holes, so I modeled 1/6 segment without screw holes (red on the image), mirrored it (green on the image) welded them together and copied this part 2 times radially.
After that, I subtracted screw holes with booleans and like before used the Retopology modifier.
For making a tire I start with a basic cylindric shape around the rim. I then add some patterns to the side. Usually, there should be things like a manufacturer name or some sort of technical information, but I prefer not to make this kind of thing cause this would require having a whole side of the tire be unwrapped as a single chunk. So I prefer to save some UV space and unwrap only one-quarter of the tire and then copy it.
For a protector, I make a repeating part of the pattern (shown below) and copy in a row multiple of 4 times – 32 in this case. Then I wrap it around the base of the tire with a Bend modifier.
I also decided to add the small cuttings as floating geometry instead of fully modeling them, so later I can use it for baking ID Map and paint those details on texture.
I don’t use any special tools for retopology and in most cases don’t use highpoly without subdivision as the base for lowpoly. I create lowpoly mesh from scratch manually so there is nothing interesting to talk about.
When the lowpoly mesh is done – the next step is to set smoothing groups. I’m trying not to make too many hard edges but still avoid too noticeable shading issues. Note that hard edges should have UV seams.
After that, I unwrap the lowpoly model. I use a separate texture set for the body, interior, and undercarriage with wheels and glass. Let’s take the undercarriage texture set for example.
For unwrapping, I use the standard Unwrap UVW modifier. I start with placing seams on all hard edges then add some more seams to make the shapes of UV chunks more convenient for packing.
I scale up or down on some of the UV chunks depending on their visibility and the number of details they will contain on texture. For example, I scaled up the front side of the rim (and the tire too) to get more texel density, because this side is always clearly visible, I also scaled down the backside to save some UV space, because this side remains mostly invisible.
For the sake of saving UV space, it’s also good to detect all repetitive meshes or parts of the mesh and unwrap each of them individually. In this case, I unwrapped and textured only the rear axle and then copied it to the front. Same with drive shafts, trailing links (there are 4 of them and all have the same UVs) and many others. Parts of the frame and the bottom are mirrored. For springs unwrapped only one turn of the spring and then copied vertically a few times.
Preparing the highpoly for baking, I apply materials with contrasting colors to different parts to bake them into an ID map later, I then move the parts away from each other. There is a proper modern way of avoiding baking artifacts whilst parts are close to each other or intersecting parts without moving them – that’s adding “_low” and “_high” suffixes to object’s names but I prefer the good old one with moving.
The next step is making the cage. I take a copy of the lowpoly mesh and make cuts near the sharp edges (almost like support loops for the highpoly). I then push it, until it covers the highpoly fully. In some places adjusting the cage moving vertices manually and making quick testing bakes.
Also, since I move parts from each other I lose ambient occlusion in some places so I add pieces of lowpoly meshes (green on the example below) near those parts to restore AO.
Before exporting the lowpoly mesh, it should be triangulated. Different software triangulates differently so if you imported quad mesh to Substance Painter it will triangulate one way and then you import this same mesh to the game engine – it can triangulate another way and the normal map baked in SP will display incorrectly. So don’t let the software decide how to triangulate and triangulate it yourself before baking.
By the way, in case you forgot how to triangulate the mesh and it’s already baked and textured – SP has an option to export the mesh to be triangulated.
As a nice final touch, it’s good to check what the triangulated model looks like in facets mode. Especially at the corners and curved surfaces. Does it concave or convex where it should be. The example below shows another car model where this is more obvious.
Finally, I throw this all into Substance Painter and bake.
I start texturing with the body of the car. Firstly I set up clean base materials for paint, plastic, metallic parts, etc. In most cases, they are just fille layers without any texture. For simulating holes on the surface like in the vent on the bonnet I use a fill layer with absolute black color in albedo, roughness and metallic parameters set to 1. Such material reacts least of all to light and creates the illusion of a hole. Those “holes” should stay on top of other layers so layers with dirt will not cover them.
Next is to paint damage. For scratches, I create a fill layer with roughness to 1 and other parameters disabled. Then I add a black mask and put some standard grunges to it. Basically, it’s multiple “Grunge Scratches Rough” on top of each other in linear dodge (add) mode with different transparency values, offsets, rotations, scales and seeds. Using a Light generator I make the paint on horizontal surfaces a little faded. Also, this time I decided to paint over some areas where the white primer appeared through paint.
Making the rust, I take standard “Rust Fine” material and begin building the mask. Every time I texture rust I try to experiment a little more, but the core of the process remains the same. I start by manually painting the areas where the paint is chipped and rust has appeared using a standard brush with a circular shape. I then apply filters – multiple Blur Slopes with different settings to achieve a more chipped look and Histogram Scan to get hard borders. The Histogram Scan filter is also good for mixing multiple noises. Some of the shapes I create are this way. I then fix it manually by painting in Subtract or Add mode.
To get the effect of peeling paint around the rust spots I create a fill layer with only the Height parameter enabled and use a copy of the mask I described before with the blur filter on top. I put this layer under the rust layer and change the height blending mode of rust to Normal.
In a similar way, I create a yellowish tint on paint around the rust – copying the rust mask and blurring it.
In the big rusty spots near the bottom, I painted a few holes which look like rusted through metal. The mask is created as before with manual painting and applying a Blur Slope filter.
To paint leaks from rust spots I use 2 ways. One is just stamping them with alpha found somewhere on the internet. The second is to make a spot with the brush and smear it down with the Smudge tool. To make the central part of the leak brown-orange and the outer parts yellow I copy the whole layer then shrink the mask down with levels and change the color. While experimenting this time I decided to add a third copy of the layer with bright orange color. Here is what I get:
In addition to those rust spots, I make other types of rust. Don’t really know how to properly describe it. Something like surface rust. Same as before I make yellow-tinted paint around the rust. This is what the mask consists of:
The last step is dirt and dust. First of all, I use the good old Dirt generator but I make it barely noticeable. In this case, I set the Dirt Level parameter to 0.4 so it doesn’t stand out too much. However, it was still too much dirt on the grill, so I erased it a bit by adding Paint in Subtract mode and painted over any unwanted areas. It’s always good to not fully rely on generators and grunge and to make manual adjustments.
The next layer is ground dirt. I took BnW Spots noise and put Warp and Highpass filters on top and increased contrast witch Levels. To make dirt appear less on the top I multiplied the mask by Gradient Linear alpha in planar projection.
Besides that, I manually painted 2 additional layers of bottom dirt with slightly different colors to add more variation.
To the sides, I painted some leaks with standard Drips Top alpha and put Warp on top. I decreased this layer’s intensity of albedo and roughness to make them barely visible.
On the horizontal surfaces, I wanted to reproduce the effect of dried-up drops of rain in the dust. Firstly I put some spots with planar projection then blurred them a bit and applied Gradient Curve filter with Triangular preset selected to make stains hollow. To break the shapes a little I added Blur Slope.
I also recently found out that an interesting leaking effect can be achieved when applying Blur Slope with Position generator in Custom Noise input to some spots.
For the dust, I used the same techniques. For a more interesting look I removed large chunks of dust with the brush. To make a top-down projection I use the Light generator.
All the same for the interior and others. The only new thing for the interior is that there are lots of buttons with icons or text on the dashboard and for things like that, I take an image, make it grayscale in Photoshop and try to adjust levels so that the text and icons become white and the background is black. It rarely will work with just levels, most of the time it needs to be manually fixed.
I send the result to SP and use it as alpha. When I need to make multicolored icons, I create a folder and stamp my alpha in its mask then I put inside this folder Fill Layers with colors that I need and paint needed areas in their masks.
I use Marmoset Toolbag for rendering – it’s the perfect tool for rendering game assets in my opinion. It’s super simple and intuitive.
Before setting up the lighting I set all the rendering quality-related settings to high values. In the camera settings, I prefer to change the Linear tone mapping to ACES and decrease the field of view to 20 (rendering interior I change FOV to 90). I also add a tiny bit of bloom and a vignette. And so the model doesn’t float in the air I add a shadow catcher.
Next up is placing lights. I didn’t follow some lightning rules or something like that – just “painted” with warm yellow and cold blue lights. And a few neutral whites.
In Photoshop I quickly made the following image and set it as a skylight.
Next, I started adding light sources. The first one is bright and warm the second and the third are cold to make a nice contrast. The last 2 are neutral white, one is to make a subtle gradient on the side of the car and the other is to highlight the front part which was too dark.
This is how the scene looks like:
All the other renders are made by the same principle.
As the last step, I bring the images to Photoshop and see if messing around with levels or adjusting saturation could make them any better. And apply sharpness of course.
That’s basically it! Hope you found any useful information here and thanks for stopping by.
Special thanks to GamesArtist for inviting me.