Making a Procedural Citadel in Houdini

Nikola Damjanov talked about his procedural scene Citadel made with Houdini during CGMA course Abstract FX.

Introduction

My name is Nikola Damjanov, born and raised in Belgrade, Serbia, and currently working at this incredible mobile gaming company called Nordeus, which I really consider my second home. I am a Game Artist by day and at the moment I am leading the art efforts on our latest mobile game called Heroic: Magic Duel. I also like to say I am a procedural tinkerer by night because I spend a lot of time experimenting and improving. 

Tech art fits more into my nighttime activities then my daily job but I have a huge passion for it nevertheless. I had a mixed education background – tech and art – so I am always hypnotized by both worlds. My current interests are mostly along the lines of procedural generation. I’m very interested in building systems – trying to deconstruct and reverse engineer content generation is a challenging puzzle.

Citadel: Start of the Scene

After having so much fun with Substance Designer over the years I thought it would be a nice thing to expand the procedural knowledge beyond the world of texturing. Houdini was a perfect choice – I had used it before on occasions but usually just replicating stuff, and not really having a deep understanding of how it works. I wanted to start learning it with something “light” and friendly for experimentation so that is why I chose the Abstract VFX course. On top of that, I heard good things about CGMA from friends and I liked what Adam Swaab (the instructor) was doing – all the right checkboxes were ticked!

During the course, we had weekly assignments and one of them was a task to create an alien planet or an otherworldly landscape. While I was searching for inspiration I came across this nice concept from Miguel Alonso – I really liked the verticality of the composition, scale, and sense of ancient presence. I think you can clearly see my work was inspired by this concept but I wanted more depth, conflict, and extraterrestrialism.

Ctystals

A long time ago I saw a tutorial from Entagma (see the video below) and learned a very simple and effective technique for making crystals. I simplified the process as I had more than one of them in the scene but the core process was the same. I’ve also built three LOD levels so I can optimize the scene and rendering.

For the columns themselves, I was inspired by basalt columns of Iceland but I wanted to grow them higher and very distinct shape variation for eye rest. I actually used the same crystal shape for building the columns – took the lowest LOD, scaled it way up, deformed it to get more with at the base and turned it into a fog volume with varied density. Then I used that density parameter to generate a point cloud and drive the distribution/scale/rotation of the smaller crystals. Simple but flexible and powerful, like everything in Houdini. 

Landscape Generation

My initial idea was to learn a little bit of Houdini’s terrain tools during this project. I knew that there would be a lot of crystals around, and thus minimal landscape, but I needed some underlying structure for distribution at least. I figured learning along the way would be good enough – and it was!

I’m not sure how it compares to World Machine as my experience is limited but it does feel like WM is more powerful – to be fair, it is a specialist tool. On the other hand, Houdini has its entire feature set in its corner. At any point, you can convert the terrain to polygons and unleash the power of Houdini on it, and then convert back to heightfield if needed. It really feels limitless. I’m definitely constrained by my ability at the moment and not the tool. 

I used very simple Heightfield tools for this project, starting from a Worley noise with a very low scale on one axis to get the major valley shapes. Then I overlayed a couple of different noises in medium and small scales to get surface variation and details. I figured it’s important to get nice surface variation before you start eroding because you will get much nicer results. So I added some terracing but masked it only to steep slopes. In the end, I slumped the bottom of the valley to get a smoother surface for scattering crystals. I also came across a happy accident – if you convert your terrain to mesh and then use the Mountain SOP, with large height but scale only on the Y axis, you can get some very nice varied and inflated terracing. That was the final touch on the terrain.

Ground Distribution

Ground distribution was rather simple actually. After slumping and masking off the bottom part of the valley I just did a Heightfield Scatter on that part to get the seed points. Copy SOP did the rest – just enable “Transform Using Template Point Attributes” and things will magically flow over your terrain. If you want to bring it to the next level you could set up the Copy SOP to stamp the scattered objects and then you can get randomness in scale or even control it by height. It’s very fun to play with once you set it up. I’m curious how it will look in motion, it would be a nice thing to try out.

Rendering

From the start, I planned not to render in Houdini. It was a very big and complex scene that depended a lot on complex shaders and refractions – my Matra knowledge was nowhere near good enough to tackle that problem. That is why I decided to use something I know – 3ds Max and V-Ray. Even though most of my work these days is real-time and engine based, V-Ray is where I feel at home and confident I can do what I want. 

I exported the final scene state via Alembic, which worked effortlessly. For the lighting, I used the V-Ray sun+sky combo because I liked the simplicity of the blue/yellow light colors. What played a big part was the Vray’s aerial perspective atmospheric effect – it really helped to sell the depth of the environment. It took some trial and error finding the best angle for the sun, eventually, I placed some shadow cards off the camera to get the right light/shadow balance I wanted. 

Once I got things set up, rendering is not really a big problem. I do low-resolution test while I’m working on a composition and lighting and occasionally render parts of the image in full resolution to make sure shaders work properly.  When I am confident that render will be good I just send it off to a render farm – they are crazy cheap these days, especially if you are rendering single images. Rebus Farm is my choice, it has a nice automated plugin, very easy to use. 

Initially, I tried to do a render in V-Ray as close as possible to my vision but I couldn’t really make a blend shader to my liking. Additionally, it was very slow to iterate this way. Eventually, I decided to render out shader passes (one for solid and one for crystal) and a bunch of masks (shadow, curvature, AO..) and assemble everything in PS. That assembly was certainly the biggest part of post-production. Other than that I mostly used Photoshop to boost up colors and frame the composition even more. 

Feedback

This was definitely the biggest procedural set piece I made, and I was surprised how easy it was to manage and organize everything. It’s hard for me to single out one major learning as there were so many things that I tackled.

Houdini is incredible! I just scratched its surface and already it has wowed me countless times. It’s basically an OS for 3D but at the same time, I feel like it couldn’t care less about visuals. It just wants to know what data you are giving it and what to do with data. It flipped my content production workflows upside down. I feel like I am a  bit late to the party, I wish I started learning it some time ago.

Better late than never, I guess!

Nikola Damjanov, Lead Game Artist at Nordeus

Interview conducted by Kirill Tokarev

For more information on CG Master Academy and the Abstract FX in Houdini course, please visit the CGMA website, or email 3d.registration@cgmasteracademy.com.

Join discussion

Comments 0

    You might also like

    We need your consent

    We use cookies on this website to make your browsing experience better. By using the site you agree to our use of cookies.Learn more