My name is Robin Lingmerth, I’m currently a student enrolled in the 3D Art program at Futuregames in Stockholm, Sweden.
I initially came from a 2D concept art/illustration background, and this has turned out to be very helpful when doing projects in 3D as there is a lot of overlap with skills used in both fields.
After leaving art school, I found a job working on a game called “Scrap Mechanic”. Axolot Games helped me get started with 3D asset creation for games and I got a real taste for it. So when I later got the opportunity to attend Futuregames and really dive deep into 3D, I went for it.
In this article, I’m going to break down my “Noodle Bar” project, how it came to be, and some of the things I’ve learned along the way.
I wanted to create a project that would focus heavily on mood, composition, and color-use. It’s tricky because these are pretty ambiguous concepts but I feel that these are some of my greatest strengths as an artist and I wanted to showcase that as part of my portfolio.
To make sure I could show the final composition within 3D space I knew I wanted the final project to be a diorama compatible with a browser-based viewer such as Marmoset Viewer or Sketchfab.
Artstation and Pinterest were really valuable sources for inspiration and gathering ideas and they are usually a great starting point.
After looking through a lot of images I felt particularly drawn to Emanuele Arnaldi’s concept of a restaurant with a lot of charm. The colorful cyan roof and quirky playfulness of the design really appealed to me.
Taking some time to reflect on why you feel drawn to certain pieces isn’t necessarily as easy as it sounds but it really pays off. In my case, the use of a warm color palette with strong accent colors like cyan and orange really made the piece pop and feel inviting.
The sloppy repairs, the chunky and slightly wonky shape-language, and the practical elements such as the trash bags by the back door really gave the scene a sense of story and a lived-in feel.
Rather than just recreating these elements from the concept, understanding how they contribute to the piece as a whole allows me to decide what to focus my attention on and helps if I need to expand the scene beyond the initial concept.
Looking at the initial concept by Emanuele, I felt I wanted to make it work better in 3D space. I wanted to add some more verticality and have objects expand outward more.
So I did a very rough photo-bash/paintover in Photoshop. Some of the initial ideas I played with were to add a wind turbine, expand the verticality of the tree, and to have the restaurant float around on rocks. I even added a flying car for good measure.
But as I started blocking this out in Maya, I realized I had strayed too far from the appeal of the concept. It no longer had that cozy feel and started becoming too much of a sci-fi scene, and objects like the car were drawing too much attention away from the main focus - the house.
So I scrapped some of the more outlandish ideas off like the floating rocks and the vehicle. I felt the wind turbine and the redesigned rooftop sign still fit within the world of the concept and added to the 3D composition of the scene, so I left them be.
Modeling is an iterative process and while Maya is a relatively destructive modeling application that lacks the modifier-functionality of programs like 3ds Max and Blender, it’s still widely used in the gaming industry and it’s the program I’ve gotten the most familiar with so far.
Plugins and scripts can help bring some more non-destructive functionality to Maya and there are still plenty of ways to refine your models as you work on them.
I had some scripts in Maya that helped a lot with modeling and UV creation in this project. One, in particular, is “Shellmod” by Creative Case. It basically recreates the solidify modifier you can find in Blender, allowing you to procedurally add thickness to any face. This was particularly helpful in constructing the roof, allowing me to alter the shape without distorting the even thickness of the roof.
I also found that following a reductive workflow worked well for me in this project. If I’m working with something that’s going to have a smooth/curvy shape I prefer to make a high poly subdiv model and then reduce the poly loops. This lets me have clean surface curvature and evenly spaced edges. It also allows me to better see how little geometry I could get away with before it feels too noticeable.
The smaller props are fairly simple and follow straightforward modeling techniques, starting with basic geometric shapes and using extrude and bevel to get the shapes I needed. Small props are individually simple but when added together, they create a sense of detail and support the grounded lived-in feel of the scene.
When working on a scene in Maya, it can be useful to create a simple lighting setup, just a couple of colored lights to help see how the shadows interact with the geometry. It also has the benefit of giving you a nice looking progress gif at the end. Just bookmark a couple of camera angles and take screenshots of your progress.
By the way, I often found myself wanting to reduce the polycount on circular objects as it can be hard to know in advance how many faces are appropriate. So I developed a technique that worked for me:
Using a simple MEL script (polySelectEdgesEveryN "edgeRing" 2;) you can select every X-number of edges (every two edges in this example). You can then use the Maya marking menu to automatically extend the selection to edge loops and delete.
Sometimes removing half the edge loops gives you the desired results, but other times you want something in between. You can use the same script to select every third or fourth edge and go through the same steps as before. You will end up with an uneven distribution of the edges, but this can be resolved by selecting all the edge loops and using the circularize command.
If you're lucky this will give you perfect results but sometimes you will need to rotate some of the edge loops to align them properly. If you need more control of your rotation you can use the Numpad + and - hotkeys to increase and decrease the manipulator size. This will also affect the precision of your operations in Maya.
Because the scene has a stylized/illustrated look, I wanted the animations to also reflect that. So rather than having everything properly simulated, I animated all the cloth in the scene with Maya's non-linear wave and sine deformers which also made looping the animations a lot easier.
I can recommend putting all the deformer controller handles in their own layers as it makes it easy to hide them. Otherwise, they can be a very visually distracting element while working.
For the umbrella, I painted the weights of the deformer influence and painted out areas where the umbrella would have internal support holding the fabric in place.
In Maya, you can keyframe most properties, so all I had to do was to keyframe the offset attribute on the deformer. If you want your animations to loop just make the offset value a multiple of the wavelength.
To preserve the ambiance of the scene I made sure that the animations were subtle enough not to be distracting. I also made sure to take great care of where I placed the animated elements.
As I said earlier, I wanted to upload the scene using Marmoset Viewer or Sketchfab, so I had to make sure that the animations would play correctly. It turned out exporting deformer animations wasn’t as easy as I initially thought. I had to do some research and I eventually found the answer in Alembic Cashing.
The Alembic file format (.abc) allows you to essentially export vertices position in space over time. Sketchfab supports this file format but you can only have one texture set per object. That was something I needed to take into account while texturing.
During early tests, I had a problem with normals not being preserved when uploaded to Sketchfab. The workaround I found for this was to open my files in Blender and export the Alembic files from there. This gave me the desired results.
I wanted to make this scene as texture-space efficient as I could, so I took great care to overlap UVs as much as possible and make sure that all repeated objects shared the same UV space.
Wherever possible, I would also lay out the UVs in a grid, so most curved objects would end up having straight UVs. This helped a lot later in the texturing process and allowed me to save on UV space. Malcolm Andrieshyn's Gridify script helped a lot throughout my texturing process and has turned out to be a really valuable addition to my toolkit.
The final UV layout was mostly placed by hand. Since I knew I was going to work with a lot of wood textures I also made sure that all UV islands were aligned in the same direction, so that the wood grain direction would be consistent.
My first step in texturing was to create a simple procedural material in SD to emulate the look of the brushstrokes used for the stylized wood in the concept.
This ended up being a very simple material setup with only a couple of nodes but it did save me a ton of time compared to making all these brushstrokes by hand in Substance Painter. Exporting some additional material properties allowed me to use the same material as a galvanized metal, for use on the wind turbine.
I was only focused on creating the albedo/base color and normal textures in SP since I knew I wanted to use Sketchfab to control the roughness and metallic properties.
It can be really helpful to use the Anchor feature in Substance Painter when working with a couple of key colors that are repeated in several places. This allowed me to sync a single color to multiple layers. Anchors don’t work across multiple texture sets in Substance Painter so in order to sync the colors you can use layer instances. With this setup, if I wanted to tweak the colors, I only had to change the original color layer and all the other layers would update "automagically".
I hand-painted the fish kite (Koinobori) and the ground texture but the rest of the process was fairly straightforward. My teacher taught me a very useful texture principle: you should strive towards being able to read the form of an object as much as possible without the help of any lighting.
One of the biggest contributions to the feel of the scene is actually having a purple-tinted ambient occlusion texture - it really helps bring all the colors together and gives it a much warmer feel compared to just having a black AO map.
When I uploaded my model to Sketchfab using the Alembic file format, the second UV channels refused to be preserved. This meant that I couldn’t have a second UV channel without the overlapping elements, and Sketchfab didn't support having colored AO textures.
My solution was to bake the AO into the albedo texture - this allowed me to preserve the color information. The downside was that I had to work around the overlapping UVs. With some strategic masking, I could prevent any areas where the AO would look off, and I knew I could use Sketchfab's screen space AO to make up for areas where too much of the AO had to be masked out.
Lighting and Final Material Setup
I did the final lighting and material setup in the Sketchfab editor.
The lighting setup is pretty straightforward with a single directional light matching the light direction from the concept and a fill light from the opposite direction to give the shadows more warmth. I then also re-used my Albedo textures as emissive textures, toning down the intensity to the desired level. This gave the appearance of a fill/ambient light, but with a more illustrative look.
Lastly, I took some time to hone in on the roughness and metallic values. This was just a trial and error approach, constantly evaluating the materials in relation to each other, even using some half-metallic values.
This has been my biggest personal project so far and an amazing culmination of all the things I’ve learned over the years. I really feel that my previous experience in illustration helped guide me to the final result which I am so happy about.
When you work on a project for some time, it can be really hard to step outside yourself and know if it actually still looks good. Yet, I’m really grateful and overwhelmed by the positive response I received on this project, and it’s given me a lot more confidence in my own judgment.
Thank you so much for reading!