Cliff Chen prepared a detailed breakdown of his modular Taiwanese street created during one of the classes at CGMA.
In case you missed it
You might find these articles interesting
In high school, I dreamed of being an environment artist and was fascinated by the idea of immersing myself in the world of art. I first learned 3D modeling in my first year of university. At that time I was still naive in regard to the industry’s entry standard and struggled to land a job after graduation. I then realized how disadvantageous my portfolio was and used the next 3 years to learn and hone my skills. In that time, I took on some freelance and contract opportunities in architectural visualization and indie game projects, which eventually led me to my current full-time job.
I am incredibly grateful for the privilege to share my workflow on my latest environment piece made at CGMA.
After my freelance work with Upsurge Studio was finished, I was on the hunt for jobs again. With so much free time, I thought it would be great to take a mentorship course to boost my skills while searching for a job. I have heard great things about CGMA and with its flexible class structure, it really made the learning convenient for me. So I decided to give it a shot.
I chose the Modular Environment course because modularity is a crucial component in environment art that I was unfamiliar with at the time. My 3D experience has been mostly self-taught, therefore some of my workflows lacked the industry level of efficiency. I was hoping that through this course I would be able to push the boundaries of my skills and gain knowledge of professional practice from industry veterans like Clinton Crumpler.
SanXia Street 1940: Inspiration
I had always wanted to create something related to my home country Taiwan. So from the get-go, I set my vision on Taiwanese scenery. As I was doing my research, I realized that the old streets in SanXia perfectly illustrated the layers of Taiwanese history of the past century. The design of the street was heavily influenced by a mix of Western baroque-style architecture and Japanese/Chinese carving, which was popular in post-Westernized Japan. The traditional Chinese spring couplet and Japanese signs show the unique blending of culture and history setting of Taiwan during Japanese colonization. To give more story elements to the scene, I decided to set the time during the Second World War when most men were called to battle, and stores and businesses were closed down. I wanted to replicate the SanXia Old Street during a time of fear and uncertainty.
I was unable to find the exact photo of the street during the war. Although the building which remains now has been renovated in 2007 and is said to be an accurate restoration from the early 20th century, I still needed more reference for other details such as vehicle, common props, signs and posters to make the scene more convincing.
Planning Modular Parts
In planning the modular pieces, I dropped the main reference photos inside Photoshop and determined key blocks by painting over them with vibrant colors. It was quite a difficult process since each building had its own unique design. I tend to search for the most distinguishing features of the building first. For example, the front came with three sections, one wider section in the middle and two narrower sections on the side. From this information, I know I can break the building front into 2 main parts, a wider centerpiece and a narrower piece for both sides. The windows have the same concept as well.
The end goal was to break down the building with as few parts as possible, and all parts should have some reusable values. For example, initially, the window piece was broken into three parts (wall, window and bottom piece), and later I decided to merge them together due to the lack of reusability for the bottom piece and also to match the width of other modular parts, making assembling the building much faster and efficient.
After the modular planning was done, I modeled the blocks in Blender. The goal for this step was to make sure everything assembled well - check if pieces were missing and cut down unnecessary pieces. In this process, definitely expect a lot of back and forth between planning and modeling.
Trim Sheet Planning
Trim sheet textures were used to optimize the texture space for modular pieces and provide consistency throughout the environment. To begin planning, I used a workflow similar to the planning of the modular pieces to figure out the parts that I would include in my trim sheet.
With the parts decided, I created a reference texture using flat colors to plan out the appropriate ratios and size for all the parts. This map is later used as a base reference for modeling the trim sheet geometry.
I began modeling by creating a plane with a size of 2048x2048cm and splitting it into sections according to the reference texture. I mainly focused on modeling the main form and edges before bringing the model into ZBrush for a more detailed pass. A good tip I learned from the class is to model the high poly slightly outside the 2048x2048 texture range for a better baking result; it also prevents AO from darkening on the edges.
For the ornament detail, I used the "Ornament Kitbash” by Jonas Ronnegard to speed up my modeling process.
Detail Sculpting in ZBrush
When the basic form was completed, I exported the mesh into ZBrush for a high poly pass. In order to sculpt the mesh with seamless detail, ZBrush required a bit of setup before sculpting. I had to import a 2048x2048cm size plane mesh on a separate sub tool channel, which had to share the same pivot point and be aligned perfectly with the mesh. Go to the document tab and set the canvas size to 2048x2048cm.
Make the trim layer invisible so only the plane can be seen, snap to the front view and press ‘F’, the canvas should now be filled by the plane.
Turn on the visibility of the trim mesh - the canvas is now set with the boundary of the texture size.
Now the final step for seamless sculpting is to turn the WrapMode to 1 by going under the brush tab and inside the curve section. With this setup, I was able to sculpt my mesh with seamless details. Remember to turn on the WrapMode again every time you switch to a new brush.
After sculpting, I decimated the high poly mesh and exported it back to Blender. I then assigned color ID to different parts of the trim so it can later be used as masks inside Substance Painter.
Painting the Trim Sheet
Once I had all the materials needed, I began to texture the trim sheet inside Substance Painter. I imported a plane mesh and used the high poly to bake out normal, AO and ID map information.
After assigning the base material using the ID map, I spent the rest of the process experimenting with smart masks to create dirt and grunge details. Due to the nature of the trim sheet being repeatedly used, I tried to avoid adding large and noticeable tiling details like cracks or water stains.
I made two trim sheets for my entire modular parts, one concrete/brick trim for the main building structure and one wooden trim for the windows and storefronts. With the use of trim sheets, much of my time was saved from modeling and texturing each individual asset. Another convenient thing about the trim sheets is that I was able to generate different variations of the same mesh using the same texture, allowing the building design to be more diverse.
Trim sheets were not only used on buildings; several props in the scene were also textured with trim sheets.
After importing the modular parts into Unreal Engine, the main visual of the street was established. As I was testing the camera composition, I realized the scene lacked a main focal point due to the buildings being identical. I needed something that could deliver a story for the street.
I decided to use the rickshaw as the hero prop of the scene to portray the theme of farewell. Since it was set in the age of war and uncertainty, many people were sent away or escaped the country for safety. With the rare usage of cars, rickshaws were a very common way of transport in Asia during the ’40s. After researching the look of authentic Japanese rickshaws, I began my modeling process.
Modeling the Rickshaw Roof
Modeling the top leather/fabric part of the rickshaw was quite a challenge for me. It was my first time simulating cloth in Blender. After modeling the metal frames, I created the base shape of the roof above it, making sure there was enough space between the frame and roof for cloth simulation. When modeling fabric mesh, I prefer to start simulating with a lower poly count and gradually increase the poly detail by adding edge loops and subdivision while adjusting the shape (just make sure there is enough poly count for the shape to form).
To achieve the seam detail on the edge of the roof, I modeled it manually by adding extra poly loops along the edge, selecting the “seam” edges and press Alt+S to move the edge inward.
Before exporting the high poly, I assigned vertex colors to details that will be baked onto low poly, such as the screw bolt, nameplate, and cushion.
To avoid overlap baking in Painter, I separated the model into mesh groups and exported them into one FBX file.
Dressing the Scene With Decals
Decals were used heavily to make the modular scene more believable. They break down the repetitive look of the modular parts and make each building unique. There are three categories of decals that I use in my scene, which are environmental decals, texts decal and decals served for storytelling.
To set up my decal material, I followed the tutorial by GameTextures.com which uses parallax occlusion from the heightmap:
To create material instances for later use, I converted the texture slots and height values to parameters. I also added custom functions that allow me to adjust base color and roughness values in the material instance.
Environment decals are mostly based on natural phenomena such as the cracks, water stains and puddles on the floor. I downloaded most of the crack and water stain decals from the Megascans library and used them heavily on concrete surfaces and gaps in between trims.
For the water puddles, I downloaded a free puddle decal material made by Axton which comes with the function to adjust edge fall off strength and puddle color.
The decal also uses custom alpha maps to generate different puddle shapes. By using this feature I was able to create the wet tire tracks with my own alpha map.
There were some environment decals for man-made decorations like the ornament details and sewer manhole. I had difficulty thinking of a way to create the ornament details on the top of the building and decided to experiment with the decal workflow. I used the same ornament kit from the trim sheet to create the high poly mesh.
To create the opacity map, I assigned the ornament mesh with white vertex color and baked it onto a black plane using Blender's Cycle engine making sure to select the color tab only and set the margin to 1px for the accurate shape.
I then exported the high poly mesh and the plane as low poly into Substance Painter to do the texturing. To enable opacity inside Painter, first, enable the opacity channel under Texture Set Settings and then change the shader to ‘pbr-metal-rough-with-alpha-test’. Lastly, drag the alpha map into the opacity slot inside a fill layer, the black part of the map should then be transparent in the display.
Initially, I tried to use Substance Designer to convert the normal map into a heightmap, but the result was not ideal due to the complex shape of the ornament. In the end, I brought the opacity map inside Photoshop and applied inner shadow around the edge to create the bump.
After plugging the textures into the decal material with parallax occlusion on, the decal looked quite convincing on the ground. However, when I stuck the decal onto the vertical surface, the shape would be distorted.
The issue was resolved when I assigned the decal material to a plane mesh.
The ornament looked great close-up but when it was viewed from the player's level, the details faded out. For future reference, I would probably use actual mesh for the ornaments, especially for hero assets.
Text decals were made mostly for the shop signs and wall carvings. They serve the function of communicating hints of the location of the scene, the local language, and the purpose for each building (hospital, tea shop, etc.). It gave each individual building a unique role.
I found a Chinese website that was able to turn Chinese characters into traditional calligraphic fonts and export them into PNG with a transparent background.
To decrease the number of material instances I had to make for each sign, I combined all the characters into an atlas map in Photoshop. The opacity map was created by making the text white over a black background.
I then used Substance Designer to extract normal and height detail from the opacity map.
Lastly, the textures were brought into Painter for a material pass.
Due to all the signs sharing one UV set, I had to create multiple plane meshes with UV assigned to each sign. This workflow increased the number of mesh assets I had for the scene but decreased the total texture size of the decals.
Decals for Story Elements
This group of decals works as visual hints used to illustrate the war period that the story is set in, and also show the blend of Japanese and Taiwanese cultures. I wanted viewers to sense the atmosphere and tension of the time even without understanding the characters and signs.
Throughout the street, I placed war propaganda posters showing brave soldiers and promoting unity between Japan and China. But among the war posters, there are also commercial posters advertising products reflecting the street as a shopping district.
Around the door, I placed spring couplets showing the Chinese roots of the Taiwanese culture.
The textures for these decals were simply made with diffuse and opacity maps. Roughness and metallic values were set inside the material instance.
Using Planar Reflection
I used the planar reflections for a realistic representation of reflection on puddles and windows in my scene. This produced the cleanest and most accurate result of reflection without the distortion from the regular baking method. However, it does make the scene heavier to run.
To enable planar reflection, go to Project Settings, under Rendering > Lighting, enable the setting ‘Support global clip plane for Planar Reflection’. After restarting the scene, the planar reflection blueprint should be available under the Visual Effects tab.
Lighting and Post-Processing
When planning the mood board for my scene, I was heavily inspired by the atmosphere of the game The Order: 1886 with its dim grayish sky and dusty-looking color palette.
My lighting setup was fairly simple, with the default Unreal skysphere as the background and a directional light as the main source of light. I adjusted the light direction to make it shine from the right end of the street, the lighting angle helps guide the viewer to the main focal point. I also changed the light to a slightly warmer color to simulate a sunset.
Throughout my lighting process, I spent a lot of time trying to balance out the shadow in the hallway. If I increase the skylight to make the hallway more visible, the whole scene would look washed out, but by keeping the shadow contrast, I would lose the details. By placing ceiling lights throughout the hallway, I was able to properly light up both areas. Each ceiling light comes with 3 light components: one spotlight as the main light source, one point light to fake the GI bounce, and one point light to light up the lamp.
Multiple point lights were placed to enhance the overall presentation of the scene. For example, I placed a point light right near the rickshaw, using a slightly colder color to make the object stand out from the mostly warm scene. Some point lights were placed near the camera to present better details at close range.
Before the post-processing, I tried to make the lighting as close to the final look as possible, so the color and shadow of the scene would look more natural. I made the scene slightly desaturated with a yellow tint to deliver a vintage vibe. Instead of going for the colder tone like in The Order: 1886, I chose a warmer tint to represent the time of day and the humid temperature of Taiwan. I also adjusted the exposure and shadow contrast to brighten the overall visual.
What I found most crucial when presenting my modular scene was to break down the repetitive nature of the modular kit. When viewers can immerse themselves in the environment without immediately noticing that the parts are duplicated, I consider the modular scene successful. I used many methods like decals, hero prop, lighting and subtle visuals (e.g. planes in the sky) to fill the scene with information for the viewer to absorb.
Due to this being my first modular environment, I was worried that I wouldn’t be able to complete such a complicated scene in ten weeks. In the end, I was quite satisfied with what I had achieved. Taking the course with Clinton has helped me learn better ways to plan out the steps, and I gained new techniques such as using trim sheets and color ID to speed up the workflow.