- WW2 Tank Simulator

Armored Assault is a WW2-themed tank simulator. In the game, players can manipulate many different types of vehicles and weapons from a first-person or a commander's perspective. The game is committed to providing a real World War II experience, including real ballistics and armor systems, and the data of vehicles and weapons is also as realistic as possible.

Gameplay 2017

Improved terrain and vegetation

If the videos are unavailable, please try refreshing the page a few times.


From my childhood, tanks have been the steel beasts in my heart, their powerful and mysterious image deeply captivating me. As I grew older, this interest did not wane but instead grew stronger as I delved deeper into military history and technology. My love for tanks goes beyond their appearance and combat capabilities, extending to their significant role in historical battles, as well as the technological innovations and tactical evolutions behind them.

This profound interest drives me to use video games as a platform to allow more people to experience the feeling of driving and fighting in tanks. I hope to create a game where players can not only experience intense and thrilling combat but also gain a deep understanding of tank battles in real life and their historical context.


The aim of the game is to deliver a gaming experience as close to real tank combat as possible. I want players to feel the authenticity of driving and fighting in tanks on the battlefield. To achieve this, the game's mechanics are meticulously designed to mirror real-life tank combat, building upon my extensive research and deep understanding of tanks. This includes the nuances of tanks' firepower, protection, and the physics of tank movement and engagement, striving for an immersive and educational experience.

I started the design according to the three primary factors of effectiveness in tank design (firepower, protection, and mobility). The goal at the early stage of the development is to make the game as realistic as possible.

Fire control, Ballistic simulation

Sherman M4A3's scope, distance unit is in hundred-yard

Scope of a German Panzer IV, the middle triangle stands for 4 mils. If the enemy tank matches the triangle(assuming it has a width of 4 meters), then the distance to the enemy tank is 1000 meters. This is a fast way to do the range finding.

The scaled trajectory of a 75mm German panzergranate40 shell when firing from a KwK 75/L48 cannon (mainly used by Panzer IV and Stug III).

Different ammo types have vastly different armor penetration mechanics and capabilities. This was also be implemented in the game.

Armor distribution, Penetration simulation

The armor distribution of an German Tiger tank(Panzer VI).

Ballistic simulation in ANSYS

Interior of an Soviet T-34-85 tank. Similar references were used to rebuild the interior of the tanks.

Penetration char of typical German WW2 armor-piercing shells. This was used to calculate the in-game armor penetration.

Suspension & Engine simulation

Christie suspension used on Soviet T-34s

Ford GAA engine engine output chart. The engine was widely used on American Sherman tanks


After the design of the game design was settled, I started the implementation of various systems. Due to space limitations, I will primarily select a few of the more important mechanisms to showcase.

1. Armor & Penetration Simulation

Panzer II 's 20mm cannon failed to penetrate the frontal armor of an T-34

T-34's shell ricocheted against Stug III's side armor due to the high impact angle

T-34's shells were unable to penetrate the frontal armor of a Stug III, but it can easily penetrate the side armor of the Stug

The armor system in the game replicates as closely as possible the various scenarios that occur when armor-piercing shells hit armor in tank battles. This includes simulations of various types of armor as well as different types of ammunition.

Aiming at an enemy T-34. The center of the scope was aiming above the enemy. This is because all the shell in this game has trajectories affected by gravity.

A friendly STUG 3 was destoryed by enemy T-34-85. Although the frontal armor of the Stug is immune to the 76mm gun of early versions of T-34, it cannot stop the 85mm shell fired from T34-85s.

2. Tank Suspension

In-game tank suspension system, allowing the tanks to drive over all sorts of terrains as in real life.

The game also recreates the suspension system of real tanks. In the game, the suspension and tracks of the tanks behave differently when facing various terrains, just as they do in reality. The game's tank engines are as close to reality as possible, with factors such as gear shifts and overheating being represented in the game.

3. Unit AI

In the game, the AI can autonomously track and attack enemies, with the most complex part being how to enable a large number of units to quickly find their targets to attack. In the initial attempts, using Unity's built-in SphereCast caused a significant drop in frame rates. Therefore, I ultimately wrote a Grid-based enemy search system, which improved the efficiency of finding enemies to O(n).


Despite the implementation of numerous mechanisms, the game's levels have become a problem. The engagement distance for tanks often spans 1-2 kilometers, which means the maps in the game will be very large. At the same time, the game aims to be as realistic as possible, posing challenges to the design, production, and rendering of game levels.

1. Level Design

To replicate historical battles as accurately as possible in the game, I need to reference historical battle maps as closely as possible. However, many historical maps often do not correlate with the current Geographic Information Systems, and the parts that do correlate are often available in KML format. Due to the lack of existing tools, this requires me to create a conversion tool from KML to Unity.

After obtaining real historical maps as references, I also need to create maps programmatically as much as possible. This is because the maps in the game are often large and complex, making manual creation impractical. For this reason, I developed a tool for quickly filling terrain splatmaps using polygons.

1.1 KML to Unity3d

The KML to Unity3D tool can quickly convert a KML file into a Mesh in Unity. During this process, the tool first downloads all the required image information based on the links in the KML file. Then, it converts the latitude and longitude information into Cartesian coordinates and creates quads. Finally, it assigns the corresponding textures to these quads.

Recreated map composed by the aerial photos taken by the Germans over Belgorod, Soviet Union, 1942

The entire KML file after conversion

The KML files are downloaded with a Python script in batch. After having the KML files, the geo-data in long-lat pairs are converted from Cartesian earth coordinates to Unity world position.

Then quads will be generated with the right UV and normal for each vertex. The aerial photo would be downloaded in Unity given the link in the KML file. After the photos are downloaded, materials will be created and assigned to the right quad.

1.2 Unity Terrain Rasterizer

Terrain Rasterizer is a tool designed for quickly modifying splatmaps on Unity terrain. With this tool, users can rapidly generate corresponding splatmaps by placing polygons in the scene, which greatly improves efficiency compared to manual drawing. Additionally, by adjusting the polygons, users can make quick adjustments, making map modification very convenient.

How to use Terrain Rasterizer

The final result of a level made with Terrain Rasterizer

Although the aforementioned tools have effectively improved the efficiency of scene creation, developing these tools themselves consumed a significant amount of time. Additionally, these tools often lack a universal interface that would allow them to be tightly integrated with other third-party tools. To solve this problem, after some searching and comparison, I ultimately chose Houdini.

1.3 Ultimate Solution: Houdini

The 4x4 level made in Houdini. Instead of complicated conversion between different plugins, simply export and import the PNG will make the splatmap ready

The flow chart of the procedural generation in Houdini

Close-up view in Houdini. The black quads represent the bushes and trees. The vegetation can also be easily exported through USD format

This is a demo to show the procedurally generated level for the tank simulation game Armored Strom. This scene is created based on the real-world terrain near the AA battery No.365 of Sevastopol. The location had a fierce battle between the Soviets and the Germans during the siege of Sevastopol in 1942.

The level is about 4x4km^2 and contains more than 300,000 vegetation instances. With proper culling, LOD, and GPU instancing, I can maintain an average frame rate of around 250 fps on my RTX 3070ti.

1.4 Rendering & Optimization of Large Open Terrain

Although it is possible to quickly create complex scenes in the game, these expansive large scenes often result in very low frame rates if not optimized. To solve this problem, I employed a combination of methods that greatly improved the rendering efficiency of large scenes in the game. Here are some methods I used:

  • Billboard

  • Imposter

  • LOD

  • Custom shader using prebaked self-shadow

  • GPU-Culling