3d artist Emil Skriver explained how he created a super detailed cockpit in Unreal Engine.
3d artist Emil Skriver explained how he created a super detailed 3d cockpit in Unreal Engine.
Hello everyone! My name is Emil Skriver and I live in Grenaa, Denmark. I’m in my first year attending a basics course at 3D College here in Grenaa. My career so far doesn’t extend much further than doing 3d game art as a hobby in my free time, but I hope to change that soon!
My dream is to work at a game company where I get to create sci-fi environments. To me, that job extends way beyond making 3d assets. It’s about crafting compelling stories, creating immersive experiences, imagining fictive worlds and much more. These are general principles that I find important to keep in mind, from overall composition & design choices down to each 3d model and roughness map.
The project itself was an art test I received from MoonMillStudios, located in Denmark, Copenhagen. The concept art is the work of Jeremy Love and can be found here.
I liked the concept and I’m sure I would have made it if I had discovered it myself. The two main aspects I found interesting and important to nail down were the amount of realistic detail and the material breakup. One of the most dangerous things about sci-fi art is the desire to add detail that tends to feel useless and uninteresting, which leads to a break in immersion. An important principle to keep in mind when creating game art is affordance. Emilia Schatz wrote a great article featured right here on 80.lv You can find it here. In a nutshell, you want the player to think all of those buttons and knobs would do something if they were interacted with and I think Jeremy did an excellent job at designing it in a way that does just that.
In addition, material breakup is crucial, especially on a clean looking piece like this , which has very little contrast in the individual materials themselves, but rather in the difference of value in the overall material setup. To make the breakup look interesting I made sure to utilize the full spectrum of pbr, meaning implementing both metals and nonmetals, high and low roughness values , and both light and dark color values. Moreover, it’s crucial to have a basic understanding of how the materials react under real life circumstances. Scratches and bumps looks quite different on plastic than metals; the roughness variation on glass is much different from plastic and so on.
The buttons are primarily simple boxes with bevelled edges. The main things to keep in mind when creating pieces like these are to make sure they are tapering inwards towards the top. Otherwise the normal map won’t have that angle space to add information and you’ll end up with no information at all. If the box is perpendicular to the polygon it’s placed on the rays won’t pick up anything since they are cast perpendicular as well. The second thing to remember is bevel those edges. It’s much more pleasing to look at round edges and besides, keeping it completely sharp looks like amateur CG. Remember to copy where you can and cheat whenever possible. For example most of the buttons have a small indent around them that’s simply floating button geometry with an extrusion around them and the edge connecting the extrusion pushed down. To achieve this extrude the outer edge loop outwards and move it up. Now extrude this new loop outwards and you have an indent that’s going to get picked up nicely by the normal map.
The knobs are all geometry since they poke up too much to look realistic if they were normal information alone. I added small chamfers to the most visible edges to give that rounded realistic feel. Remember to use weighted normals when doing this. To achieve material breakup I unwrapped the knobs so that each part that had a separate material had its own UV shell. I could then move those shells to a part of my trim.
sheet that had that material. This is where cheating comes in handy again. I utilized areas from my reflective metal and the dark plastic parts to add that material definition to my knobs. It was simply a matter of taking those UV islands from my knobs and finding a good spot for them with no interference from the normal map so that it was only the base material that got applied.
From the beginning I had a clear idea about what materials I wanted to use and the importance of making them relatively different to increase clarity and interest. At the same time, I progressively realised how noisy/detailed the entire thing would become in the end, even with relatively few elements. It became obvious that I shouldn’t add too much information into the materials themselves. My baked normal map and the frequency of material separation adds enough already.
I used Substance Painter to make my textures. Smart materials are the essence of my workflow as I rarely start from nothing. I find it much smarter and faster to gather a library of smart materials and use those as my base. One thing to note: always go further than that! Smart materials work great as a starting point but can only serve as a base. Remember that our job as artists is to tell stories and encourage immersion. Generic smart materials can’t do that for you.
My smart materials always begins with a base layer. Here I either use simple base values or simple textures/materials. Next comes detailing. This is where I add stuff like subtle AO dust, dirt spots, roughness variation and so on. For the AO dirt you can come really far by simply using a lighter color and masking it using the ‘MG Mask Editor”. I use the curvature, AO and texture inputs to control my mask. The curvature input depends a lot on the mesh. I found using ‘Mode: Edges’ to work best in my case. To add interesting breakup I used the ‘Grunge Splashes Dusty’ texture with blending mode set linear dodge. For roughness information I love using the surface imperfection texture set by David Gruwier. He made a really nice pack you can download for free on his website. Just google his name.
I wanna quickly touch upon the buttons since they are a very important part of a piece like this. The goal is to make them feel like they belong on the cockpit and that they can be pressed. To accomplish this I used a few simple methods. Adding a tiny indent in the normal map around every button makes it feel like there’s room for the button to be pressed. Without this it looks more like it’s glued on top of a flat surface. Next is to add subtle color definition around each button. All of my buttons have subtle dust around them and AO in their indentation. Finally, in an effort to make them feel pleasant to touch and look used, I create buttons that generally have a higher roughness value than the material around them, making them feel soft and matte. To further emphasize this I added some subtle smooth edge wear.
My overall workflow comes down to creating the base low poly model, where I keep in mind how I wanna place my trim pieces and create topology to make it possible to unwrap those parts for my trim sheet. This means if there’s a panel I want as a piece in my trim sheet I place polygons in such a way that I can make that a separate UV island to apply that trim part to. When the topology is complete, it’s simply a matter of copying those polygon parts one by one to another mesh item and start building the trim sheet on top of that. I know that if I create my trim sheet geo on top of the polygons it’s gonna be applied to later as a texture, it will fit perfectly.
None of the geo I created for my trim sheet is complicated. When everything is baked down to a flat texture there’s no reason to waste time on intricate shapes with dimensionality. Keep it simple stupid! To further decrease my workload I used Modo’s round edge shader to get nice smooth edges in my normal map. This means I don’t have to subdivide anything and therefore I don’t have to care about topology, only silhouette and shape. Almost every part you see is it’s own mesh, but it looks good since Modo’s round edge shader
automatically applies a smooth transition where the pieces overlap. Also don’t bother to model tiny repeating details like holes or bolts, model it once and use it as an alpha in Substance Painter.
This makes it possible to iterate much faster. Reuse alphas from your library. With the new implementation of anchor points it’s perfectly streamlined.
From there it’s all a matter of going through each trim piece one by one, adding details and reusing what’s possible. Create a square plane and align the trim pieces to match. It’s important to refrain from scaling any of the trim parts, since they were created to scale from our low poly. If there isn’t enough space for the trim parts on the baking plane, rescale the baking plane instead. Be as texture efficient as possible and bake that bad boy down to a normal map. I bake the rest in Substance Painter but that’s all preference.
The prop is made to be used in a VR game which means it has to be very efficient. I did my best at utilizing my trim sheet everywhere possible to avoid having to model in details and repeat texture information on my trim sheet. It’s only 8,400 tris and all of the textures are 2k, so it’s perfectly suited to work in a game. I used the VXGI branch from Nvidia since it enables me to use their impressive specular solution to generate realtime reflections and HBAO which is a voxel based ambient occlusion method that looks great! It’s much more accurate than the regular SSAO.
To display the prop in unreal I created a level with a showcase blueprint made by Osman from the unreal community. It’s quick and easy to set up and comes with some nice hdri presets. There’s an option to add your own hdris as well. It can be found in this thread on page 3 post 35.
My light setup consists of one key light, one secondary light and 5 tertiary lights. I used a directional light to generate the key lighting coming slightly angled from above with the temperature set to 2000 to simulate some kind of reddish light. The secondary light is a neutral spotlight which illuminates the center of the cockpit. My tertiary lights don’t contribute too much to the overall illumination but instead simulate environmental lights. I made sure to place them so that they contribute to interesting specularity play across the cockpit materials. Also , having warm and cold lights on opposing sides works well to add visual interest.
The material in Unreal is using two texture coordinate nodes to set the trim sheet textures to use texture set 0 and the tiling plastic textures to use texture set 1. Im using the parallax occlusion mapping function for the trim sheet. I used the ‘Normal to Height HQ’ node in Substance Designer to make my heightmap from my normal map. When doing this remember to set it to High in quality and increase the Relief Balance to 1. This will give you the most accurate result. The albedo texture has the transparency mask for the trim sheet in its alpha channel. I use this through lerps to mask between my trim sheet and tiling plastic texture.
I’m by no means a great designer and since it’s not my concept I might not be the right person to answer this. I would say go look at other great designs and figure out why they work. Study design and apply that knowledge to your art. Make sure your art doesn’t feel too generic and don’t add detail without purpose. Ask yourself questions like “ where would this be placed?“, “ what kind of person operates this?”, ”how old is this thing?”, “ what properties does this thing have?”, and so on.
For games the trim sheet technique is invaluable and already widely used. It’s very texture efficient since it’s possible to texturise an entire scene with very few materials. Also , it constraints the creative possibilities to the elements on the trim sheet. This is very important especially for sci fi games where a hallway or spaceship would be manufactured with similar techniques and pieces. If everything is unique it doesn’t feel real and grounded in the world. This goes back to the old saying: less is more!
Tech wise it’s easy to implement. All major game engines support 2 UV channels and lerping between textures, and that’s pretty much all you need to get going!
This project is a big milestone for me and I’m overwhelmed by the positive feedback. I hope this article gave you some insight into this workflow. if you have any questions or just want to say hi feel free to send me an email.
Thank you to 80.lv for letting me write this article. It’s great to finally give something back to the best community ever! Good luck with making awesome art.