project reality header
Go Back   Project Reality Forums > PR:BF2 Mod Forums > PR:BF2 Community Modding > Modding Tutorials
24 Jul 2021, 00:00:00 (PRT)
Register Developer Blogs Project Reality Members List Search Today's Posts Mark Forums Read
Modding Tutorials Information and tutorials related to modding BF2.

Thread Tools Display Modes
Old 2017-06-04, 22:15   #1
PR:BF2 Developer
Supporting Member

Rhino's Avatar
Default Mini-Tut - Modelling HESCO v2

Quick tut to explain how to make the new HESCO v2.

For the new v2 HESCO we now represent two main types of HESCO instead of just one. These are:
MIL1 HESCO: 1.3m x 1m x 1m (height x width x length of a single block, this also being the main type seen in the old HESCO)
MIL7 HESCO: 2.2m x 2m x 2m (New High HESCO mainly for use in Main Base Defence, since it takes up fewer tris and lightmap space than stacks of MIL1 HESCO)

Info: Same version represented in the old HESCO but modelled in a slightly diffrent size to allow for better grid snapping.
Block Size: 1.3m x 1m x 1m (height x width x length)
Block Segments: 1 x 3 x 3 (height x width x length)

Info: New larger version mainly for use in Main Base Defence, since it takes up fewer tris and lightmap space than stacks of MIL1 HESCO, but can be used for FOBs etc too, just not so common for them in r/l than MIL1.
Block Size: 2.2m x 2m x 2m (height x width x length)
Block Segments: 1 x 4 x 4 (height x width x length)

Blocking Out
Firstly after you have determined what type of HESCO your making (MIL1 or MIL7), you then need to also determine the length your making. For this my main example, I will be making a 64m length of MIL1, but will also be showing some examples of making MIL7 where it differs from the MIL1 example.

First thing to do is block out a box of the length of HESCO your making, ensuring it fits in with the block sizes above, then multiply the block sizes by the amount of segments, in my case, 1.3m x 1 Height Segment which = 1 Height Segment, 1m x 3 Width Segments which = 3 Width Segments and 64m x 3 Length Segments which = 192 Width Segments:


Next step is to UV the mesh, which may seem odd at this stage, before we start to manipulate and mess up the models, but its because of that reason we want to UV it now, as its super easy to UV in its basic block form, where it will be much harder later and any changes we make during the manipulation and messing up of the mess, we don't want applied to the UV either.
But before we start UVing, convert the mesh into an edible poly and delete the base, as well as set the remaining faces to the MatID we are using, in my case 1, then apply the material and the UVW Unwrap modifier.

First I'm going to Unwrap UV channel 1, select all the faces then apply Flatten Mapping to the selection with the following settings:

Then going to weld up all the bits:

Then I'm going to select all the face UVs and copy them, adding another UVW Unwrap modifier to the mesh and switching it to channel 9 (Lightmap UVs) selecting all the faces in that UV window and then paste the channel 1 UVs to channel 9. While they aren't totally setup the way we want for the LM UVs, they are a good base to work from that will save time overall (more so the case when UVing other types of models but still worth doing for even this).

Then adding another UVW Unwrap modifier, setting for Channel 2 (Detail Textures) and pasting the same CH1 UVs to CH2.

Now we have our base UVs setup on each channel we can start to play with them a little more to fit each channel better. First for the Ch2, Detail texture UV we need to scale it down a lot to be around the size we need. Now the texture map is a 1:2 ratio texture ( 1024x2048 ), which means we need to 1/2 its height first of all as if we apply the texture map we can see its streched in its current 1:1 ratio setup:

Go into the grid/snap settings and set the "Percent Snap" to 50%

Then with % Snapping enabled, in UV Freeform mode drag its height down until it is 1/2 its current height:

Now the UV is at the correct ratio to the texture sheet, we now need to scale it down to the proper size to match the texture.

Now we have 64 blocks of MIL1 in our 64m length of HESCO, and our texture sheet has two blocks of MIL1 per horizontal tile, which means we need 32 tiles to cover all of the length, + another tile to cover the end textures.

First put the bottom left of your UV in the bottom left of the UV with no tiling, using this UV helper texture which highlights the edges of all the textures on the palette ([URL="]right click, save as[/URL] to download then use):

Above we determined we need 33 tiles to cover everything but since 0 tiles actually = 1 tile, we need to set a number of tiles we want to 32:

Then keeping the UV ratio the same (hold down ctrl) and with % snapping now off, scale down the UVs from top right to bottom left to the edge of the tiling like so:

Now as you can see it currently doesn't fit perfectly since the texture for each block is 512x512px (1:1) and our block is 1.3m x 1m.

But before we get into fixing that lets first detach the top sides, rotate 180 (don't flip) and match them with the bottom:

And then let us also break off the top faces from the bottom:

Now selecting the side UVs in vert mode (best to use "Select Element" mode, then with selecting one vert of each element you will select them all) we can then drag down the top (while holding shift to only affect the vertical axis) to match the top of the side UVs with the texture, using the UV Helper texture as a guide by putting the UV edge right on top:

Then selecting the top sides, just position them over their textures correctly, making any minor corrections that might be needed to put them on top of the edges of the UV helper texture:

Now because this is a pretty long bit of HESCO, it actually just exceeds the maximum amount of tiles for a static mesh in BF2, which is 16 tiles (-1 if you count that 0 tiles actually = 1 tile in the UVW window, so 15 tiles in there), as you can see here (in SS I thought it was 32 but its 16 as corrected below, just not in the screens):

Now there are two options here. The first is to break up the UVs into small chunks and have them overlapping each other, the second, since our UV currently starts at 0 to 32, we can actually move our UV to be in the negative UV area, since the tile limit is in fact from 16, -16 to +16, +16.

So selecting all our UVs, switch to offset mode in the bottom left of the window and then type in "-8" into the U box, which will then move all our UVs -8 tiles, and all will be inside the tile limits

With our Ch2, detail texture UVs are done, we can now add another UVW Unwrap modifier and fix up the colour texture UVs in channel 1

Now I'm not going to give any exact tile amounts for the "" since all this texture is for is to add variation in colour and generally, make the main detail texture look less repetitive and add variation, and having each HESCO model use the same tile settings etc will only make them look more uniform to each other which is the opposite of what we want to achieve here.

So instead of scaling down to an exact amount, scale down (keeping the UVs aspect ratio by holding ctrl, this is a 1:1 ratio texture so the UVs we did before are in the correct ratio already) until the textures look about the right scale on the model:

Here, however, we can already see quite a bit of repetitiveness so to help cut down on that, rotate the UVs a little so that they don't use the same area of texture each tile:

Now the rotation amount, scale and position of each model you do you want to ideally keep as unique as possible between each model so none look the same, just avoid using 90 or 45 deg rotations, or anything to close to them otherwise you will start to see a common pattern in the colour texture.


Now that the UVs are done we can start shaping our HESCO to look at little more natrual.

There are lots of ways to shape them but probably the best way to shape them is with the FFD Box modifier, setting it to be twice that of how many blocks you have for MIL1 +1, or three times as many for MIL7 +1, so you have FFD control points for the outside and middle of each block. So for my 64m long MIL1 HESCO which has 64 blocks in length by 1 wide, I need 129 by 3 segments (by 2 for height) like so:

And then you can select every block's middle control point and move them out easily by 100mm like so:

If doing "Flat Ends" however you should only move the end points out by 20mm, just to help make sure there is a good join when the mapper snaps multiple sections together on the grid:


Now we've got the basic HESCO shape, next step is smoothing. Unlike the old HESCO we are not going to have each block have its own smoothing group as to have the normals work properly, we want the thing fully smoothed with only the sides and top being on seprate SGs.

First select all faces, clear all SGs:

Then select all the sides and give them all SG1:

Then invert the selection to select only the top faces and give them SG2:

Now while the smoothing may look a little harsh on the ends, it wont be so bad ingame/editor and the normals will look a lot better, otherwise, you will have obvious seams between each block where the linking wirework are, and will look pretty messy. This also means fewer complied vertices having only two SGs.

If however doing "Flat Ends" for the mapper to be able to snap multiple sections together on the grid, you should give these flat ends their own SG.


Finally, so each block isn't totally uniform we are going to add some noise to the mesh to mess the up and make each one somewhat unique in shape

For the first noise pass, add a Noise modifier to your mesh, put in a random seed and for this one we are only going to affect the X and Y axsis, but not any Z (vertical) axis noise, since this will affect the entire model including the base which we want to keep flat.
Give the X and Y around a 50mm strength value, checking Fractal noise and giving it a roughness of around 0.5 with 6 iterations:

Next add an editable poly modifier on and select only the inner top 4 verts of each block, then apply soft selection with around a 1m falloff range and other settings you can leave at default but can mess with the settings to suit your needs.

Then add anouther Noise Modifier on that will just affect the Z, vertical axis and with a strength of around 100mm, with Fractal noise with a roughness again of around 0.5 and around 6 iterations:

Lastly, on the end corners, you may notice a bit of texture distortion like so:

This is simply fixed by adding an edge front the corner to the central vertex like so:


LOD1 is very simple for MIL1 HESCO, just select the middle edge of every block, ring them and collapse them, to form this, pretty much 1/2 the tri count:

LOD2 is basically just a box so just remove all the inner edges:

And then assign Material ID 2 to all the faces, which is the HESCO lod texture, which is the same as the main texture, just without the normal map.

Collsion Meshes

col0 (decal) and col2 (player) are basically a clone of LOD1, with then just applying the gravel material to the top and the sandbag material to the sides:

col1 (physics) is basically a clone of LOD2 with the same material setup.

col3 (AI) is a clone of col1, but with the bottom face capped and only the sandbag material applied to it:

Finally once you've made all your cols you should apply an optimize modifier to them with a Face Threshold of around 2 to keep them matching the orignal meshes mostly, but to remove any unessary tris at the same time. This can't be done for LODs as it screws up the UVs.

Lightmap UV Packing

Now that the models are 100% done its time to pack the Lightmap (LM) UVs.

Select all the LODs and apply a ch9 multi-object unwrap UV to it:

Then scale down the UVs to be the height of a single tile, but keeping the propotions the same:

Now we know the length of our HESCO is 64m, + an extra 2m for the extra end bits sticking off. The height of our HESCO is 1.3m and the width is 1m. Now since we have two sides UVs, being 1.3m high and one top UV being 1m high, that means we have a combined UV height of 3.6m (1.3+1.3+1). As such our UV currently is 66m by 3.6m, which means our length is around 18 times bigger than its height. So we need to scale down our width to be 5.5%. So snap the UV to 5.5% of its wirth will put it in side the box:

Now 16:1 ratio is the closest we can get when dealing with the power of two sizes, and as such, a 1024x64 LM size sounds good for this, which is around 16px / meter. Pixel Map helpers:

Next we want to break the diffrent sides up as they can easily have quite different lighting, but keeping them close to their original join and keeping them same px apart, in this case 2px:

Finally, stretch out the UVs to use the maximum space, but 1px in from the border to avoid the LM bleeding into surrounding textures:

And again ensure everything is 2px+ apart (done 4px for the end bits sinde one isn't a direct stich to the other)

Set the UVs then make tweaks for each LOD's UVs to be lower sizes, for my example LOD1 is 512x32 and LOD2 is 256x16:

Finally, mark down the LM sizes in a .txt file for mappers to use if using 3DsMax LMs like so:
hesco_mil1_64m 1024*64 512*32 256*16

Rhino is offline
Last edited by Rhino; 2019-07-31 at 14:15..
Reply With Quote
Old 2017-06-05, 02:00   #2
PR:BF2 Developer

Outlawz7's Avatar
Default Re: Mini-Tut - Modelling HESCO

I added a noise modifier with those exact same settings and it barely changed the model until I changed scale to 1 instead of 100. Why is Y your vertical axis, its Z on my end.

Outlawz7 is offline Reply With Quote
Old 2017-06-13, 09:39   #3
PR:BF2 Developer
Supporting Member

Rhino's Avatar
Default Re: Mini-Tut - Modelling HESCO

Updated OP for HESCO v2

@Outlawz, ye, mixed up Y and Z since the editor has Y as its vertical axis, Max is Z hehe. Fixed in the update. Dunno what the scale issue is thou, possibly down to your scene settings?

Rhino is offline Reply With Quote

hesco, minitut, modelling
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

All times are GMT. The time now is 13:28.