In case you missed it
You might find these articles interesting
My name is Tarek Abdellatif, I'm a 3D Generalist/Game Artist from Egypt currently living in Cairo. I started learning 3D in 2010 but took it seriously only in 2013; my first software choice was 3ds Max, but I recently switched to Maya. I started learning 3D modeling from online tutorials but my first real practice in game asset creation was back in 2015 when I took an online 3-month course at Uartsy where I learned many good tips about high-poly and low-poly modeling, baking and texturing.
I used to work for studios that mostly make local TV ads because that is the most common thing you can find in Egypt - either commercials or TV series/films. I always wanted to work in the game industry, but unfortunately, there are no real opportunities for that in Egypt, except maybe for some indie studios that create small PC and mobile games.
After some time, I got my first job in the game industry at Codemasters Malaysia, Kuala Lumpur, and worked on the racing game Grid 2019 as an Environment Artist mostly making buildings, street furniture assets, modeling, UVs, and texturing. It was a very good experience for me but I felt that I wanted to learn more techniques and improve my skills, so I left the job after one year, went back to Egypt, and decided to enroll in Online Asset Creation Program at Think Tank Centre.
Why Environment Art
At first, I wanted to be a character artist actually, but I felt that I liked hard-surface modeling and creating assets more. I especially wanted to create interiors, but I didn't like interior design stuff you see every day because to me, it is very boring and most of the assets are the same, either free models or some assets from Evermotion. I didn't like that because everything felt very repetitive, so I decided that I wanted to create unique scenes and focus on still cinematic renders.
I was also inspired by artworks I saw a long time ago in 3D magazines like 3D total and 3D Artist, - I suddenly just liked the idea to become a 3D environment artist. To me, environment art is so great and artistic, you can tell stories with it and create worlds. It's a way to show people what you are capable of regardless of the software or hardware you're using. You're just trying to show your best.
Antique Room: Goals & Reference
Antique Room was my final Intermediate-term project (Feb 2020) at Think Tank Centre, Environment for Games track. Egypt has a lot of historical places and I wanted to create something from the 18th/19th century. I found this picture online, started to search for its exact location, and found out it was from Al-Manial Palace Museum, Cairo.
I wanted to create an artistic still image that captured the reference photos and the Islamic architectural style of that time period which was a mix of Arabic, Ottoman, Persian, and Moorish styles.
For concept, I used these two images below. It was my focus to create two main shots that would look similar to them.
To gather reference, I used an amazing free application called PureRef which allows you to easily put many pictures together and organize them the way you want. I started to look for the pictures from the museum and unfortunately, the room I picked didn't have that many clear photos because it was behind a barrier, so I searched for other areas in the museum and picked similar patterns/designs. After that, I searched for more pictures using Google Image, - for example, I couldn't find a clear reference for the ceramic wall, so I found a similar pattern on the internet, created a tileable texture in Photoshop and converted it to a PBR texture in Substance Designer. The same went for the ceiling.
I start by blocking simple shapes without UVs and creating proxy models. I gave them names like SM_table_01a, sent them to Unreal, and replaced those models later once I had the final low-poly baked versions.
Let's take a table as an example. I used this reference and started blocking the shapes with simple polymodeling using a cylinder and cubes. However, I modeled them as one piece (not separated) to make the high-poly modeling process easier. Also, be aware of the proportions; for example, the height of this table that makes sense to me is almost 55 cm so I use a cube or a human mesh to measure it.
After that, I move onto modeling the high-poly, add some edge loops and bevels to chamfer the edges, create a polygon plane for the ornate shape, and start working out the ornament similar to the one from the main reference. Then give it a name and a material color different from the rest of the asset so that I could bake it on a plane and use it as an alpha with opacity in Substance Painter.
For ornate shapes on other assets, I used a similar method.
Modeling the window wasn't that difficult once I simplified it. I started with a plane and realized that the shapes were had a very simple architectural pattern. I added edges that were similar to the reference, then beveled them, deleted extra faces, and extruded, - and it becomes the base low-poly. Finally, I beveled the edges and applied mesh smooth to get the high-poly that could be used for baking in Substance Painter.
For the arch above the window and other assets, I used a similar method.
During the modeling stage, I mostly used default tools in Maya without any plugins except for one called Quick Pipe that helped with the big arch. To create a base for this cylindrical shape that follows the arch direction, I just selected the edge and applied the plugin. It created a base that I adjusted manually to get the shape I needed.
First, you need to decide what quality you're aiming for. In my case, I used 1024 texel density per one meter for almost everything.
There are two types of textures, the ones that use tileable textures/UVs and the ones that use unique textures/UVs. Some assets also use a mix of two, for example, the arch uses a unique texture but has some parts that tile vertically in the UVs (see below). It also has an overlapped part to save space in the UVs but it is transformed to the next UDIM so it only uses baked data from the main UDIM 1001.
The texture size for this arch is 4096 with 1024 texel density per one meter. You can slightly increase or decrease the UVs if you can't find space but not too much so that you can keep the UV texel density consistent.
I used Maya's unwrap UV toolkit in my process. I select polygons by angle and used the Normal-Based option. If I need to weld them I use Stitch Together or Sew from Cut and Sew panels. If the geometry has a boxy shape I cut the edges and use Unfold. I use Straighten UVs and Orient Shells when the shapes are horizontal or vertical. For this arch, I started by deleting half of the shape and working only with the other half. Once I finished unwrapping it, I mirrored the geometry then transformed the overlapping UVs to another UDIM to save space.
Here's another example. For the wooden walls, I built two main shapes (1 meter wide), unwrapped them using the same method, and fit them to the UV space. I used a 2048 map size for it with almost the same texel density as before. The ornament was also built using the method described above and baked in Painter. The rest of the modular parts were mapped in the same space to read the same bakes created in Substance Painter.
For the ceramic tiles, I modeled the walls and then created two material colors for each tile type to have two different texture sets. I used the 1024x1024 map size for both tiles and tried to align them so that they could tile correctly from the start and the end of the UVs.
I used Designer and Photoshop together to create the ceramic walls and the ceiling; the carpets were a mix of Photoshop, Designer, and Painter; the Terrazzo Floor was created only in Designer. Most of the materials were tweaked in Unreal to control the roughness the way I wanted. Other assets like table, chair, couches, wooden walls, cupboard door, arch, and windows were made in Substance Painter.
As mentioned previously, for the ceramic wall, I found an image, made it tileable in Photoshop, and generated diffuse and height maps.
In Substance Designer, I imported both maps (diffuse and height) and created a new graph. I was able to generate AO and normal maps from the height. I also created another dirty version of the material and used vertex paint in Unreal to mix both versions.
Another example is the floor tile which was created in Designer from scratch. The graph is complex, but I'll try to talk about some of its parts.
First of all, I gathered some reference for my scene and Terrazzo.
In Designer, I made several shapes and combined them many times, then used tile sampler to create floor tiles and mix them again with the black tile. Using nodes like distance, edge detect, blend, levels, blur HQ helped me to create those shapes. To mix them, I used blend nodes. Also, I used Flood Fill and Flood Fill to Random Grayscale to generate random colors or as masks that can be utilized in blend nodes.
I created 4 variations of the Terrazzo maps, then I used tile sampler to randomize 3 versions, then I used a rectangle shape to place the 4th version. I created black tiles from a bunch of shapes, then blended them together.
With the grayscale conversion, levels, blends, blur HQ, and bevel I can create the heightmap, and with the height, I can easily generate AO and Normal maps.
Playing with levels and blends, I can get a good roughness value, and with some nodes like dirt and dust, I can add extra details to roughness and basecolor.
Finally, I used RGBA node to compress roughness, metallic, and AO in one map.
The table was textured in Substance Painter. I divided the low-poly and high-poly into parts with the same names and mesh suffixes _low and _high so that I could bake them by mesh name instead of exploding the meshes.
I used 3 variations of this diamond-shaped material and then added the wood material. Lastly, I added a dirt variation, exported the textures in 1024 size using PBR MetalRough and compressed roughness, metallic and AO in one map (RGB) - I called it RMA.
Preparing the Renders
As I said before, I started with creating proxy models and replaced them every time I made some progress. At the same time, I tested lighting right from the blocking stage until I reach the final render. For my project, I wanted to create two main shots so I focused on 2 cameras.
I created 2 main cameras using CineCameraActors. Both had Focal Length = 35, Sensor Width = 20mm), and Height = 30mm.
For the lighting, I created a Stationary Directional Light to create the sunlight. I used a very strong light, about 100 lux, with a temperature of 4000 to make it more orange, and rotated it until I got the direction I needed. I also changed the values of the Indirect Lighting Intensity to add more to the GI, and the Volumetric Lighting Intensity as well.
I changed the value of the Light Shafts to create sunbeams and also Cascaded Shadow Maps to control the shadow distance and how sharp the shadows are.
Additionally, I created some Point Lights. They have a subtle intensity and work as fill lights to lighten up some dark areas; most of them don't affect shadows. As you can see, most of the light is coming from the Directional Light.
I also added some Sphere Reflection Captures just to add some reflections in several areas. Whenever I added something, I tested it in the low or medium quality (in the final stages, I used high or production build quality).
I also created a skylight that used a default cube map as a source type (SLS Specified Cubemap). I selected one that was very subtle but added some cool reflections, especially to the window glass.
I used a PostProcessVolume to add the final touches: Bloom, very subtle Chromatic Aberration, Dirt Mask, very subtle Lens Flare, Image effects, and AO. I also played with Color Grading, added Color Grading LookUpTable in Photoshop, imported it to UE4, and made the intensity very subtle.
In Photoshop, I mixed two ColorLookUp adjustment layers, saved the Color Grading LUT, and used it in UE4 to give the image some contrast.
For the light leaking (Godrays), I created an ExponentialHeightFog from visual effects panel and played with values until I got nice results.
Also, I created very subtle smoke using a particle system and Particle Master Material. In the material, I set the domain to volume and added some nodes. The Spheremask generates a circular mask on the material and works as a gradient mask for the smoke to look like a spherical haze, not sharp squares. Then I plugged Absolute World Position, Particle Position, and Particle Radius nodes to the Spheremask, Multiplied them by a scalar value, then converted it to a parameter, called it Extinction and plugged it to the Extinction output. In Cascade, I plugged this material to the emitter, then played with the values of Initial location, Initial velocity, Lifetime, and Initial Size. I made the Extinction value very low to give a very subtle smoke effect inside the Godrays.