Panasonic NV-M3 Camcorder
Game-ready hero asset rendered in real-time using Unreal Engine 5.3
To push my hard surface modelling and optimisation skills, I decided to create a realistic real-time model of an NV-M3 camcorder.
Using laser and photogrammetry-based scans of the device as reference, I created an accurate highpoly model, which I retopologised and UVd using Blender.
I then textured the model using Substance Painter and rendered it using Unreal Engine 5.3.
Production Process
Reference
Unlike most of my previous projects, I was able to obtain physical reference for this model which I had access to throughout the project.
This offered me immediate access to first-hand texture, surface and scale reference.
Having physical reference also allowed me to take high-quality (8K) reference photographs in a controlled setting.
These were compiled into a Miro board I could refer to throughout the project.
The board also contained a plethora of secondary references, including teardown videos and original marketing material.
Blockout
Having gathered suitable reference material, I began modelling an initial blockout.
By using a camera with known lens properties, I was able to effectively undistort the photographs and combine them into a sprite-style asset.
This was particularly useful for ensuring consistent and correct scaling of the model.
Key shapes in the blockout were colour-coded to represent areas which would be modelled independently.
8K photogrammetry
Being in the unique position of having access to the physical model I was creating inspired me to attempt to generate a more detailed blockout through scanning.
I first attempted this through high-resolution photogrammetry, as this was a technique I was familiar with.
Although the result was generally useful for some texture reference, it was largely inaccurate and suffered from significant distortion.
If I was creating an organic or (low poly) background asset however, this technique could be used to reduce overall production time.
Laser Scanning
After completing the photogrammetry, I was suggested to contact another department in the University which had access to a laser scanner.
Using the Laser scanner allowed me to capture the model in remarkable detail with relatively little distortion.
That isn't to say that the model didn't have its own issues.
Just like photogrammetry, transparent and reflective surfaces could not be registered by the scanner, nor could crevices or screw holes.
Interestingly, some colours also presented as displacement effects on the geometry due to the scanner's depth calculation method.
Highpoly Model
Approximately 9,982,000 Tris
Due to its flaws, the scan could not be used to directly substitute a highpoly model.
Instead, I used the scan largely as reference and, in part, retopologising some of the more accurate elements.
This helped ensure I included all the relevant detailing whilst maintaining consistent scaling throughout.
Making use of the scan significantly reduced the time requirements of the highpoly modelling phase.
Lowpoly Model
52,000 tris
Because I was creating a Hero Asset, there were no significant limitations from the brief regarding tri count.
However, I always strive to create quality pieces of work without compromising on efficiency.
To this end, I saught to lower the tri count as much as possible without significantly affecting the visual quality of the asset.
Each time I made significant modifications to the topology, I tested baking the normal maps.
This identified any areas which would likely create visual errors due to insufficient topology.
Testing displacement and pixel offset alternatives, I found that both methods had greater performance impacts than using higher tri counts.
A small amount of additional topology was necessary for the model to display correctly in the Marmoset viewer, making it 53,239 tris.
UVs
To create the UVs I separated the asset into its three main components: the lens, the body, and the attachments.
Creating three separate texture sets for these areas allowed me to vastly increase the texel density.
UVs were straightened in areas where the result did not incur significant texture distortion, increasing UV space efficiency.
As most of the asset was unique and required unique textures, very little of the UV space was shared.
Group IDs were implemented for the different meshes, having mesh with similar normals or materials share groups.
Taking this into account when packing allowed for tighter packing, as the textures required less dilation to reduce bleeding.
Textures
When creating the textures for the asset, I first separated the model into areas made of similar materials and base colours.
These largely lined up with the texture groups I had previously created, making the process relatively straightforward.
Normal, Ambient Occlusion, Curvature and ID maps were baked using the Highpoly version of the model in Substance Painter.
Initially, I applied contrasting colours to better visualise the different panels before replacing these with colours based on the key reference.
With access to previously captured high-resolution photographs, I was able to project elements such as text onto the model.
Wear was added independently, and large portions of the text were touched up in Corel PaintShop Pro to achieve a suitable final quality.
Throughout this process, the results were compared to the physical reference and original marketing material.
I did not aim to replicate the physical model's exact wear, but by comparing it to its digital counterpart, I believe I achieved an impressive level of realism.
Exported Ambient Occlusion, Roughness, and Metallic maps were packed into a single RGB texture for optimised use in Unreal Engine.
Substance Painter
Screen Captures
The window portion of the asset was given an opacity mask, which could be exported from Substance Painter; however, due to the limited time on the project, I chose not to include it in the Unreal Engine renders, as it would have required modelling additional internal components and assets.
Lens Shader
By combining internal geometry and a custom node-based shader, I was able to create an efficient, visually appealing camera lens effect.
When layering the shader, there would be a compounding effect on its complexity.
Therefore, having the instruction count as low as possible whilst limiting the number of internal layers was paramount.
The final version of the lens had an instruction count of 166.
Several of the deeper layers made use of dithered masked opacity to maintain the appearance of transparency at a fraction of the cost. Doing so also had the benefit of minimising the compounding complexity.
UE5 Setup
I imported the Camcorder asset into UE5, setting it up with the exported textures.
Unnecessary features such as decal response were disabled for this material to increase its efficiency.
With the asset setup in Unreal Engine I began to create a simple blockout for the desired environment, a loft (or attic).
Environmental Research
As the project focused heavily on the Hero Prop itself, I wanted to ensure that the final renders did the same.
To that end, I needed to ensure that the environment did not detract or distract from the asset itself.
I had a few initial ideas for this, including a garage and a car boot, but I eventually settled on a loft.
A loft would have few asset requirements and, from my preliminary research, required a minimum of two additional assets.
It was also the most narratively logical choice, as most of the remaining Camcorders of this era are in lofts, museums and landfills.
Just as with the Hero Prop itself, I gathered references from a variety of sources including video footage.
Environmental Assets
I identified two assets which were essential to creating the environment, boxes and wooden planks.
These assets were purposefully simplistic, being little more than textured cuboids.
Helping to achieve the goal of an environment which supplements the Hero Asset.
Unreal Engine Renders
To prove its performance and efficiency, all screenshots and renders were captured in real-time using a GTX 1080 from 2016.