Yi Sun shared the workflow behind the fusilli pasta material, showed the nodes used in Houdini, and explained how the sauce was created to be deliciously realistic.
Dajia hao, my name is Yi Sun. I’m a Texture and Material Artist based in Shanghai, China. I am currently laid off because the project I put my heart and soul into got canceled, which is very sad. Anyway, I studied Animation at the University of Technology, Sydney, but most of my 3D skills are self-taught. After graduation, I started as a freelance 3D generalist making 3D assets for VR projects. I found myself especially enjoying the texturing process, I think this is where the magic moment happens. So I decided to invest all my skill points in the texture artist route.
Like most material artists, my introduction to Substance 3D Designer is from Daniel Thiger’s tutorial series. He is almost like the Neil Armstrong of Substance 3D Designer, who inspired so many artists including me to become texture and material artists. Back then I was painting all the textures by hand in Mari and Substance 3D Painter, I never thought texturing could be done procedurally with so much flexibility, my brain exploded. I started looking for all the tutorials I can find on YouTube and dived headfirst into them.
The Fusilli Pasta Project
The Fusilli Pasta project is mainly an experiment with Houdini workflow because when it comes to distributing shapes in Substance 3D Designer, the “Tile Sampler” and “Shape Splatter” nodes will always cause shapes to overlap and intersect. As far as I know, there is no easy way around it. The goal of this project is to solve this problem. So I decided to use Houdini to run a simple physics simulation to make a pasta pile and then bake all the necessary maps such as Normal, Height, AO, ID, and Curvature and import them to the Substance 3D Designer.
Just like cooking in real life, pasta and sauce need to be made separately. I start by downloading fusilli pasta models from Substance Assets and importing them into Houdini. Because the models were arranged in a row, we run them through a “for each” loop with transform -$CEX, -$CEY, -$CEZ, which brings all the pasta pieces to 0,0,0. That way, the pasta can distribute correctly. After that, I connect the result to the “Assemble” node and give the piece attribute a name, for example, “Piece”.
To distribute the pasta, I create a “Box” node and connect it to the “Points From Volume” node, adjusting the scale and seed parameter, then connect both the “Assemble” and “Points From Volume” nodes to the “Attribute From Pieces” node and put “piece” in the "piece attribute". Next, I use “DC” (diffuse color) to randomize color and “N” (normal) to randomize rotation. After that, I connect it to the “Copy To Points” node.
To set up the collision object, first I add the "Box" node, use the "Extrude" node to create a container for the pasta to fall into, then use the Houdini preset and assign a "Static Object" to the "Container". After that, I open "AutoDopNetwork", find the "Static Object: Container", go to Collisions – Bullet Data, and set "Geometry Representation" to "Concave".
For the dynamic object, I select the whole pasta and assign them as "RBD Objects"; when it’s done, just let the physics simulation play. I experimented with different random seeds in the “Points From Volume” node until I get the result I want. Then I connect “DOP Import” to the "Unpack" node.
For the baking setup, I create a grid the same size as the container, connect it to the "Auto UV" node, and set Island Padding to 0, then connect the unpacked pasta to the "Mesh_Tiler" node, which rearranges the piece around the edge and makes the result tileable, merges the result with the "Auto UV" node and subdivide the result.
Finally, to bake all the maps I need, I connect the “Auto UV” and the merge result to the "Maps_Baker" node, set the resolution, set the Max Trace Distance to 10, tick Diffuse map, Normal map, AO, and Height, set Height format to EXR, also tick Tangent Normal Flip Y, and click “Render”.
I didn’t use the baked Height map to generate the Normal map in Substance 3D Designer because it will cause an artifact on the Normal map, and all the hard edges will be visible. I can increase the subdivision level but it will greatly increase the baking time as well, which is not a good solution, I haven't found a way around it so far.
After I was done with the pasta, I started making the sauce in Substance 3D Designer, I followed the instructions of the cooking video and prepared all the ingredients: bacon, minced meat, tomato, onion, and carrot.
The diced tomato was created by warping a hemisphere shape. During the cooking process, the tomato will usually slowly disintegrate, so the tomato piece will look more roundish rather than cube-shaped.
To create the shape for minced meat, I reuse the diced tomato shape and connect them to the "Splatter Circular" node to create small lumps of minced meat. Minced meat usually floats on the top of the sauce, so I need to make sure it looks correct. Then I use the "Creased" node as a mask to make minced meat look like it’s been stirred.
Diced onion and carrot can be created by using the “Cube 3D” node, then using the “Directional Warp” node with the “Clouds 2” node to deform it.
Then I blend all the ingredients together with the base sauce layer, which I created by using the combination of the "Creased" and "Perlin Noise" nodes.
The base color of the sauce is very important, without it you have no idea what this is. I pick the colors from the food photography – they always have the best lighting and color – and blend them layer by layer. There are no magic tricks to make the base color look good instantly, it all comes down to patience, carefully selecting the color for each element and lots of minor adjustments.
Mixing Pasta & Sauce
After I get my sauce ready, I can now mix it with pasta, but here comes the tricky part because we didn’t use the Height map to generate the Normal map, all the Height blend process needs to happen in the Normal channel. But the Normal blend is not as intuitive as the Height blend, it won’t cut out the overlapping area like the Max Blending mode, so we still need to use the baked pasta Height to blend with the sauce Height to get the overlapping area as a mask for the Normal map.
Because of the same reason, AO has to be done manually as well. Just like the Normal map, I blend each ingredient with its mask and also multiply the Curvature map on top of it.
Finally, I used the ID map to randomize the pasta color and blend it with the sauce base color using the mask I generated from the Height blend. Then add the color of the cheese, black pepper, and greens.
As for lighting and rendering, I found a nice-looking photograph of pasta and replicated the lighting, which saved me time designing lighting from scratch. The key to rendering this kind of material is the subsurface scattering, without it, the material looks like plastic.
Find a nice camera angle and click "Render", then – voilà! – you have fusilli with bolognese sauce. Bon appétit!
This is my first experiment with Houdini workflow, I think in this project I harness 1% of its power. I believe there is so much more potential in the Houdini material workflow that is waiting to be discovered. I will continue to experiment with more Houdini abilities in the future.
I think Substance 3D Designer is very difficult to master indeed. I'm still amazed by other artists' works on ArtStation from time to time, which makes me realize that I still have so much to learn. There are endless node combinations, and each type of material requires a different approach to create, which makes it overwhelming to learn. The best way to learn Substance 3D Designer is just to start using it without thinking too much.
Creating nice-looking materials is a totally different thing, you must study the subject matter as much as possible and focus on life, rather than the software. I usually ask myself these questions: if it’s a man-made material, how was it made, is it handcrafted or made by machine? What's the blueprint look like, is there any historic documentation, and what is the aging process like? If it's material from nature, where is its location, and what are the weather, temperature, humidity, and lighting conditions like? We can never know enough about a subject. Every bit of knowledge is relevant when I'm making the texture and material.
For example, there is a website that documents all leather types, processing steps, repair, dyeing, caring, and so on. There are so many articles and videos about leather that could take years to study, and this is just one type of material. I can't imagine what it is like to study other types of materials, like stone and wood.
Studying the subject matter is also the most interesting part of being a material artist because you will end up with so many weird facts. For example, during this project, I watched so many cooking videos that I started to dream about pasta. I know which brand of pasta to buy, what type of tomato and cheese to use, and what herbs can make pasta taste better. Now I believe I have pasta sauce running in my veins.
In all seriousness, there are a few things that I want to share with everyone, something that I always remind myself of.
- Practice. I used to binge-watch video tutorials and read breakdown articles, but just like every other skill, I don’t get better by watching and reading. I need to actually start practicing and get my hands on it, so now whenever possible just find a really interesting subject and enjoy the process of creating it.
- Take notes. I can’t store all the node combinations just in my brain: after reading breakdown articles, watching tutorials, or studying other people’s project files, I always record everything I learn in Notion, categorize it, and come back when I need it. It will take some extra effort but I think it is worth it.
- Get organized. Reusing graphs is common practice in Substance 3D Designer. Keep your graph clean and comment on every step, you will thank yourself later. Especially in a production environment, in which you share your file with your colleagues: if your graph is clean and annotated, they will love you, believe me.
Thanks for reading, I hope you find it helpful! Thank you, 80 Level, for this opportunity!