Volcanic Race Track
Roles: VFX, Modelling, Texturing
Team Size: 6
Time Frame: 10 weeks
Tools: Unreal, Blender, Krita
Roles: VFX, Modelling, Texturing
Team Size: 6
Time Frame: 10 weeks
Tools: Unreal, Blender, Krita
Volcanic Race Track is a 3D landscape project created using Blender and Unreal. The scene was created as a graded coursework piece at De Montfort University. The scene was created over 10 weeks and features a fully playable landscape.
This project involved collaboration with a second group, in which we would share assets at 3 key stages of development.
This 3D modelling project introduced me to a variety of new skills surrounding 3D modelling and environmental design. I was responsible for creating several large models, such as the track, as well as some smaller props. All of these models were UV unwrapped and textured in blender, featuring procedural textures that I had created using Blender's shader node tree. I was also in charge of VFX within the scene. As such I was responsible for creating the scene lighting, as well as extra effects such as fog and smoke particles. I also drew some Decals in Krita to be used in the scene.
I created a variety of models, including the segments used for the track, some large buildings for a nuclear power station area of the course, as well as a range of racer vehicles. Each model was scaled to real-world size whilst maintaining efficient topology.
I created a procedural brick texture in Blender using the shader graph. I used a Brick node to assign the brick shape and colour to the texture, which I then colour ramped, then baked to a normal map. I then added a voronoi texture to create a slightly worn and muddy effect to the brick colour, which I then output as a diffuse texture.
The baked textures could then be plugged into materials either in Blender or Unreal, which was important as all assets we had created were to be shared with another group, and so must work with the other teams workflow as well as our own.
I was responsible for composing the scene lighting and several visual effects for the scene. I created the skybox by tweaking the colour values in unreal to achieve an orange glow, then using an orange directional light to cast an orange glow around the scene. This initially created a problem in which the scene was far too bright. I fixed this by adding an Exponential Height Fog module to the scene, which added a volume of fog around the map, balancing the light whilst creating a hazy effect around the track.
I also tweaked the post-processing values, as in some sections of the track, it became too dark to see properly, which is crucial in the context of a racing game. To fix this, I disabled automatic exposure compensation, which stopped the scene from darkening further in darker sections of the track.
The result is a track that is well lit to the point of being drive-able, without compromising on the harsh volcanic theme of the scene.
I also created various emissive materials to be used across the scene. These needed to be created in Unreal, as Blender's emission is non--compatible with Unreal. The solution was to multiply the albedo by your strength step, then plugging the result into the output material's emission.
I created a smoke particle system using Unreal's Niagra system with the Niagra Fluids plugin. Using this I created a physics-reactive smoke system for the scene. There were two primary issues with this system, it's demand for processing power, and it's lack of scalability.
The first problem was fixed by adjusting the particle resolution, as well as overriding the particle quality to use the Engine's overall quality scaling. This would alter the level of detail to prevent the particles from lagging the scene overall on lower end PCs.
The second problem was fixed by writing a custom expression, that caused both the particle bounding box, and the particle sprite, to scale relative to the Engine.Owner (the blueprint actor that the NST was attached to).
I was responsible for drawing and adding decals to several models and scene elements. For this I used two methods.
The first method was carried out in Blender on smaller models, and involved importing an image as a plane, then adding a subdivision surface modifier (for proper deformation), and a shrinkwrap modifier, with the target set to the object you wish to wrap the decal to. I used this method primarily on my racing vehicle.
The second method was used on larger scene props, and involved creating a decal volume in Unreal. This was done by creating a new material, setting the domain to deferred decal, and the blend mode to translucent. Then you can plug your decal image into the albedo, and an opacity map for your decal into the transparency. The result is a material that you can simply drag into the scene, which creates a volume in which any mesh that intersects will have the decal applied to it. Any objects that you do not want decals to apply to can have their materials tweaked to not receive decals.
The track is by far the most complex model in the scene, and as such, went through several iterations throughout development. Initially we were planning to create modular pieces of the track that would snap together, however, due to the sheer scale of the map, we decided that this would be much too time consuming.
The second iteration used a small track segment that was extended using an array modifier, set to fit a bezier curve that shaped the track. I then used a curve deform modifier to deform the array of track segments to the curve. The key issue with this method, is that any changes to the track would require a complete reconstruction of the bezier curve, followed by reimporting the track. As this setpiece was subject to so much change, we opted to scrap this method in favor of using Unreal's landscape splines.
Using landscape splines we were able to create a track that we could reshape at will. The result of this was a track that was much easier to test and modify on the fly. We were also able to add additional sections such as the tunnels to the spline with ease. Another major benefit of this, was allowing us to use PCG graphs to automatically populate the tracksides with elements such as street lamps.
We used Jira to track our team's progress using the Scrum project framework. Large tasks were broken down into week long sprints. At the start of each week, we would host a sprint meeting in which we would evaluate the work of the previous week, and assign tasks to each group member based on their skill set(e.g. modelling, texturing). As a member of the scrum it was my responsibility to update my own assigned tasks, and coordinate with the sprint leader to ensure that all my work was completed in time for the next sprint meeting.
We used Github as a tool for source control. This allowed each member to work on the project simultaneously, whilst also providing backups in the event of file corruption or merge conflicts. As the admin of our Github organization I was responsible for creating repositories, as well as managing merge conflicts and any potential reversions that took place