Filip Steć explained how he learned Houdini to build a Columnar Rock tool and showed how he used the built-in solutions and parameters to control the geometry and get an organic rock-like appearance.
Introduction
Hello, I'm Filip. I'm a 3D Environment and Level Artist currently working at Room 8 Studio. Some time ago, I started to explore Houdini and its powers of procedural creation. I wanted to fulfill this more "technical" side of myself, as well as develop my skillset. It ended up with something not only working, but also giving pretty cool results. I wanted to share with you a breakdown of my Columnar Rock Tool.
The main inspiration and reference for this tool were geological structures that can be found in Iceland, on the British Isles, or in some parts of the USA. Many years ago, while igneous rock was cooling and contracting, it created such incredible forms. It looks more like a part of another planet or some fantasy world, rather than a landscape we are familiar with. Characteristics of these structures encouraged me to recreate them using Houdini while learning procedural environment creation.
Houdini Breakdown
Inside Houdini, every important stage of a tool has its own subnetwork, making work comfortable and flexible. This is especially important if you want to make changes in early nodes. Even as a beginner, it's a good practice to organize your graph, it always pays off.
At the beginning, input geometry is combined using VDB nodes and transformed into one polygonal mesh. This proxy will be used for future rock generation. The accuracy of this process can be adjusted by the user. It depends on how complex the input is and how accurate shape reproduction is needed.
The base for rock columns generation is a plane divided using Voronoi fracture. Its size depends on proxy mesh bounds. The density of the obtained pattern can be changed, as well as some additional distortions. Afterwards, unnecessary primitives that are not in the proxies' "footprint" range are deleted.
Every primitive is the basis of the future column. Each of them is placed at the correct position, where the bottom base should be. Using a ray node, the height of every column is measured and stored as a primitive attribute.
Afterwards, it is used for the extrude operation. If a proxy mesh has holes or concave areas, some primitives are used twice to create one piece over another. It allows the creation of more complicated structures, like caves or overhanging parts.
Having simple shapes, the tool gives few ways to edit geometry at this stage. Column heights can be randomized, top and bottom parts can be distorted, as well as horizontal splits can be added.
The next step is remeshing all geometry using built-in Houdini solutions. Remeshing accuracy and the amount of kept geometry can be controlled with parameters. All these options allow the user to get rid of a generic look and get an organic, natural, and rock-like feeling.
Afterwards, vertex color information is created. Curvature and ambient occlusion are in the red and green channels. Blue one is for random, global noise, and optionally for the top and bottom parts. Additionally, each column has its own random 0-1 value, kept in the alpha channel.
Every channel can be turned on independently and adjusted with parameters. All that vertex color data is used inside Unreal Engine as blend information for a layered material. UV mapping is done for every column separately.
For tops and bottoms, it creates orthographic mapping, for side geometry, a cylindrical one. UVs' scale can be adjusted globally with parameters.
Optional, final mesh distortion is separated into 2 stages. Both work with 3D noises. Primary is designed to distort the mesh with Noise of low frequency, but higher amplitude. Also, there is an option to blend it with vertical position gradient, the bottom of the structure can remain the same, while the higher parts are distorted.
The secondary distortion is designed to add high-frequency geometry noise to all geometry. It is also controlled with parameters. At the end, there is an option to generate collisions for the whole structure. Its complexity is controlled with a parameter. Colliders are grouped with proper naming, so Unreal Engine can understand them and use them as UCX.
Inside Unreal Engine
Work inside Unreal Engine starts with creating a blockout, which will be used as the tool's input. The complexity of it is up to the user. It might be an assembly of primitives, as well as some more complicated shapes. The main goal here is to have something that is flexible and gives an idea of the desired output.
An important functionality of a tool is control over output type. It's designed to make working inside an Unreal Engine easier and faster. Generation volume output gives you a preview of the general structure, size, and shape. Simple geometry it's good for making first decisions about the composition of the whole structure.
It's fast to compile, giving the user the possibility to iterate and experiment. After that, when there is a need to dive more into detail, the Remeshed geometry or Final geometry outputs can be used. They require a while to process. Compilation time depends mainly on the number of pieces, so both parameter values and the size of the structure affect it.
Conclusion
Vertex color is utilized by blend assets in layered materials. Setup is not complicated, it can be multiplied by a texture mask and adjusted with a few parameters. Simple solution that allows to get varied effects.
The tool has over 70 exposed parameters in total. They are organised to be logical and user-friendly. My Environment Artist background helped me here. While testing it, I tried to think and act like a potential user. Such a variety of options allows getting many different results, even with the same input.