Introduction
This blog post will serve as a retrospective and accounting of my creation of the piece "Captain's Quarters". I would like to thank my beautiful and patient wife, Roslyn, for her invaluable help, insight, and support. I would also like to thank my good friends Pearce Pachuta, Harrison Pachuta, Rachel Strange, Tom Lerner, Chloe Tibets, Will Engels, Michael Svymbersky, as well as many others for their help, critique, patience and kindness. You are all wonderful.
With that out of the way, a short backstory of the project. Sometime in mid-2022 I had a conversation with Mike, an artist friend of mine, who suggested I work on a new portfolio piece. One that would really showcase the upper limits of my artistic skills, rather than just my capacity for production work. I took this advice to heart and began the process of making a piece that would push my limits, both artistically and mentally. The result was around a year and a half of on-and-off work and a product of which I am supremely proud of.
Concept and Planning
I have always found early 20th century interior design to be simply stunning in its elegance, luxury, and material. This became my first criteria. Secondly, I wanted to showcase my capacity for creating a complete interior environment, rather than individual models like my previous work. With these in hand, I scoured the internet searching for suitable concept art from which to draw on. Eventually, I stumbled upon the DeviantArt of one Vladislav Voskresensky.
This wonderful piece of art simply spoke to me. Link to original. The way the artist portrayed the space, composition and materials made this stand out to me amongst all the rest. Picking concept art is no small deal. To do a proper job on an environment like this requires real effort, and I was fully aware at the time that I would have to stare at this piece for potentially hundreds of hours. Given the opportunity, I make sure to pick something I like. Or at least something I'm willing to be with for an extremely long time. To me, to do a concept justice, one must strive to understand it equally if not more so than the original artist. This was my intent in approaching the original by Voskresensky, though I claim no such feat.
Having selected my concept, I set about planning my work. I tend to be rather disorganized in my day to day life, but fastidious as can be when it comes to my art. I have worked on enough projects where poor planning led to dozens of extra hours of work down the road, so I ensured that I knew exactly what I needed as early as possible. Establishing the scope of work prior to beginning production is key. Things will change, they always do, but at least you have a plan.
I began with a rough plan for the project. Nothing particularly fancy, just a Photoshop file where I listed out which props I would need to build, what materials I would need, and what my overall pipeline would be. Its not like I wouldn't know what I needed to do, but I find having things written out, even if they're obvious, is of great help to me. And, considering I created this image before I laid the first vert down, I stuck to it surprisingly well. A few things changed, and a few things went out of order, but overall the planning was worthwhile. I would simply cross things off the various lists with a brush as I got them done. That really helped me stay on track and keep me motivated, to see the things that I had already accomplished. To give a sense of timeline, this Photoshop file was created on June 2, 2022.
Blockout
Once planning was completed, I was eager to sink my teeth into Unreal Engine 5, which I had selected as my composition and rendering engine for the project. A further discussion of this decision and its ramifications will be found later. I started production proper by blocking out a crude scene in UE5. My plan was to start a blockout in Unreal, then replace each part with a complete model as I finished them, prior to texturing. I also decided to separate the modeling and texturing steps so that I wouldn't be handicapped by sloppy early texture work. Get all the models done, then get all the textures done. Plan for cohesion. It sort of worked out like that.
This shot shows the earliest work that was done on the project, which I made using Unreal primitives as well as the rudimentary modeling tools it ships with. I also used some stock materials just to give me a crude sense of the overall look. This process only took around a day or so, and frankly I spent about as much time learning the editor as I did actually creating the damn thing. I was, however, reasonably pleased with the result, so I pushed on. I finished the blockout on June 13, 2022.
Modeling
I pulled my Unreal blockout straight into Blender to use as a scale base for the proper modeling work. There is frankly not a lot to say about the modeling work. Modeling in Blender is as natural as breathing to me, and the first pass at models was mostly just to refine the major shapes so I could have a nicer environment to place the major props in.
Not a lot to look at, but it never is. The wall parts were trivial, but the glass and metal framing was a bit more tricky. In the end, I just placed edge loops on walls where I wanted the frame, duplicated and separated them, extruded them, then added a solidify and bevel modifier to them. Nothing crazy, and it worked like a charm. From there, I completed the desk.
And that was about it. For 2022 at least. And a solid portion of 2023. I moved 2000 miles away to Alaska, got married, and got laid off from my job. In order of chronology, not importance. This damnable project just sat on my hard drive, taunting me. By the time my life finally settled down, Unreal 5 was now Unreal 5.3, and I was ready to rock.
The rest of modeling went more or less smoothly. I ended up deviating from the original concept art by not including the desktop monitor, and changing the design of the wall monitors. The prior was too low fidelity in the concept to get a firm grasp on it. I tried multiple times to translate it into a model, but nothing I made worked well in 3D. It was a similar story for the inset wall monitor. The design as written ended up being a bit of a problem for me. Since I was under no obligation to "make it work", I instead took a bit of creative liberty and based the final monitor off of some appropriately anachronistic old-timey TV sets. A bit of a compromise, to be sure, but one I was willing to make for the sake of continuing the project.
Despite what I said earlier about modeling being a simple process, I did make one large improvement in my modeling workflow, right near the end of the modeling work. I watched this amazing tutorial by Alex Medina and thought to apply it to the next model I worked on, which happened to be the radio model. I love vintage radios, and the one I had in mind was perfectly suited to his "basemodel with booleans and subdivisions to highpoly to lowpoly" approach. I had used somewhat similar techniques in the past to quickly generate low poly models from a basemesh, but his tutorial really helped me refine my workflow.
By November of 2023, I estimate that 90% of the modeling work was done. This is around the point when I really began working on the project in earnest. I estimate that around 70% of total project work was completed between early November 2023 and the end of January 2024.
Texturing
My initial plan was perhaps a bit too ambitious in terms of using tiling materials and trims. In the end, nearly every asset was created from scratch, though I did create around half a dozen Substance Painter smart materials that I shared across assets. In fact, the very first texture work I did was for two tiling materials in Substance Designer that came in extremely handy. The first is a nice brassy material which ended up featuring prominently in the scene. The only actual model that uses it directly as a texture is the wall framing, for the rest I exported an SBSAR file and used it as a base material in Painter.
The second material is a wood flooring material. Its used as a base material for the floor mesh and part of the shelves.
After creating these materials, it was a pretty simple process of going through the props one by one and texturing them. Generally speaking, I didn't do anything fancy or unusual to them. My goal with this project was not necessarily to push my texturing skills. Besides, one must balance the desire for perfection with actually completing a project. I spent a solid month between mid November and mid December with texturing for the various props and walls.
The one exception to this "production mindset" was with the textures for the radio. As mentioned earlier, I tried some new modeling techniques while creating the mesh, which resulted in the model taking many extra hours of work and being of particularly high quality. It felt a shame to just give this splendid model a cursory texturing pass, so I dedicated a few extra hours to make it really shine. If this project has a hero asset, this is it.
One mesh that did not get nearly the amount of attention in terms of textures was the chair model. I had struggled a bit with creating the mesh, and wasn't particularly satisfied with it's quality. I was, however, unwilling to re-build the thing from scratch. In my frustration, I gave it only the barest of textures and called it a day. In a moment I should have seen coming, I asked a non-artist friend about his thoughts on the test renders I did, and the very first thing he said was "Those chairs look incredibly uncomfortable. Why not make them more cushion-y?" This feedback was the impetus to give the existing textures some much needed love.
I think the results speak for themselves.
The final texture set worth calling out is the books. I'm really fond of the texture work on these. Anything with text also gives me a nice chance to give the scene some character; some personal touches.
Other odd notes: The inspiration for the wall texture comes from reference photos of the Hindenburg. The internal walls were constructed out of thin foam board with fabric layering the outside (including for the smoking room - yes, the hydrogen-filled Hindenburg had a smoking room, look it up). Also, the rug near the desk is just a heavily normal mapped texture baked into the floor, no extra mesh was used.
During the process of texturing, I had been making a point to import each newly textured asset into Unreal to position it and check that the materials looked good in the engine. After this was finished, I was in the final stretch. Texturing was more or less finished by early January, 2024.
Composition & Lighting
Once my attention was fully turned to composing the scene in Unreal, things got a bit hairy, to say the least. My intention was to have volumetric clouds outside the windows. I got this working with relative ease, it was a simple matter of plugging noise into the extinction channel of a volumetric material while lerping the same texture between two gray colors with a light and dark luminance value and plugging that into the diffuse. A grand total of around 5 nodes. It looked really nice as well, and can actually still be seen in the work in progress slideshow on the project's portfolio page. However, I removed these from the final product. The unfortunate reality is that as incredible as Lumen is, it really did not want to properly behave with my cloud volumes. The issue in particular that I faced was with shadows flickering/smearing when an opaque object moved past a volume. This was particularly noticeable where the windows touched the walls. The issue in question can be seen here.
This caused me 10 hours of pain and suffering.
So I compromised. I would rather have a somewhat bland looking external environment over intense shadow flickering in my final render. I am still unsure of what causes this or if there is a fix. There is likely a single console command or hidden check box that would fix this, however I was unable to find it. I also tried using a Niagra system for airborne dust particulate, but the Unreal editor continually crashed while I was editing the system, so this was scrapped as well.
Outside of these annoyances, the majority of the work for the lighting consisted of tweaking, constant tweaking. Raising the brightness of this light, lowering the emission multiplier here, adjusting the post processing exposure to compensate, and so on. My final set-up consisted of:
- 1 directional light
- 3 hanging lamps with emission
- 1 point light for the desk lamp
- SkyLight, SkyAtmosphere and ExponentialHeightFog objects
- 1 rectangular light to illuminate the wall-mounted gun
- 1 low light rectangular light with shadow casting disabled placed at the window to make lumen render more reliably
It was not overly complex, and in the end I managed to achieve a rather pleasant looking overcast vibe, complete with raindrops on the windows.
Rendering
The rendering process was mercifully straightforward. I performed a few dry runs of rendering the video fly-through while adjusting various settings, including the Temporal AA passes, Lumen Scene Lighting Quality, Lumen Scene Detail, and Lumen Final Gather Quality. I could perceive no difference between 128 and 64 TAA samples, so I went with the latter. Scene Lighting Quality and Scene Detail seemed to have little impact when set over their default maximum values, so I went with that (2.0 and 4.0 respectively). Final Gather Quality had the largest impact, both on visual fidelity and render time per frame. My PC has a 10700k, 8GB 3070, 32 GB of RAM, and I was rendering everything locally, so performance was absolutely an important factor. Setting Final Gather Quality to 10 was significantly better than the default maximum of 2.0, but dramatically increased render time. After some testing, there seemed to be a breakpoint between 5.0 and 6.0, where the latter took nearly as long as setting the value to 10, but 5.0 was over twice as fast with relatively marginal quality loss. These were the final values used for the render, though there does still exist some flickering due to Lumen's GI system.
I attempted to switch my scene over to the pathtracing renderer with poor results. Not only was it prohibitively expensive to render, but the pathtracer didn't want to play nice with the existing SkyAtmosphere and ExponentialHeightFog settings, and I was, frankly, in no mood to crowbar it.
Final rendering was accomplished using a keyframed camera, a sequence, and the Movie Render Queue on January 28, 2024.
Conclusion
I firmly believe that the last year and a half of work has been well worth it. There are few satisfactions in life better than giving the world the result of your hard work. I learned an incredible amount working on this project, the vast majority of it having to do with Unreal Engine. I won't say that I regret using Unreal due to the raw value of the experience, but I can't claim that it was perfect either. Late in the project I came to realize that essentially everything I was doing could be accomplished by staying in Blender and rendering with Cycles, a platform I am exceptionally more familiar with. I would have lost out on the learning opportunity, yes, but I would have saved myself roughly 60 to 70 hours of time. I consider it worth it, but it's important to be aware of that kind of tradeoff.
Beyond that, I am extremely satisfied with the final result. I always go into a project with a vision in my mind's eye of the end product, all the while knowing that that vision won't be revealed until the final hours of work. This by itself can make the entire experience of making art a rather grueling one. But an experience that is worth it.
If you've made it this far, congratulations, you now know what it's like to be a friend of mine asking how work is going. And thank you, for taking the time to read this. I find posting these blogs to be helpful for myself, which is why I write them, and I hope you found it informative, insightful, entertaining, or in some way positive. I'd like to reiterate my gratitude to all those named at the beginning for their support, and I hope you, dear reader, have a wonderful day.
- Thomas Vanek