, by Cino Lai

Procedural Modeling: Creating Parametric Stylized Houses

Cino Lai creates parametric assets with Substance 3D Designer

  • Game
  • Interview

I’ve been working in 3D art design for 10 years, now. During this period, the tools, the workflow, and even the industries using 3D design have continuously updated and been improved. And we can certainly see this ongoing evolution and development within the Substance tools – indeed, this article today will concern the parametric modeling function of the new Substance 3D Designer. This has changed my traditional understanding of Designer, as it combines parametric modeling with parametric textures. 

I’ve had a lot of fun testing out different cases to get to grips with this new approach. One of the coolest things I’ve discovered is that Designer can transform my ideas into reality, while still surprising me again and again. Here, I’ll share the new procedural modeling function in Designer, and my thoughts on the workflow, via my construction of a parametric stylized house.   

Views on procedural modeling in the new Substance 3D Designer 

Since the addition of the new parametric modeling function, my design efficiency has received a tremendous boost. I can now quickly verify and optimize a lot of different elements. Just as with the familiar parametric texturing, the model creation process is nonlinear. By combining parametric models and parametric textures, I can create parametric assets with different shapes, textures, types, and even styles, simply by adjusting parameters in one file.  

For example, the following comparison diagram comes from a Designer file. I simply need to adjust the parameters to get the various effects I want. This is also a big help in building up my own parametric asset library. 

The parametric modeling function also provides a high degree of design freedom when creating assets. For example, as seen below, I can create a window whose shape is modifiable, determined by making various adjustments to its pertinent parameters. Or, another possibility: I can directly import a completed window model, and make variations of this model (open, closed, half-open, etc.); I can then use these variations to parametrize and randomize the wall, creating a rich wall structure overall.  

Case objectives 

In the past, I’ve been a part of many game development projects, and encountered various situations where the huge demand for 3D assets in the project has created problems such as increased labor costs, lengthy development cycles, and strains on R&D quality. And this isn’t just an issue for game studios; I think all 3D visualization industries tend to face the same problems. This year, more companies than ever before have begun to implement the process of industrialization – that is, the production of assets en masse – in an effort to solve these problems.  

With its new parametric modeling function, Designer is a valuable tool in this process of large-scale production. In this type of process, an artist will define the limits of the design of the final asset, and rationally quantify these perceptual artistic expressions in Designer; he or she can then form a wide range of high-quality assets, and output them extremely efficiently, by simply adjusting parameters as desired. 

As mentioned, I’ll demonstrate how this can work with the creation of an entirely parametrically generated house. I plan to divide the house into distinct elements, creating each one separately, and then to combine these parts in Substance 3D Stager, to bring together the house as a whole. 

I can adjust the color, quantity, size ratio, and random distribution of each component, as well as inserting and switching between different model elements. Like this, it’s easy to establish infinite variations for one asset – which is very convenient for asset management. 

Preparation

First, it’s important to clarify the scale of the scene, the general asset categories, the asset parameterization control accuracy, and other information like that. For example, for this house I need to create a scene with a fairly large scale, and I want to control the type, style, and color of buildings. Conversely, I don’t need to make countless parameter adjustments for every small detail, so I can eliminate any parameters that are meaningless to the objectives of the project. I this this kind of consideration is significant, in order to work efficiently. 

Here are all the model assets that I’m importing for this project:  

For the UVs of the models, if the asset is a combination of multiple materials and requires a complex UV layout, I’ll divide up the UVs in advance and prepare their color ID. 

If any imported model or any model created in Designer has only one material, I’ll carry out my UV mapping directly in Designer, and control displacement and scaling. In Designer’s ‘Parametric model’ node, some UV control nodes are provided. For example, the stones on the ground use planar projection and UV offset to create material variations for each individual stone.  

Model

Keeping in mind the planning phase mentioned above, I first make the wall, providing different composition schemes in Designer, and selecting the most appropriate way according to the needs of this particular project. 

There are two common ways I do this. The first is that I have a set basic shape, on which I need to generate assets. This basic shape can be created in Designer, or it might be an imported model. In the image below, for instance, you can see I have an octagonal shape, from which protrude rectangular and triangular-appearing sections. Upon the faces of this shape I’ve wrapped imported modules – walls, wooden beams, things like that – inside the basic rectangular and triangular sections.  

To generate the assets on the faces of this shape, I’ll select the ‘Wrap on faces’ node in Designer. Each face of the model has four sides; I match the modular parts of the building to each of these four sides. The length and width of each face will determine the size of the assets generated on the model. 

Note that it’s important to avoid using models with ‘true’ triangular faces. If a triangular surface is required (as in the image above) this surface should still have four corner points – however, it’s possible to place two of these corner points extremely close together, to provide the illusion of a triangle. If ‘real’ triangular surfaces, with only three corner points, appear on your models, some uncontrollable asset deformation will occur. 

The advantage of this method is that it can efficiently match assets to many complex customized structures, and you can randomly combine each matched asset. 

My second approach is to use the ‘Array duplication’ node. As can be seen in the figure below, this node can copy the asset array in the X, Y, and Z directions. It can generate elements from the asset array in random order, or arrange them specifically as desired, and it can perform this action as many times as needed. 

The brick wall (below) will also use the ‘Array duplication’ node to create a brick pattern, and I’ll use the ‘Jitter instances’ node for natural random adjustment – to create some variation between instances of bricks, that is – to avoid the possibility of it looking artificial.  

In the creation of the parametric house, we aren’t only considering geometry. Curves are also key components when building parametric assets. Curves can be used as a distribution path to scatter models. Different curves can also be combined with one another to form rich changes with the model.  

As you can see in the screenshot below, the two ‘Scatter on curve’ nodes can be used to distribute randomly along the path of the curve; the model in this case will change according to the curve profile. Conversely, we can also use ‘Isoparametric curves’ to extract curves following the geometry topology. This would typically be carried out with somewhat regular models – when a model has been edited and reworked at length, its topology will often become complex; curve extraction in this case will probably be uncontrollable, and is not recommended. Also note that, in order to be able to extract the curve in this way, the model needs to be in the subdivision format and have a quad topology with proper edge loops. Though, conveniently, imported model assets will be switched to the subdivision format. 

I’ve created the parametrized roof (below) by combining the ‘Isoparametric curves’ node and the ‘Scatter on curves’ node; I’ve also used the ‘Jitter instances’ node to introduce irregularity.  

If different types of tiles are available, it’s also possible to create a collection and switch between the different models to easily change the style of the roof.  

Next, I import models for the leaves of the rattan (the climbing plant), and the leaves that have fallen on the road. After importing these models into Designer, I use the ‘Bend’ node to bend and deform the leaf model in different directions. The ‘Transform’ node is useful here too, to adjust the length and width of the model, in order to create variations on the basic leaf models. 

I use Stager to assemble the building on which I want the rattan to grow; once this is done, I export its model, and make a simple model, in whichever 3D modeling software I like, that duplicates the surface on the house where I want to place the rattan. Then I import this simple model back into Designer, use the ‘Mesh sampler’ node to randomly distribute points on its surface, and then use the ‘Geometry instancing’ node; like this, I can place instances of the leaf model at these randomly distributed points. Finally, I also use the ‘Jitter instances’ node to provide these leaves with random positions, rotations, and sizes.  

The rattan covers a fairly large section of the building; the edges of that area are correspondingly large and relatively stiff. To give this a more natural appearance, I begin creating a separate rattan plant, which can be placed in any position as needed. 

As the purpose of this section of plant is to add extra detail, my goal is to have more detail control over this separate plant. I start with the ‘Curve primitive’ node, use the ‘Sweep curve’ node to extrude the model, ‘Taper’ to bevel the model, and then ‘Bend’ to determine the degree to which it bends. The resulting curve determines the position coordinates of the branches. I can use the ‘Scatter on curves’ node to randomly position my rattan leaf model on these curves and, as seen previously, the ‘Jitter instances’ node to randomly calculate the angle and size of these positioned leaves. 

Finally, a group of finished vines are scaled and linked together to form rich details, from large to small. 

For the creation of the ground, the ‘Collision pruning’ node is important. As shown in the screenshot below, I randomly scale the original stones so that some become larger, and some smaller. In any cases where the grass occurs inside the geometry of the stones, the grass model is deleted. This creates the effect of grass growing from between the cracks in the stone, and fallen leaves accumulating in those spaces – that is, the grass and leaf models are stacked in the cracks and depressions in the stone. 

Textures

The whole house uses three materials: wood, wall, and brick. 

Here, I combine the models into a single part to ensure that their UVs are in one single area. I’ve previously created an ID map; I use that now to distinguish the different materials, and to adjust the color of the textures. I change the hue of various parts used – that is, I use an ‘HSL’ node to add materials to different models by changing contrast, brightness, and other information – and the color depth of different wood materials. These need to be adjusted with UVs. When the degree of repeatability becomes too high – that is, if it’s evident than one or more model components are recurring – I can mirror the UV directions of these components along the X, Y, and/or Z axes. This creates more variation in the overall model. 

Bricks, roof tiles, and stones use the third texture mentioned above, ‘brick’. First, changing the color of the texture provides the most obvious difference. For this texture, I create a color gradient from top to bottom. I randomly distribute the UVs of these bricks on the texture; in the screenshot below you can see how I spread out UV01, UV02, and UV03, for instance. This gives me different details and colors. The ‘UV transform’ node in Designer is very useful, here; it allows me to control the direction, size, and rotation of UVs. 

For stylized textures, I have some common production habits, mainly in terms of color. I tend to make a brush that corresponds to the desired style. This brush production can be accomplished either by using nodes, or by directly importing the finished brush pictures. I use the ‘Tile sampler’ node to control the area, size, direction, scale, etc. of the brush. Changing the brush will have the effect of switching the overall style, quickly and intuitively. 

I’ll use the brush as an alpha, so that I can better control the color of the texture. Finally, it’s possible to combine the texture with more brush levels or types as needed. 

Create a scene in Substance 3D Stager 

When all the assets are ready, I import them into Stager for rapid scene integration. The first step is exporting my assets to Stager. For each model that I want to export, in the ‘Explorer’ window, I right-click the graph. This displays the export options. The export formats include SBSM, FBX, OBJ, and PLY. SBSM is Designer’s parametrized model format, which will retain various parametrized adjustment information that I’ve previously set. My textures will be exported in SBSAR format.   

Then I open Stager, and directly drag and drop in the files for my models and textures. That’s all that’s needed; all of the parameters exposed in Designer are now available, on the right of the UI. 

I import the parametrized assets one by one, copy more components, and adjust parameters as needed to create variation between components. Once I have a model that seems to require no further adjustment, I enter the ‘Actions’ options and select ‘Convert to standard model’. 

Rendering in Stager is very easy. This particular case is very simple, for instance. After building the scene, I just need to activate ‘Ray tracing’ to select whichever environment lights I want to use, or to add some physical lights.  

I can also use different parametric model components to improve the scene. Stager also provides many built-in model assets, some of which I use to help with light and shadow construction.  

When I’ve finished setting up the scene, I create a camera for rendering. Stager’s camera has some interesting functions. As the video demonstrates, in addition to using ambient lighting, I can directly drag the environment or background image I want to the scene. The camera will automatically identify the picture information, and automatically convert the background image into an ambient lighting image. At the same time, according to the perspective of the background image, I can automatically match my model (or models) to the background perspective. 

This is how I quickly implement the environment and sky, at the conclusion of this project – I prepare a sky map, drag it into my scene, and render. 

Renders from different angles. 

After the completion of the whole project, I think I’m most excited about the nonlinear workflow, from modeling to texturing. This makes it very easy to modify assets at any point in the process. Just as importantly, this helps me to build an extensive parametric asset library. Once the texture is applied to the model, I’m able to complete and verify many areas much more rapidly than would have been the case previously. Speaking in a broader context than my parametric house scene, I think that, for a large project, including a reasonable number of parametric assets will be a huge benefit to teams. 

Read more