In case you missed it
You might find these articles interesting
Hi, I'm Dan McCabe, an experienced environment artist at Codemasters Birmingham. I am a huge fan of Substance Designer and although I often use it to make materials for scenes, I find it really fun and challenging to treat it almost like a modeling package at times. If your interested in any of my previous projects or have any questions, please message me on ArtStation.
G-Shock Watch: Idea and Inspiration
It will come as no surprise that this project was inspired by my very own watch. I really like the design, in fact, it’s one of the reasons I got it, and as I began checking the time more and more often since I started wearing it I studied it as we artists do. I eventually reached a breaking point and decided to take the challenge on and attempt to make it in Designer.
Breaking Down What I'm Making
Graphs in Designer can look crazy and my lack of organization does not help. Typically, I would use a lot more comments and frames if this was something other people would be working with. Having said that, I am going to try and make sense of it anyway.
First off, this large graph is made up of lots of smaller graphs, I call these assets. They tend to be sections of the object I am trying to make. Before I start I try to break up what I'm going to make, this the same approach I would take if this was a mesh I was actually modeling.
This breakdown gives me a good idea as to how I'm going to tackle the object. Personally, I prefer to start with the deepest part of the object and build up to the highest. So, in this case, it would be the displays with the digits and the dials along the top, then the ring section marked with dark purple before tying it all in with the outer shell which is the exterior body that's painted white.
If we look at the graph in this way it becomes a lot simpler very quickly. Each of the red boxes is an asset or section of the watch. The unmarked areas in between are different blends and pathing nodes that allow me to compile everything as I progress through the graph. We will get to the blue and green areas later.
If we zoom right into one of those red asset box sections near the center we will see the part of the graph that creates the hands. From here, we can break it down even further.
We can take this section of the graph into 4 more sections, that "compiling" part we spoke about earlier which runs across the whole graph, and then the parts that responsible for the actual hands and their shared components.
The blue and green sections are the big and little hands of the watch (or hour and minute hands if you want to be fancy). Here, I have just used simple workflows to create shapes, subtracting and adding with blend nodes, using skew and transform to manipulate the shapes into what I need.
The red section is where I keep things that will be used by both the small and big hands. This isn't an exact science and it changes regularly, but in this case, you see a few disc shapes of different sizes and a gradient - they came in useful for both hands so I tried to keep them relatively central in this section of the graph.
The pink is the compile section, this part is super important, this is where it all comes together through various nodes, typically a blend either set to add or max lighten. Then I put a very small blur HQ grayscale on to soften any sharp edges. Finally, I adjust the height values with a histogram range, height blend, or something similar before it's complied with the rest of the graph but it depends on the case.
The compile section builds up over time starting from the bottom of the mesh to the top as discussed earlier. Once it's done it makes a rather satisfying gif:
Making It Tick
Making the digital display match up with the hands was quite a challenge for me but definitely worth it. To you, tech artists or programmers out there, this is probably something you could do with a blindfold on, but I'll explain my thought process for people who are less familiar with functions in Substance Designer.
First, I needed a parameter to work with, so I took a tile sampler and exposed the rotation value. I thought of doing this with a transform node but I didn't want to work with the full transform matrix so I opted for this to keep things simple for myself.
I then jump over to my text node buried in the web of the text and other decals you see all over the watch. Here I expose the parameter as an empty function and set the font to be ‘DS-DIGI’ which I found on dafont.com.
Once inside the function, I did a few things to be able to get the effect I was after. This process was the same for hours, minutes, and seconds with a few values changed. I will explain mins below as the other two used that as a base.
The function boils down to 3 sections, input, process, and output - what I have got and what I have to do with it to be able to get out what I want.
- I started by grabbing the rotation value I exposed from that tile sampler earlier and renamed the float to min to make my life easier. I then converted that float into degrees as the parameter output is ‘turns’ which is essentially a float that runs 0 to 1 (a percentage through the rotation). Luckily, Designer has a converter node for this so I wacked one of those in and divided it by 6. I made it an integer to strip off any decimal place values so I was left with the rotation parameter outputting 0 to 59 which was what I needed.
- To process the data I ran an integer comparison against the output, as an example, let's choose 1 minute. If the value output was equal to ‘1’ it would tell the if-else node to output the string value of ‘01’. The 0 is there because it's a two-digit display. This process continues down and checks against all values from 0 to 59. If it returns false it just keeps going until it gets the one it needs.
- We now have the string value we need so we output that as the value for the function and it gets entered into the watch. Now we can rotate the hand however we like and the display will just update to match the correct minute.
This section was highlighted earlier on the full graph screenshot as ‘masks and albedo’. The export workflow for this asset centered around allowing the user to have a good amount of control over the albedo. This slotted in well with the masks I had already accumulated from making my height map.
Here's a look at the different sections:
User Swatches: These are exposed uniform colors that allow the user to change values for particular sections of the watch by hooking them up to the blend nodes with the mask inputs. A couple of these cannot be controlled by the user, the goal was just to make it more user friendly.
Masks: These were taken from various points in my height map and brought into one place. This is what causes the spider web effect you see on some graphs. They then get used as the alpha channels for the blend nodes where the user swatches are fed into.
Albedo Stack: Here I build up the albedo for the watch the exact way I did for the height, going from bottom to top resulting in the finished albedo at the top. It's a very simple process of just using one blend node as the background for the next one with a black uniform color as the base (see gif below).
Metallic and Roughness: Using the same masks as for my albedo I build up the roughness and metallic data. Normally this would be a much larger part of a typical substance graph but in this case, it didn't need much room as it was mostly a matte finish and I wasn't going to add wear or dirt.
Other Exports: As the name suggests, this is where all my other data such as opacity, normal, height, opacity, etc. come to get exported in one easy-to-find place.
Finally, it was a case of taking all those maps and presenting them. I used Marmoset Toolbag with a couple of planes, added displacement and tessellation along with the other maps, and a box made for presentation purposes.
When I'm getting to a point where I'm ready to start presenting the work, I always find it helpful to get some feedback. My personal choice is discord communities. There are lots of great ones out there; I use 021 Space mostly, feel free to join, get some great advice, and meet really cool people!