Recently I started working on the next part of the short film. For that I needed to create a room full of old-school looking mainframe computers – with a lot of gauges, indicators and other techy details on them. Because I wanted to have a lot of variety, I decided to make a procedural server generator in Houdini.
I like to use semi-procedural approach, where I keep some par of the process very art directable. In this case I used hand made 3d modules and also option to hand edit server layout configuration.
To generate all the differently sized panels, I created a very handy digital asset: 9-slice mesh scaler (actually more like 26 slice because of 3d). It’s the same idea used in a lot of 2D games where you have a sprite, which you slice in 9 parts – corners, edges and middle part. Then you can stretch it in a way where corners are not scaled, but moved and edges are tiled only in one dimension. Only the center part is scaled or tiled. In this way you keep all the proportions of edge details. You can do the same with 3d models – if they are prepared accordingly (having edgeloops in right places). I will clean up the HDA and publish it here shortly.
After the scaling, you need to remap the UV coordinates and also ensure required texel density. For that I developed another handy digital asset that I already mentioned in another blog post.
After all panels are generated, It is time to scatter all the details. Because I knew I wanted to have procedural animation in all the gauges, I had to do it in a clever way. Also I like to do things in an optimal and fast way.
So the server gets generated in 3 layers:
- Regular server body geometry ( with cutout holes for all gauges and other deep decorations that cut inside panels)
- Static decoration geometry as packed primitive instances on points
- Animated details as packed geometry instances on points.
This way I can do procedural animation on instance points (i.e. animating packed transforms) to have all the gauge indicators move, tape rolls turn etc.
Random generated servers
Server layout can be configured using multi-param blocks. You can add rows, columns. Change sizes and decoration types. You can also change overall dimensions of the server.
There is also a random generator button, that tries to generate reasonable configuration for your server size. You can also manually edit some parts of randomly generated config. To keep things faster, I implemented geometry caching system – where upon generating new configuration, all meshes are cached to disk for fast loading.
All hand made 3d modules.
Three geometry layers generated by the asset. First is just a regular geometry, but other two are instanced packed geometry (rendered using RS instancing). For the second layer I can randomize packed primitive transform attributes to have randomized positions and rotations for different knobs and switches. By having third layer separate, I can animate packed primitive transforms properties to have animation for all the indicators and magnetic tape rolls.
This is still work in progress. I will post more updates as I go.