Rebecca El Cheikh shared a breakdown of the Nostalgia project, including creating the base carpet with a Tile Random node, generating cars’ paths and animating them, achieving flexible control of car colors and variants, and offering tips for creating appealing materials.
Introduction
Hey everyone, my name is Rebecca El Cheikh. I’m a Lebanese Environment Artist and I’ve been living in Germany for the past year and a half. Since my last interview, I’ve worked at King Art Games as a 3D Artist, where I created props, materials, and small tools for my team over the course of nearly a year and a half. Now, I’m preparing to move back to France while simultaneously seeking my next opportunity.
About the Nostalgia Material Project
I’ve always wanted to create an animated material ever since I discovered Johnny’s Thing of the Deep. I was completely blown away by Substance 3D Designer’s capabilities and the endless possibilities it offers. When I started Nostalgia, I knew right away that I wanted to design a cityscape-like material with cars driving around. My main goal for the project was simply to have fun and create something unique without focusing on making it particularly practical. I wasn’t entirely sure of the direction at first, so I began with a more realistic approach. I drew inspiration from various procedural city materials by artists like Jan Trubač. However, early on, the idea of creating an old city rug, something many of us played with as kids, suddenly popped into my head, and I knew I had to pursue it. This is what the final animated material looks like:
Workflow With Substance 3D Designer
My workflow varies depending on the type of project, but it always begins with gathering plenty of reference material for inspiration. When working in Substance 3D Designer, my approach is shaped by the project’s purpose. If I’m creating a tool, my main focus is ensuring its feasibility and setting up the project to function correctly before refining its appearance. A similar approach was applied to this project, and my priority was handling the animation first and confirming its viability. Only after that did I move on to creating the cars and enhancing the visuals. Once I’m satisfied with the overall look, I begin the rendering process.
Animation, Cars’ Paths & Texturing
Creating the base carpet through Tile Random
This project is built around an initial Tile Random node set to 3x3, with a bit of splitting between the squares. Every element on the carpet is generated by adding or subtracting an Edge Detect node. Each entity is assigned a specific value, allowing a Gradient node to accurately determine its base color.
Creating paths from different masks attached to the Tile Random
One of the first challenges I encountered was masking certain squares to generate a path. However, Tile Random doesn’t include a Mask Map input by default. To work around this, I modified the node and added the input myself, despite my limited experience with the FX-Map node. While the solution isn’t flawless and occasionally misses some squares, it works perfectly well for the project’s needs.
With this setup complete, I can efficiently generate sections of road paths for the cars to follow. Using the same Tile Random node but with larger-scaled squares, I select an appropriate number of masks and apply an Edge Detect node to ensure the spline is positioned in the center of the road rather than along its edges. From the generated mask (shown below), I use a Mask to Paths node, followed by a Paths to Spline node, and finally, a Scatter on Spline node.
Animating the path with a basic value processor
Before creating the cars, I ensured the project was functioning correctly by testing the paths with simple squares. I added a float input within the Scatter on Spline node and used it as an input for the Offset on Spline parameter.
Getting started with animation in Substance 3D Designer is surprisingly simple. It involves adding a Value Processor node and placing a Get Float node inside it. The Get Float node then references the $time value, and that’s all it takes! This project didn’t require complex mathematical functions; I only needed the Offset on Spline parameter to increase in a linear motion. The only adjustment I made was multiplying $time by -1 so that the cars moved forward while following the standard right-hand driving system, or clockwise on the spline in this case.
To easily preview the animation, I always use Substance Player. If the .sbsar graph is relatively simple, animations run smoothly and clearly display the intended speed. Below, you’ll see the initial output with basic squares, a single path, and $time multiplied by -1. The animation appears slightly slow, but this can be easily adjusted by multiplying the value by -2 or a lower number to speed it up.
Creating the cars
I wanted maximum flexibility in controlling the cars’ colors and variations while ensuring easy extraction of color and height information. To achieve this, I combined multiple channels into a single color input, which was then plugged into the Scatter on Spline Color input parameter.
I structured the RGB channels as follows:
- Red: Stores height information.
- Green: Represents different car components, which are later assigned colors using a Gradient node.
- Blue: Functions as an alpha channel to mask out the cars. It also contains four distinct value levels, which act as masks for different color variations.
The Red/Height information was generated by blending multiple transformed shapes with gradients, resulting in the effect shown below:
By adjusting the blue channel, I created four variations of the RGB setup, allowing for four distinct car color options. The process of mixing the RGB input nodes follows this structure:
Applying a Gradient node to the green channel enables an unlimited range of color possibilities. For this project, I chose four highly saturated and vibrant colors to enhance the nostalgic feel. This choice complements the childlike, blocky aesthetic of the cars, reminiscent of toy cars designed for children under the age of six.
Adding the cars to the path
The four RGB variations that were created can now be used as inputs in the Scatter on Spline Color node. This allows different car colors to appear along the same spline input, introducing more randomness to the final output, as shown in the image below. At this stage, the individual channels can be easily extracted using the RGBA Split node, ensuring each serves its intended purpose:
- Red/Height is added to the height channel.
- Green/Components is used to apply color gradients in the base color.
- Blue/Alpha functions as a mask to separate the different color variations in the base color.
Putting everything together
With the cars completed, all that was left were the finishing touches. The carpet height was kept low enough to be almost invisible, while small beads were added to enhance the carpet-like texture. I also created flowers and grass to bring life to the green fields.
For the building blocks and pens, I used simple squares, circles, and gradients, scattering them across the inner squares with the Shape Splatter node to achieve a randomized color distribution. The final height, base color, and normal map look like this:
Summary
The texturing process took about 10 hours to complete, but surprisingly, the most challenging and time-consuming part was the rendering. Out of habit, I chose Marmoset for rendering, a decision I later regretted. Since Marmoset doesn’t support animated textures, I had to export the textures to the correct frame and render each one manually.
I aimed for an 8-second looping animation at 25 FPS, which meant rendering 200 frames by hand. As the process dragged on, I realized just how tedious and repetitive it was, but I was determined to see it through. Had I chosen software that supports animated textures, I could have streamlined the workflow significantly. In the end, the rendering took another 10 hours, effectively doubling the overall time spent on the project, something that could have been avoided with a different approach.
Despite the exhausting process, seeing even one second of animation was enough motivation to keep going. The final result was incredibly satisfying, capturing exactly what I had envisioned from the start: a fun, visually engaging project with a unique creative twist.
My three key tips for creating appealing materials would be:
- Write down every idea, even the ones that seem small or experimental. I always keep a collection of potential projects, waiting for the right time to bring them to life.
- Push the research and inspiration phase as much as possible. The best ideas often emerge after deeper exploration. Had I stopped searching too soon, this project would have turned into a realistic cityscape instead of Nostalgia. I also don’t hesitate to revise or repeat a project if I discover a stronger concept.
- Presentation is just as important as creation. No matter how beautiful your material is, a poorly presented render won’t do it justice. Investing time in showcasing the project well ensures that the effort put into the material gets the recognition it deserves.
Preparation For The 2024 Substance Designer Insanity Awards
I was completely blown away when Adobe approached me about the Insanity Award. Competing for it was never my intention, I simply wanted to have fun creating this project. Receiving such an honor and recognition among so many talented artists is truly overwhelming, and I couldn’t be happier. This award has already inspired me to push my creativity further, exploring new projects that are even more challenging and exciting. I already have a few ideas in mind and might just aim for another win in next year’s awards.