James Jiang showed us the workflow behind the CTA Train project, discussed the texturing process, and explained why he adds stickers to his works.
Hi! My name is James Jiang, I am an environment artist at Crystal Dynamics. As an international student from China, I got my degree in computer animation from Columbia College Chicago last May. Right after my graduation, I joined Crystal Dynamics as an associate environment artist to work on the future of Tomb Raider. I was promoted to Artist I this June.
Video games are my passion because they offer a unique blend of creativity, immersion, and art expression that I find captivating and fulfilling. Ever since I picked up a controller and delved into the vast virtual worlds, I have been entranced by the limitless possibilities that video games present.
Working as a video game environment artist is a perfect balance between artistic expression and technical problem-solving, plus there is nothing more satisfying than seeing a beautiful scene rendered in real time in front of your eyes.
The CTA Train Project
During my time at CCC, I embarked on an ambitious capstone project that drew inspiration from "The Last of Us." My vision was to create a unique rendition of our classroom, infused with elements from the acclaimed game. I had a very unique and special time when I was at Columbia and as a tribute to this significant chapter in my life, I aspired to craft something truly special that would resonate with the people within my school community, allowing them to connect with the project and cherish the memories we shared together.
On a typical day, while waiting for the train, a sight caught my eye – a breathtaking train adorned in the iconic blue hues of our school. It was the first time I became aware of our school's unique and specially painted cart for the CTA. At that moment, a brilliant idea materialized in my mind – this would be the perfect project. By crafting a representation of our school's distinct train, I could capture the essence of Chicago, as its design was both widely recognizable and captivatingly iconic to everyone familiar with the city's transportation system.
The process of reference gathering is more difficult than I thought it would be, people usually like to take pictures of the entire cart instead of zooming in on the tiny mechanical details I need. I managed to find some blueprints of the current train on the CTA website, which is super helpful. The hardest part to do is the details on the side of the train as well as the parts hidden in the shadow below the cart. I did my best to find references for those areas but still had a hard time identifying what was going on down there.
Eventually, I was able to get some of the details from some train enthusiast's YouTube videos, they go in there for all kinds of details. It is really helpful to take screenshots by pausing the video, and more so, just by asking them online. I ended up learning so much about the train as a result.
The modeling process started in Blender. I wanted to use Blender over Maya because I knew I will be making many changes when it comes to making something this size. It was hard to get the proportion exactly like the real-life train and adjusting back and forth was how I spent most of my time during the entire modeling process.
Once I got the proportions blocked out to my satisfaction, I started thinking about how to efficiently modularize this model to save time as well as make the texturing process easier down the road. If you look at this train you will notice that a lot of the parts can easily be mirrored
Mirroring is performed on bigger parts because they don't draw too much attention to the eye, they also stay apart enough so it's not obvious. Almost everything in the example below is mirrored on both X and Y axis. I made sure to keep a unique part in the middle to break the pattern, as well as the details at the bottom of the cart. Smaller elements like the signal light, wheels, and vents are duplicated around, when mixed with mirrored parts they help break up the mirrored pattern.
When I figured out where everything should be placed, I moved on to high poly. Because of the time constraint with other duties that I had at the time, there was no way for me to sculpt every part. Initially, I only sculpted the parts on the side and the top of the train because they take up most of the space. These pieces also have straight-line patterns on them and they are perfectly straight (they don't sell well as a run-down train). I intentionally added a really obvious dent on one side of the part to help break up the mirroring pattern, this also helps tell the story of how the train was derailed.
After some closer examination, I decided to also sculpt the coupling area of the train because of how many organic shapes and details are in that area. When all the sculpting was completed in ZBrush, I decimated them down to a reasonable polycount for Nanite and brought them back to Blender.
For the rest of the parts that were not sculpted, simple Boolean operations were utilized. Blockouts were properly boolean together and most of the modifiers are applied. Meshes that are cleaned up are applied Bevel and Weighted Normal modifiers; I personally love this method because it gives you quick and clean meshes. Sculpted and non-sculpted meshes worked surprisingly well together.
It was a tedious process trying to nail down every little detail but it was totally worth it. The biggest challenge is to figure out what exactly is going on with the parts that are usually hiding in the shadow. I had to improvise some mechanical-looking parts and use kitbash parts for those. I am especially proud of how the wheels came out, there were very few references I could work with and they ended up being one of the most detailed parts of the train.
Here are some renders of the high poly before I started texturing:
UV unwrapping was the hardest part of this project due to the massive amount of things I needed to unwrap. With Nanite meshes, the quickest way to lay down a seam in Blender is to select an edge as a starting point, then hold Ctrl+L to select the end edges of the seam. This operation will select the shortest path between points A and B, however, this method doesn't always work as the shortest path might not be the best for creating a seam. Compared to non-sculpted meshes it is much easier, beveled meshes have looped seams and they can be selected by Alt+left click in edit mode.
In this stage, it is critical to figure out exactly what you want to mirror to save texture space. Thanks to Blender's mirror modifier, you can easily offset the mirrored UVs by one using the offset UV option without manually moving them. This is very handy when it comes to projects of this size as it's so easy to lose track of where each part should be. You can also copy this modifier to selected objects so you don't need to do it on every object.
Once everything is unwrapped, don't forget to optimize texel density! For this project, the interior of the train is designed to be pitch black so there's no need to give them high density, this goes the same for the faces stuck in between meshes that will never see the light of day. The process is to unwrap everything, select the smaller pieces that the player will focus on, and scale them up by 1.5 to give them more resolution; at the same time select back/in-between faces and scale them down by 0.25 to save even more resolution. This entire process can be done in Blender, I used the UV toolkit to check texel density and UV packer to effectively pack rescaled islands.
All of the parts were packed into 7 different texture sets as shown in different colors in this image.
In Substance 3D Painter, I used UDIMs to texture this model, this method makes aligning details across all texture sets much easier. I didn't bake with a high poly mesh because the mesh was already high poly enough to get the information I needed. Instead, I just baked with "use low poly as high poly" to get all the maps.
Working with a mesh this dense is surprisingly easy in Substance 3D Painter, although trying to work with all 7 texture sets at 4K was quite the challenge. I often needed to hide meshes to focus on one area alone and then turn them back on at 2K to see how the textures were working as a whole.
The process of texturing is a pretty standard Metallic-Roughness PBR workflow. I made several custom smart materials and used them across all texture sets. The most complex one is the rust smart material, which is a black metal material with a red rust material blend. On top of that, the blend also has intense rust chipping normal, making it look old and run down.
Another smart material that was used a lot is blue paint material. It uses the classic Columbia blue as the base (I mixed the same rust material underneath). A dirt layer was added to give the color a little break as well as make it look old, it's also a good roughness break on the perfectly shining paint layer. A scratch layer was then added to reflect the damages from nature over time, this was also applied to the metal edges to show edge damage. Finally, a roughness break layer was added to infuse an extra layer of roughness breakup from the rest of the material and was also used to affix moisture to the surface.
All of the details were 1:1 to the train in real life, including all the signs, logos, and custom paint on the side of the train. A fun little Easter egg is the serial number of the train, the 916 building is where students in our major take classes.
I love adding stickers to my art because I think they are a very efficient way to add points of interest to your model and a great storytelling opportunity. For this project, I reached out to my friends and teachers and asked them to give me a png file that represents them. I thought this is a great way to remember my time here. I thought it would be hard to get people to do that in the final week but people loved this idea and I got them on there!
For the final touch, I added some leaking effects around the model for additional wetness. I think they break the uniform look of the black-rusted metal material and add interesting little details.
The final renders were created in Marmoset Toolbag, which is my go-to software for game assets. I love Toolbag because I can constantly export my textures from Substance 3D Painter and they will update in real-time in Toolbag so you can see what your textures look like under real lighting conditions.
For the camera settings, I decided to go with a 120mm focal length. A vehicle this size using a low focal length will greatly distort the back of the train from certain angles, a 120mm focal length will make the object look compacted and mighty.
I didn't do anything too fancy for the lighting, I used my favorite studio lighting environment from Painter, Studio 02, as the environment light. I made sure there were highlights coming from the top of the train to create nice reflections to show off the roughness map. I also added a spotlight to light up the head of the train from the side. Additionally, a couple of spotlights were added near the bottom of the train to increase the visibility of the bottom parts.
When the renders are finished, I like to do a little color grading and enhancement in Lightroom. Usually, I just adjust the exposure to make sure everything looks visible and only do minor tweaks on the colors. For texture and sharpening, I like to lightly go over them, as they help make the details in the texture pop. Do keep in mind that this pass in Lightroom is to make your render look better, not alter color and details in an unrealistic way.
I spent about 6 weeks working on this project during my final semester at Columbia. Unfortunately, I had other things I need to work on at the time, I wish I had more time for polishing. This project was a great test of my skills and patience and I'm pleased with what I came up with given the time I had. What I'm really happy about is people from my school loved this project and it was posted on the school's social media. For me, that's the best way to remember my time at Columbia, which is why I started this whole thing in the first place.
Looking back at this project now after I've been working in the industry for a year, I realized how many things I could improve on it. I think that's the beauty of our industry, you can always learn new things and apply them in your future work. Can't wait to make the next best thing!
Thank you for reading this article and I hope this article is helpful to you! Thank you, 80 Level, for the opportunity to share my work and process, it is an incredible honor.
James Jiang, Environment Artist
You may find these articles interesting