Pheobe Lin provided a detailed breakdown of the Forgotten Lands project, showcasing how an imaginative urban landscape overtaken by lush foliage was brought to life using Maya, Substance 3D, and Unreal Engine 5, while sharing useful tips and resources along the way.
Introduction
Hello everyone, I'm Pheobe Lin, a 3D Environment Artist dedicated to creating immersive, stylized worlds. My journey into 3D art began with a deep fascination with video games and animated films. I was drawn to the intricate details and creativity behind their mesmerizing worlds. Hoping to transform my passion into a career, I began my studies at the Think Tank Training Centre. There, I sharpened my artistic techniques and creative thinking skills, which are crucial for building a successful career in this field.
The Think Tank Training Centre allowed me to explore various options in the game and film industries. Ultimately, I chose to specialize in environment art, inspired by the incredible potential of Unreal Engine and the excitement of building real-time worlds. For my demo reel, I collaborated closely with my mentor, Aleksandar Danilovac, to recreate a stylized environment. This project allowed me to refine my skills in modeling, texturing, and lighting while working within a professional pipeline.
As a recent graduate, I'm eager to join the industry and become a part of larger-scale projects. With my strong artistic skills and enthusiasm for creating unique immersive environments, I'm excited to contribute to a team's success and to help achieve its goal. My mentorship experience has given me insight into industry standards and workflows, preparing me to tackle professional challenges with confidence. In this article, I'll break down the process behind completing my demo reel, share the challenges I encountered, and reflect on the valuable lessons I've learned throughout this rewarding journey.
The Forgotten Lands Project
The Forgotten Lands project started as an opportunity for me to dive into creating stylized, mysterious landscapes. Despite advice to pursue a realistic project to improve my job prospects, I was drawn to fantasy art concepts with unique styles that still convey rich, story-filled details. When I discovered Arthus Pilorget's concept art, it instantly aligned with my vision of an abandoned, tropical city: overgrown plants covering vehicles, hinting that life had found unexpected ways to thrive, and a small boat navigating through the water, bringing a sense of exploration and adventure. I knew this was the ideal foundation for my project.
One of my main goals was to continue developing my skills in creating atmosphere and mood through lighting and texturing. I aimed to make the scene feel immersive and slightly surreal. To build my reference library, I gathered photos of real buildings with details similar to those in the concept, as well as examples of stylized art styles that I wanted to emulate. These references helped me stay faithful to the intended look and feel while still allowing me to make creative choices that added my own unique touch to the environment.
For organizing references, I highly recommend using PureRef, as it makes it easy to arrange images and jot down quick notes. Finding good references took more time than I expected. Initially, I gathered a wide range of images that seemed relevant, but having too many can be overwhelming. To avoid this, I later refined my selection, focusing only on images with the specific details and styles I wanted to follow. It's best to keep references concise and targeted, especially since the original concept already provides a lot of useful information.
Blockout
Initial Setup: I began by setting up gray boxes, basic lighting, and camera angles in the engine to ensure the main shot's silhouette aligned with the concept art (except for the boat, which I modeled earlier as practice). At this stage, my focus was on scale and proportion, leaving finer details for later.
Modularity Planning: After the blockout, I assessed which models could follow a modular workflow. My mentor and I decided to make the buildings fully modular, so I created simple box-like versions with basic elements (windows, trims) and assembled them into a level instance, allowing any adjustments to apply to the entire structure.
Blocking Out Assets: Before creating the first vertical slice, I added simplified assets to populate the scene. For vegetation, I used Megascans to get a sense of the proportion and variety needed for the environment.
First Vertical Slice: With the basic scene ready, I refined details by focusing on a vertical slice: a small but polished section to represent the final look. My first slice was a corner of the back building, ideal for testing modularity and tiled textures. For beginners, it's helpful to tackle a small slice first to practice the full process (detailed modeling, UVs, texturing, shaders). Spend a few weeks refining, then move to the next slice, returning later for tweaks as you develop a workflow and build texture assets.
Reusing Assets: To save time, I reused models wherever possible. For instance, I used wooden planks from a window frame as flooring for the boat. Small rotations of trims and minimal variations made each element feel unique without extra modeling. For cars, I created only two bases, which worked well for visual diversity.
Stylized Foliage: Since this is a stylized project, I decided to keep the foliage simple, focusing on desired subdivision levels rather than intricate sculpted details. This setup allowed for sufficient normal and AO details during texturing. Creating smart masks in Substance Painter helped maintain consistency across individual assets.
For the ivy, I followed a tutorial from FastTrack Tutorials that taught an efficient method for creating realistic ivy directly in Maya. I then customized the texture in Photoshop to give it a more stylized look. This approach used procedural techniques, allowing me to generate detailed ivy quickly without sacrificing quality, which was crucial for filling the environment.
And as for the grass, I used Viktoriia Zavhorodnia's tutorial, which focused on creating simple, stylized grass that was easy to customize and optimize. The tutorial emphasized low-poly models and flexible textures, helping me maintain the stylized aesthetic while ensuring good performance. I applied the same method to create the lotus leaves, adjusting them to fit the specific look I wanted for the scene.
Adding Sculpted Details: Despite the stylized look, larger assets like cars, the boat, and buildings benefited from sculpted details to enhance their style. I used Orb Brush Pack, Trim Dynamic brush, and Clay Build Up brush in ZBrush, emphasizing broken edges with occasional large damages. The Nanite workflow helped handle high-poly models more efficiently.
Topology
For retopologizing the mesh in preparation for texturing, I used ZBrush tools such as Dynamesh and ZRemesher to create a clean quad-based topology. To ensure the vertex count remained manageable, I applied Decimation Master before proceeding to UV wrapping. This workflow allowed me to optimize the mesh for efficient texturing while maintaining its essential details.
For unwrapping sculpted assets, I used RizomUV for manual UV cutting, as the Transfer Attributes tool in Maya often struggles with larger, more intricate models. RizomUV allowed me to work quickly and precisely, ensuring minimal stretching and overlapping. I aimed to maintain a consistent texel density of 10.24 with a texture resolution of 4096. Reflecting on this process, I realized my workflow wasn't fully optimized. For future projects, I plan to explore a 2-UV-set workflow, one UV set to fit everything within the 0-1 tile and another to preserve texel density for proper tiling.
Texturing
Material Layer Workflow: I used a material layer workflow for most assets with tileable textures, as it’s highly efficient for making adjustments directly in the engine. To simplify color adjustments in shaders, I usually set the base color of tileable textures to a neutral light gray. Since the documentation provides a detailed step-by-step guide, I'll focus on demonstrating how I created RGBA-packed masks using Substance 3D Painter.
- Customize Output Channels: In Substance 3D Painter, create custom output channels (R, G, B, A). Avoid using the alpha channel unless necessary, as it increases memory usage. Assign the green channel to the most important information since it retains more bits than red or blue after compression;
- Preview with Masks: Use preset materials in Painter to preview the masks and mark key information using the Anchor Point tool;
- Set Fill Layers: Add a fill layer using the custom output channels with a black (0) background. On top, add another fill layer and assign a mask created with the Anchor Point tool;
- Export Masks: Pack the R, G, B, and A outputs into a single texture for optimized use.
This method ensures efficient workflows and flexibility for changes while keeping textures organized and performance-friendly.
Water Shader Setup: Setting up the water shader was challenging. I explored multiple tutorials on creating both realistic and stylized water shaders in Unreal Engine and followed a guide from Your Sandbox to develop a versatile shader with customizable controls. A key element in the setup was the DistanceToNearestSurface node, which this tutorial from PrismaticaDev explained exceptionally well.
Metal Textures: Since metals feature prominently in the scene, I created three tileable metal textures: painted, shiny, and semi-matte. I kept the base colors plain to allow easy adjustments later, using color blend controls in the engine.
Cartoon Look: To achieve a cartoonish style as a beginner, I focused on preserving essential large details while minimizing smaller ones. I also found that blending some additional painted effects with the original textures enhances the aesthetic.
This picture shows how I added some brushed patterns to the metal material using simple shapes. Additionally, the graffiti and paint splash decals added a lot to the cartoony look of the environment.
Detailed Breakdown of the Left Building: For the building with Kermit the Frog graffiti, which is close to the camera, I ensured enough breakup details to avoid a CG look.
The process began with creating a procedural plaster-over-brick texture, which could be reused elsewhere. Overlapping breakup masks were controlled to achieve realistic concrete damage intersections, and I also added crack patterns near these intersections to enhance the detail further.
Parameters in the procedural material allowed precise control over plaster crack placement. You can preview in Substance Player by importing the blockout mesh. For corner meshes, I used a simple bevel and added horizontal subdivisions to smooth sharp edges. Ensure the UV of the corner mesh is tiled consistently with the mesh right next to it.
Finally, I imported the beveled mesh to ZBrush and the height map from Substance Player (with a flipped version for ZBrush compatibility), added enough subdivisions without smoothing, and projected the displacement map. This approach ensured all breakout details were tiled perfectly.
Composition & Detail Scattering
As I became more familiar with the process and developed reusable textures and smart masks, the time needed for each vertical slice gradually decreased. Once all the modular pieces and assets were completed and implemented, I moved on to the second pass, focusing on polishing the scene, fine-tuning color arrangements, and adding or removing elements as needed. This stage is one of my favorites because it allows me to approach the work from a more artistic perspective.
I scattered details by strategically placing props, vegetation, and decals to break up surfaces and add interest. Decals like weathering, markings, and graffiti enhanced the buildings while varying the density of elements ensured the scene felt cohesive and alive. By layering details and varying their density, I ensured the scene felt cohesive and alive without becoming overwhelming.
Lighting & Animation
In Unreal Engine 5, Lumen provided powerful global illumination to achieve realistic lighting. This image shows the settings I used for the project. I started with Directional Light and Unreal's default sky atmosphere, tweaking the atmosphere color by referencing the mood I wanted and sampling colors from it.
For fog, I combined EasyFog cards with volumetric fog, which played a key role in shaping the scene. The fog helped a lot in adjusting depth variations and balancing overall color contrast.
To enhance the scene, I included flickering lights like traffic and car lights for added interest. The light function material setup was simple and is shown in the image.
Additionally, I incorporated caustic lighting to simulate light rays reflecting and refracting off the water surface, which added realism and made the scene more immersive.
Camera Shake: To create the hand-held camcorder-like effects in the reel, I added a subtle camera shake, which enhanced the sense of space and depth in the scene. This was achieved quickly and efficiently using an Unreal Engine Blueprint designed for dynamic motion effects.
Cloth Simulation: The process begins by rigging the mesh that the clothes or fabrics are attached to. In my case, I added a skeleton to the hanging rack in Maya, imported them to the engine to apply clothing data, and carefully painted the cloth activation areas to control how the fabric behaves. Finally, I introduced a simple wind effect to simulate realistic movement. I followed Matt Aspland's tutorial, which provided clear, step-by-step instructions to achieve these results.
Animated Foliage Shader: Enhanced foliage shaders with controls to create subtle leaf movement while keeping the roots stationary.
Conclusion
The biggest challenge I faced was staying self-motivated throughout the project. Working alone on such a lengthy process often left me feeling lost, especially when learning new workflows and software. I couldn't have completed the project without the guidance and encouragement of my mentor and the support of my amazing peers.
I learned the importance of planning and staying organized by setting weekly and monthly goals and outlining detailed tasks before starting each week. Breaking the project into vertical slices helped me stay focused and tackle challenges step by step. I also discovered the value of iteration: it's okay to revisit and refine elements as you go.
Advice for beginners:
- Start small and focus on mastering one skill or aspect at a time;
- Build a strong reference library and stay true to the vision while allowing room for creativity;
- Seek feedback regularly – it's an invaluable part of growth;
- Don't feel discouraged if you're still learning, every expert was once a beginner, and growth comes with time and persistence;
- If you find yourself stuck on something for too long, switch to another task – you can always come back to it later with fresh eyes.
Thank you for taking the time to read this article! I hope you found something useful or inspiring. Feel free to share your thoughts – whether it's something you liked or areas I could improve, all feedback is greatly appreciated. I'm excited to embark on my career in the industry, and any opportunity to learn and grow further would be truly amazing!