Olivia Curelariu showed us how to create a kitchen with mid-century vibes using ArchiCAD, Substance software, and Unreal Engine.
In case you missed it
You may find these articles interesting
Hello, I am Olivia, a 33-year-old, self-taught, aspiring 3D Artist. I graduated in Architecture and Urban Planning in Romania in 2012. I practiced Architecture for around 6 years, during which I obtained my Full Architect License. Then, I decided to change careers and find a new path for myself.
My journey into the 3D industry started in 2019. I began learning about some software artists use and I made my first 3D prop. Ever since I have been expanding my knowledge: from software and workflow to following lots of artists and keeping an open eye on how the industry is evolving.
At the moment, I am working on building up my skills and portfolio. I am trying to make my break in the industry with my first 3D Artist job. I find this is quite a challenge, seeing that even entry-level jobs look for someone with a couple of years of experience in the industry.
Retro Kitchen Journey
For me, it's actually funny how this project came to be. I had decided upon making a small kitchen scene, so I could sharpen my modeling and texturing skills. But I was thinking of making a rather small diorama. I kept seeing so many cute ones on ArtStation. I had only done simple props before and I wanted to step up and expand my learning.
One day, completely random, I walked past a well-known appliances brand store, and I saw these beautiful-looking appliances. There was this colorful and very eye-catching line on display, and I thought: I need to make one of these. So, I decided to make a kitchen corner where I could display these pretty appliances.
By this time, I was still getting accustomed to the game asset creation workflow. So I would take on a couple of these appliance props, one at a time until I was comfortable enough to deal with the whole scene. So I did these props first: the toaster, the mixer, the fridge, and the stove.
While doing these props, I started dealing with, what was for me one of the most important decisions: what kind of kitchen do I want? I knew for sure I didn’t want the modern kitchen, the clean architectural visualization one. I started to spend a lot of time on Pinterest, researching styles and designs. By the end of this long process, I was set to make a mid-century vibe kitchen. I started to save references of kitchens, vintage and new-retro layouts, and objects.
I tend to be organized both in life and in the work style. So I made a checklist spreadsheet with everything I wanted in my scene. I also made notes to myself there, so I won’t forget certain things.
I got some constructive feedback for my Retro Props. I planned to apply it once I got to assemble the scene, so I made some notes from the start. Along the way, I deleted some things off the list and put in some new ones. But it was very helpful to be able to keep tabs on things.
I divided everything I would work on into 4 big categories. These are: General/Room, Appliances, Furniture, and DecoAssets. I followed this “order of things” throughout the project: from folder structure to Maya layers and Unreal Engine content browser organization.
I organized my references the same way, each saved image would go in the appropriate folder. I used PureRef for viewing my references. Now, I am working on a not-so-new laptop, so I saved more reference PureRef files so that it won’t lag on me. Sometimes I would have more assets in a single reference file, other times I made a file just for a single asset.
Although I am sure this is not a common practice, I did the general block out for the scene in ArchiCAD. Given my background, I wanted to design a functional layout, while being very efficient in doing so. After sketching some drafts, I built my block out in ArchiCAD. It’s a very useful tool for designing spaces quickly and for getting a feel of the space one-designs.
After I finished the kitchen’s design, I exported an OBJ file for Maya. I combined my meshes into my chosen categories and put everything on a layer. I could always review the initial design, having the control to hide and show only some parts of it.
From here on, I followed the typical pipeline for asset creation. I worked in separate Maya files for a lot of the assets. I brought only the final low poly models into an assembly scene Maya file. For most of the assets, I first made a block model, then moved on to the high poly model, low poly model, and then to the UV’s.
I started with the assets for the room: walls, doors, windows, then moved on to the furniture, the rest of the appliances and I left the decorative assets at the end. The idea was that, if needed, I could stop after some decorative stuff, if I felt it was too much. I didn’t. I managed to populate my scene everywhere I intended to. Even if it got tiresome at some point, I would remind myself how much work I had already put into this scene. I wouldn’t want it to feel incomplete or void of feeling and then have so much work go unnoticed. I know sometimes people look only for only a fraction of a picture and then scroll past. So if the scene didn’t give the right feeling in that fraction, people might not stop to look at the full project. Also, I wanted to create the pretty kitchen I had set up to do. Now, I’m happy I pushed myself all this time.
Besides the hard surfaces that I got quite comfortable doing, I worked on certain assets that made me move past the simple Maya modeling.
First of all, I got to experiment with photogrammetry. I did 3 such experiments with the small loaves of bread. First, I read Bertrand Benoit’s introduction guide on how to approach photogrammetry. And I looked at many YouTube videos to see how other people use Metashape. I found Frank Pereira’s playlist especially helpful. The first bread was a bit of a headache, but the next ones were easier to do.
After getting a pretty good-looking high poly model in Metashape I exported it for ZBrush. I also exported the albedo texture I built here.
In ZBrush, I first dealt with getting a clean high poly mesh. I duplicated the model from Metashape and used ZRemesher for a clean topology. I added subdivisions and used the Reproject tool to get a detailed look of the initial mesh. I made manual corrections where needed, switching between the division levels. Then I made the UV’s, using the UV Master Plugin and I applied Polypaint from the imported albedo texture. I used the highest level of subdivisions as the high poly model and the lowest as the low poly one.
I knew I needed to dive into Marvelous Designer if I wanted my fabrics to have a natural, realistic look. There are a couple of models that I used MD for: the curtains, the towels, the cushions, and the upholstery (for the mattress, the chairs, and barstool). I had only used this software once before, and that was to simulate the fall of a simple cloth in my breadbasket. I needed to familiarize myself more with the software. I checked out many of FlippedNormals and Mike Hermes YouTube videos on Marvelous Designer.
I also want to mention here Jade Law’s Marvelous Designer Preset Guide, because it made my decisions easier in regards to which types of fabrics I should use.
I started my work in MD with the towels. My first challenge here was finding the right pattern so that I could fold all the edges and apply sewing correctly. After I got the basic towel right, I kept making copies and started to fold them. I had two stacks of folded towels and one towel on the oven handle. For this last towel, I imported the oven’s door as an avatar so I could get the folding right in relation to the door.
Then, I exported the towels to ZBrush. Because the OBJ files came with very clean UV’s I used the decimation process to get my low poly meshes.
Before doing the curtains in MD, I modeled the curtain system in Maya, so I could have an avatar as support. I needed to know how many hooks I needed for each piece of curtain and where they would be placed. After I was done in Marvelous Designer, I imported the meshes to ZBrush, where I would apply small corrections and make the low poly mesh.
I loved working on the cushions in MD. It is very satisfying to see real-time applied pressure at work.
The circular cushion started from 2 circular patterns that I sewed together. I made two different fabrics for the top and bottom, so I could apply different pressures to them. I pinned the middle of the top pattern and pushed it inside in the 3D view. For the lines along the top, I played with fold strength and angles. I made the middle button in MD using the button tool, but in the end, I decided not to use it, because it would simulate bad when I dropped the cushion on the mattress. I redid the 3 buttons for my 3 rounded pillows in ZBrush, before I made the low poly meshes.
For the square cushion, I used a very inflated model with a more relaxed cover on the outside. I made a prototype pillow that I duplicated later on for different positions and poses. The challenge here was to work with one cushion at a time, everything else being either frozen or deactivated because my laptop wouldn’t have managed to work on too much at a time.
After I had all the cushion prototypes, the next step was to simulate them in place. I imported the low poly meshes for the mattress, walls, and curtains as avatars - to make sure the simulation will follow precisely the surroundings.
I found MD works better if you have more powerful workstations. I work on a 4-year-old laptop, so I kept the particle distance high enough right until the end, so I’d get faster results. I also used GPU simulations, instead of CPU ones. I kept saving my files very often because the software would keep crashing on me.
For textures, I used Substance Painter, Substance Designer, and Photoshop.
While I was putting together the scene assets, I did a material for the floor tiles in Substance Designer. I published it and I got some nice feedback. After I assembled the whole scene in UE4, I applied this feedback. And I optimized some nodes here and there. I knew from the start I would use this in my Kitchen and I exposed many parameters for easy handling.
I installed the Substance plugin in Unreal to see how I can work with Substance software there. But, my laptop was very slow to make live changes on this Substance. Maybe I had too many parameters exposed, maybe it was my laptop that lacked the power to handle this appropriately, maybe a little bit of both. Either way, after this experiment I decided to build a classic material using exported Texture Maps from SD.
I had to duplicate some assets in Unreal, which meant I needed to find a way to prevent their textures from looking too repetitive. And I knew making different texture sets for a single mesh wouldn’t be a very elegant way of solving this. Having no idea how I should approach this, I wrote on the r/3Dmodeling subreddit asking for guidance. I was given 3 techniques, all of them applicable directly in Unreal Engine:
- World Aligned Textures
- Vertex Painting with Height Blended Materials
I remember being so excited about having these options, I barely slept that night. I kept making plans of how I would get to try each of them. I’d try working with World Aligned Textures for the Walls, Decals for the cabinets, and Vertex Painting for the tiles. In the end, I didn’t follow this plan completely.
I found the Vertex Painting solution perfect for the floor tiles because I could hand paint certain areas to have a dirtier look. I’m talking about the intersections of the floors with the cabinets or other pieces of furniture, places that one could miss a cleaning. I could break texture repetition anywhere. So I went back to SD and made 2 versions for my material. The base material would be a little cleaner, but still retaining some wear and dirt. The other version would be a lot dirtier.
I have set up a master material for Height Blended Materials in Unreal. I found Ryan Manning’s YouTube series straight on point for this.
I also needed to go back to Maya and redo the floor mesh. After some tests, I chose to make a 2.5m x 2.5m asset for the floor, on a 50x50 edge grid. I would duplicate this asset in Unreal to get the whole, continuous floor. I did this because I needed more vertices for the Vertex Paint to look organic and not blocky.
I did all the baking in Substance Painter, at a big resolution, even if I knew I would save some textures at a smaller one. I worked with higher textures sizes in SP, because it would be easier to scale things down than otherwise. I used Photoshop mostly to make Mesh Maps corrections. For most of the materials I had a 3-way approach:
- The Base - a clean pass of the material (including, if needed, some faint color variation)
- General Wear and Tear (dirt, scratches, indentations) - most of which were as procedural as possible by combining layer effects and blending modes
- Specific Details - the final touches that I would paint manually
Throughout the project, I saved many smart materials and re-used everything I could, so I wouldn’t have to start making every material from scratch. Working as non-destructive as possible, the base materials were easy to adapt. I just needed to adjust masks and transformations and only hand paint certain details.
For example, I saved a metal material I did for some piece of furniture and re-used it in most of the places that had grey metal parts.
I always kept in mind how I would use each material, what was worth doing in Substance Painter, and what in Unreal. For example, I knew I would place 2 or 3 lamps over the bar area. And wanted them to bring a dash of color there. So after I textured the lamp in SP, I changed the base color for the outer coating to white, so that I could apply different colors for it in Unreal. I exported a black & white mask from SP and I set up a lerp node with this mask plugged in alpha for the final Base Color. I used the Base color texture from SP and a 3 Vector Parameter to apply the final color on the outer coating.
I find Substance Designer a very powerful and interesting software. I used it to make my workflow faster by creating some procedural patterns, that I could have control over in Painter. I did patterns for the curtains, for the atomic starburst for the plates, and for the pillows drawings. After I did the patterns in SD (with a couple of parameters exposed), I published them as Sbar files and imported those in SP as base materials.
General Color Palette
When I was doing my research for the kitchen style, I stumbled upon a wonderful kitchen renovation project. I absolutely loved the color palette they used. I made my floor tile pattern (Tugboat Tiles) after this project. And I even replicated their “Bagels” painting into my scene. Of course, this is a very clean and full of light project, and I wanted a rather different vibe.
My kitchen has more contrasts and is a little darker. I wanted to give it a tint of the famous vaporwave aesthetic. I didn’t go for the “abandoned”, overly damaged room you see in a lot of games. I wanted it to feel as if someone is actively using this kitchen. Some assets have a more vintage look with more damage as if they were there for a long time. And some assets are shiny and pretty because they might have been bought more recently to replace their older counterparts.
Most of the furniture and appliances revolve around Retro Blues and greys. So, I used complementary colors as accents for a lot of decorative assets.
And since I was doing a retro scene I couldn’t help myself from hanging an amazing Syd Mead work in the dining area.
Final Scene Assembly
I started my work with ArchiCAD, so I already created the main composition layout. I am talking about the big shapes that define my scene: room elements, furniture placement, and even some details like curtains and lamps.
Before finishing all the low poly meshes and textures, I had already set a new Unreal scene, with the ArchiCAD block-outs.
I mentioned earlier that I had a Maya file, where I would place all the low poly meshes. I placed some meshes directly on their final position. I wouldn’t need to adjust their position at all in Unreal. These were: the general/room assets, most of the furniture and appliances, even some decorative stuff. Meanwhile, I placed other meshes in the 0.0.0 origin. This is the case for the assets I needed to duplicate and manually place in Unreal. I’m talking about the cabinet assets, the dining chair, bar stool, the TV, and many decorative assets.
In Maya, I grouped my assets in certain ways, of course, following the 4 main categories. Each category had a single material in Maya, so I’d avoid cluttering in Unreal at import.
In Unreal Engine, I kept the Content Browser and Outliner very clean. I organized everything by type of content and by one of the 4 main categories it fell in.
I saved a new Level Map for my final scene.
I made sure all the static meshes were in place. I had only placed a Skylight until this point, to be able to see what is where. Now I could start putting more lights in the scene.
Most of the materials were one of these 3 types: opaque materials, translucent materials, and fabrics. I made some Master Materials for these and then only adjusted instances. I learned this is way cheaper than having a different material for each asset.
When I was setting up materials, sometimes I’d realize I wasn’t satisfied with some textures or missed some details here and there. So I would go back to Painter, make the adjustments, reimport the textures and then check if they looked better.
Besides the Height Blended Material that I previously mentioned, I only had a couple of more special materials.
First, I had the flames under the boiling pot. This is a simple material for which I plugged a Simple Grass Wind node in the World Position Offset. I played with the instance’s parameters like wind intensity, speed, weight, emissive, and opacity until I got the right look.
The animated TV screen is another material that was different from the others. I wanted to have an old TV vibe, with a test card on the screen, while being able to see the pixels when you approached the TV. I followed some of Steve’s Tutorials on UE Materials on YouTube, for this.
I used a Lerp node to switch between a TV test card texture and a Pixel texture, depending on the distance one is from the screen. I used the Panner node, twice, to get the static animated lines on the screen. I made an instance for this material, so I could adjust some settings in real-time, till I got the best outcome.
In the end, I used decals to add details to the cabinets, walls, and wall tiles. First, I downloaded some free decals from textures.com And I made a Master Material I could use for all the decals.
I used a couple of Particle Systems to give dynamics to the scene.
I had a Steam Particle, for the boiling pot. I took this particle system from the Starter Content and changed it until I got the right look. I needed to give the illusion of it being pulled up by the hood. I adjusted most of the settings in its modules. And I chose to kill the actor on collision.
At some point, I realized I needed to make the steam look as if it’s struggling to come out from beneath the pot’s lid. So I added a small transformation animation (in the master sequence I set up for the movies) to the lid and placed another steam particle there.
I used smoke-like steam for the chicken tray and the lit toaster slots. The particle system in itself was quite simple. I used a Flipbook animation approach for the materials of this particle system. I got a simple smoke *.PNG image and I used the Liquify tool in Photoshop to create a Flipbook Texture.
I also used some ambient dust particles. Again, the starting point was the particle from the Starter Content, which I kept tweaking until I got the desired look.
The general light sources that I used were a skylight, a directional light, a sky sphere, and an exponential height fog (with the volumetric option enabled). I enabled real-time GI, by modifying the “lightmass.ini” file, then I enabled “Dynamic Indirect Lighting” for the directional light.
In order to prevent light from leaking through the walls, I made an outer box in Unreal that surrounded my room. I used one big box brush and 2 smaller ones that I subtracted the window areas with. Then I made a static mesh out of the result. I placed a Lightmass Importance Volume around my room. I also put an Infinite Extent Global Post Process Volume.
Before adding other light sources I checked my Lightmap Density. And I changed the lightmap resolutions for some meshes until I got a uniform look all around my scene.
I already made emissive materials for my Static Meshes light bulbs. And I enabled the “Use Emissive for Static Lighting” option for them. But these weren’t by far strong enough to light my scene, so I added a spotlight for each physical light bulb in the scene. For these, I adjusted the intensity, light color, attenuation radius, cone angles, and source radius.
At the very end of the whole rendering setup, I decided to add some key lights. A couple of these were point lights that didn’t cast shadows, had very low intensities and a small attenuation radius. I also added some small intensity spotlights to brighten some things: like the sink, the bar area, and the TV.
I checked out Sjoerd De Jong’s Unreal Presentation for a general idea on how to approach volumetric fog. So I knew in order to get some nice-looking god rays I should work with the directional light and the exponential fog actor.
I adjusted some of the fog actor’s options. I cranked up the volumetric intensity for the directional light and tweaked the light shaft options. I also used the volumetric scattering with some spotlights: the ones over the bar and the stove hood.
The main challenge here was finding “the right amount” of fog and light. I didn’t want to get diffuse fog around my room, but I needed enough fog to be lit by my lights. And I keyed a couple of parameters for all these actors in my Master Sequences, so I could adjust them for each movie shot or render.
I chose to use a single Box Reflection Capture actor, instead of placing a multitude of Sphere Reflection Captures.
I spent a lot of time setting up this volume. First of all, I made the adjustments to the Lens and Rendering Features. Playing with the Color Grading settings was one of the final things I did before getting my HiRes Shots and rendering the movie.
I found it a challenge to get the right balance between exposure, bloom, and ambient occlusion. In the end, I keyed some of these settings in my Sequences, because some shots needed different adjustments than others. I chose to control exposure settings for my cameras through the Post Process Volume instead of doing this for each individual camera. By doing so, I would be more efficient in making adjustments in the Sequences.
I achieved a retro look by making adjustments to some Color Grading Settings.
One thing I learned the hard way was that some things might look different on the screen than in a High-Resolution shot.
At some point, I thought I was ready for the final renders. I took a couple of HighRes shots but realized there was much more bloom in my renders than in the Editor. Turns out the engine calculates the bloom according to the resolution. So if I take a shot at a higher resolution than the one I am actually viewing it at, there will be more light information there, thus more bloom. So I was back again at making adjustments both for the render sequences and the movie ones.
I chose to work with Master Sequences for the movie shots and with Level Sequences for the renders. Most of my cameras are 16:9 DSLRs and all of them are looking at tracker actors. I find it’s very efficient to make fine composition adjustments when working with trackers. I would only adjust focus settings once I was sure all my cameras had gone through reviews and had optimal compositions.
For the Renders, I made 7680x4320 High-Resolution Screenshots, using the MSAA anti-aliasing method. Then, I halved the resolution in Photoshop, using Bicubic Smooth Gradients. The result was a better-sharpened render than if I were to render it directly at 3840x2160 from Unreal.
I captured the movies, one shot at a time at 3840x2160 resolution. I used the Temporal AA anti-aliasing method for smoother transitions.
Challenges and Optimisation
One of my main challenges throughout the project was working on a less powerful computer. I work on a 4-year-old laptop, pretty decent for his time, especially for simple architecture work. But for what I am using now, sometimes it’s barely enough and I’m learning to make compromises.
From the start I kept in mind I’d need to put everything together in Unreal. There, I’d have lots of meshes, materials, particle systems, I’d need to build lights and test things. So I knew I needed to optimize whatever I could and work very organized.
I tried to keep a low triangle count for my meshes, while still maintaining good silhouettes. However, at times, I found I missed polygonal sides on some meshes. I would go back to my final Maya scene, add some edges where necessary, and export the *.FBX again for Unreal.
In the end, in Unreal, the complete scene had a total of 437k triangles. The first 3D asset I made in 2019 had 106k triangles. I did use this prop in the current scene, but I optimized it a lot, both by triangle count and texture sets.
I always made sure I packed my UV’s very neatly. I even combined some meshes to use the UV space as efficiently as possible.
In regards to the textures, I initially saved some unnecessary big resolutions. In Unreal, I capped a lot of them at different maximum texture sizes. And I realized I could save and use many at lower resolutions. Which is exactly what I did. So Unreal wouldn’t waste resources loading big textures only to show them smaller.
You can see below the final assets I used in my scene, with and without materials applied.
I tried working with UDIMS. I needed this for the big continuous metal countertop. And I wanted to do it for some of the cabinets as well. I made one set of UDIM textures for the whole countertops and one for the whole metal cabinets layout. I baked my meshes. I made some textures, imported them in Unreal, and made them Virtual Textures. But things didn’t turn out too well.
Unreal started lagging and some normal maps made a lot of banding artifacts. These are very big surfaces, right in the middle of my scene. Having banding there was unacceptable. I tried re-saving my Normal Maps on 16bit instead of 8bit, changed the formats between TGA and TIFF, dithering or no dithering. Nothing I tried solved my banding issues. This issue, on top of UE lagging, made me give up on the UDIM approach.
Because of the countertop’s size, material and position, I couldn’t leave it on a single texture. The Texel Density would have been way off. So I cut it. I separated the meshes, repacked their UVs, and re-adapted the textures. The seams in Unreal are slightly visible but this is a compromise I had to live with.
Somewhere earlier, I mentioned choosing the decal solution to add the details and break texture repetition. I chose not to use Vertex Paint on the walls and wall tiles because it would have been more expensive and I could do it cheaper with decals. When I was trying Mesh Paint on the walls I had Unreal crash a couple of times.
I chose to keep the Vertex Paint approach only for the floor tiles. These would have needed way too many decals to add the desired amount of dirt. But for the rest, I could get away with playing with the AO settings and decals.
In Unreal, I kept building the light at a preview and medium settings, until I got a decent overall look. I kept the World Settings at their basic settings.
From time to time, however, I needed to do higher-quality builds. For example, I couldn’t tell if my shadows and AO adjustments are good with a medium build. So I’d try another build with higher quality World Settings. Then, I’d adjust light settings and build again.
I only used the Production Lighting Build and finer World Settings when I thought I had my final lighting setup.
During my work on this project, I had the unfortunate event of my laptop crashing. This has happened while working on the final scene assembly in Unreal.
One day, my UE Project suddenly got messed up. The scene turned into what looked like a poorly lit early 2000 game. Not even setting up lights from scratch worked. Building any lights gave big shadowy patches everywhere. I couldn’t find enough info online to help me figure out what had happened. I read about this happening to other people. For some, the issue got solved by updating some drivers, for some by installing a fresh Operating System. But there those who needed new hardware because their GPU got fried.
So I took a forced break from my project, trying stuff that worked for others, hoping for the best. And it turns out, a brand new Windows install was all it took. Of course, setting everything up again meant a lot of wasted time. But at least everything was working properly again.
Since then, I’m constantly monitoring my GPU and CPU temperatures. Whenever they go too high, I minimize whatever software I have running and I give my laptop a moment to cool off. Also, whenever I leave my laptop I’d open a new Explorer window, for the same chance to drop in temperatures.
I have been working on this project for a long long time. It has been a lot of work. And it has been a great learning experience.
Writing about all these points made me realize how much I’ve put into this project, how much new stuff I got to try. Something I succeeded, sometimes I failed. But in the end, it all makes me proud of myself for having been able to push through, to finish what I had set up to do, and to have learned so much along the way.
What lessons do I get to keep from all this?
- First of all, I got to expand my knowledge about 3D props and environment creation, from using many new tools to optimize the use of others.
- Making a work plan is awesome. I couldn’t have managed to keep up with everything had I not clearly set out steps and checklists. Also, checking tick boxes for completed tasks is very satisfactory.
- It’s important to be excited about the project you’re working on. All along, I had this pretty mental picture of how the kitchen would turn out. So when I felt overwhelmed, stuck or tired, I’d take a short break, visualize what a cool project I’m doing and how happy I’ll be when it will be completed. And then I’d go back to work.
- It’s important to ask for feedback and for help. The internet is full of people who share their knowledge and people who help when asked. But you have to reach out and be open to feedback. And if you don’t get an answer, be persistent and ask somewhere else.
- I’ve learned some things will not always turn out exactly like what you had in mind. And it’s ok to adapt to a new situation.
Last, but not least, I want to thank Arti Sergeev and 80 Level for extending me this invitation to talk about my Retro Kitchen Project. For me, being given this opportunity means I’m doing it right, while also motivating me to keep on pushing and keep on learning.
Thank you for reading all this. I hope it made sense to you and that you could find something informative and helpful here. You can find my works on ArtStation, TheRookies, WordPress, Instagram, LinkedIn, and 80 Level RFP.