Tag Archives: HoudiniFX

Essential Houdini – Part 1

This is a two part series to introduce core concepts of procedural content creation in Houdini.

This is not meant to be a “how-to” or “101-tutorial” style series.
It presents the most essential understanding of Procedural approach.

Before we start, feel free to go through –
What is Houdini?
How to get it?
How is it used in various industries?

And be sure to watch some basic tutorials to be familiar with how to interact in Houdini.

If you have prior programming (or scripting) experience in any language, some concepts like functions, classes and data can be easily grasped. However, I will try as much as I can to simplify them for Artists.

So, first of all, Contexts.

Houdini (or other packages like Maya/Max) are packed with many computer graphics toolsets/techniques. In all packages, these CG techniques are divided into categories like –

  1. Geometry
  2. Animation
  3. Particles
  4. Rigid/Soft body Simulation
  5. Compositing
  6. Rendering and more…

Houdini groups them under various Contexts like SOPs, POPs, ROPs etc…
They are short for Surface OPerators, Particle OPerators, Rendering OPerators…
For now, just remember that such categorization exists. The significance of these separations will be clear shortly.

Now, to understand Houdini (or almost any procedural system for that matter), you need to internalize two ideas –
Attributes (Data) and Operators (Functions).

Attributes = What data the system (or any Context) has.
Consider a cube below which has some attributes associated with it.2016-07-21 14_42_07-untitled.hip - Houdini FX 15.5.523

Its attributes are Positions & Normals per Point (or vertex if you prefer Maya/Max terminology, however vertex has a different meaning in Houdini).

Operation = What do you do with system’s data.
With that cube, I am going to add 2 units to Y-position of points whose numbers range from 4 to 7 (point numbers are shown in above image).
The language used here may sound very descriptive for a trivial operation but as you can see below, this is exactly how you execute such operation in Houdini.

At the moment, don’t worry about the expression language and focus on the concept that I gave a very low level instruction to Houdini to operate on cube’s geometry attributes.

Fundamentally and technically, this is the core workflow.

There are bunch of attributes with some values and using node graphs you instruct Houdini to operate on those attribute values.

If you have used Maya or 3ds Max before, a helpful analogy is construction graph or modifier stack. Except that Houdini’s networks are insanely more flexible and powerful compared to other two packages.

In short –

2016-07-21 17_20_14-untitled.hip - Houdini FX 15.5.523


Now going back to Contexts, the example above showcases Surface OPerators, as we are modifying attributes of a surface (geometry). That geometry can be Polygon, NURBS, Curves… And typical attributes are point positions, normals, point/triangle colors, UVs etc…

Another type of context is Compositing OPerators, using which you can work on images (as per below).

2016-07-21 17_33_46-untitled.hip - Houdini FX 15.5.523

COPs operate on images (or sequence of images), hence the attributes you normally deal with are pixels and per-channel values (think Photoshop).

Now, for the cool stuff.
Almost all parameters of all operators in your network are modifiable as needed.
What does that mean? Example below –

As you can see, everything you create in Houdini is non-destructive, meaning that almost all parameters of the operators are available to modify.

Part 2 goes more in depth on why this is very important and real magic of Houdini.

But for now, moving on to another cool aspect 🙂

Contexts in Houdini can interchange certain data in certain ways.
Meaning that, you can prepare a model using SOPs and then send it to Particle OPerators for its surface to be used as emitter. Or send it to Dynamics OPerators to take part in rigid body simulation. While still keeping the modifiable aspect (shown above) of each context.

Below is an example of SOPs to POPs.

In conclusion of first part,

  1. There is data – Attributes with values.
  2. Operators act on those attributes. Each operation adds, modifies, deletes, transfers… attribute values. Even geometry like quads, triangles, points are essentially data for Houdini.
  3. There are various contexts with their own kind of Attributes and Operators.
  4. Everything is non-destructive and almost everything is modifiable.
  5. Contexts can transfer data between one another.

If you have any questions on this part or find something confusing or misleading, feel free to mention in the comments.


Essential Houdini – Part 2

This is a two part series on core fundamentals of procedural content creation in Houdini.
Please be sure to read Part 1 first.

When learning Houdini for asset creation, or learning any other procedural system for artistic purposes, a frequent advice is – to “rewire” your brain. This is especially mentioned when coming from other 3D packages like Maya or 3ds Max.
This part explains what “rewiring” means.

Generally speaking, traditional or digital art is created from outside in. Artists start with big shapes/block outs/Silhouettes and then work there way in to define details, patterns, features etc…
This is partly due to how human visual system works. We see silhouettes, shapes before inner details. And also because that’s how an artist can define cohesive vision before diving into nitty-gritty parts.

On the other hand, software systems are generally created inside out. Meaning, components or Lego blocks are identified and coded which have plugs to fit with other components.
The reason for this approach is to promote reuse of components, distribution of tasks and realistic tracking of work being done. Just to note that even with this approach there is a high level vision initially laid out by system architect.

Houdini provides systematic ways to approach artistic creation.

For example, let’s say that you want to model a chair.

Instead of straightforward building it using polygon tools, you break it down in parts like legs, arms, seat and back-support – each part having its own specification and controls. When combined, they give you a chair.
Similarly if it was a building, it can be broken down into entrance, windows, outer walls, main facade and more…


Now, this looks like an overly complicated process to build just a model.
That’s because it is. Then why do it?

Approaching asset creation this way allows two major benefits (among few others) as opposed to diving in and creating one unique piece.

Once you have setup the system correctly, there is possibility of creating many different variations of the same asset type.

As we build the asset in terms of Lego blocks, adding more details/features to existing system is possible while keeping all the previous systems functional.
Just a note here that, fast iterations are possible as long as you don’t try to make fundamental changes to the asset. I mean, extending chair system to output a sofa or even a seesaw works but not if its being morphed into bike.

I have tried to present and advocate procedural way of defining and creating assets in theses posts and I hope its somewhat clear.
Now for actually learning Houdini, Go Procedural has many good tutorials to get started.

Point Cloud in Houdini

Point cloud is an amazing feature in Houdini.
Below is a very basic example showing simplest use of point cloud using VEXpression.



VEX Code in PointWrangle SOP

float maxradius = 5;
vector nb_color;
float dist;

int handle = pcopen(@OpInput2, "P", @P, maxradius, 10);

    pcimport(handle, "Cd", nb_color);
    pcimport(handle, "point.distance", dist);
    @Cd = lerp(@Cd, nb_color, dist/maxradius);


Alright, so let’s walk through the code.
First we declare all required variables.

float maxradius = 5;
vector nb_color;
float dist;

Then we use pcopen to “open” a point cloud.
Basically we are asking to retrieve 10 points from the geometry connected in 2nd input (@OpInput2) within maximum given radius near the position (@P) of currently being processed point (of geometry in 1st input).

int handle = pcopen(@OpInput2, "P", @P, maxradius, 10);

Now, we “iterate” through all the retrieved points.
This is similar to pseudo code : for(int i = 0; i < numpointsincloud; i++).
But Houdini provides pciterate which will iterate through all the points and will return false when all in the cloud are processed.


Remember that VEX runs per-point (or per-prim…), so we are not iterating through the points of our main geometry but through the points from cloud around that point, lets call it main point.
Now we import whichever parameter we want from this cloud into local variables using pcimport.
In our case, we want the color (Cd) of the points and their distance from main point.

pcimport(handle, "Cd", nb_color);
pcimport(handle, "point.distance", dist);

And finally, we use imported data to alter attribute(s) of main point.

@Cd = lerp(@Cd, nb_color, dist/maxradius);





Introducing HOUtilities, collection of small to large utilities and tools written in Python/PySide, to make Houdini artists/TDs lives easier.
Source code coming soon after adding all features for version 1.0 and proper testing.

Current utilities include –

Frequent OPs
Quick access to most frequently used OPs.
This will allow users to design their own prefs. with user defined frequent OPs, colors per OP category, context sensitive OPs, as well as auto-naming etc…


HDA Manager
HDA Manager is designed to make dealing with lots of HDAs easier.
Feature will include ability to favourite HDAs to keep them at top, saving individual as well as all unlocked HDAs and quickly fetching various information about any HDA.


Miscellaneous Utilities
As it suggests, these are small but sometimes handy set of utilities.
First one is to add a switch sop to selected sop and expose switch’s input parm to parent Geo or HDA as a toggle – all in a click.

switch_001 switch_002

Add a switch to selected Houdini node

Here is a quick way to add a switch to currently selected Houdini Node.
For further improvements it would be great to have switch input exposed to parent HDA’s interface.
Also an option to have auto-Null input to switch sop.
i.e. “Switch to nothing” mode.

def addSwitchForDebug(self, parentOp = ""):
	Add switch op to bypass selected node and expose switch input to the parent.

	currentSel = hou.selectedNodes()
	if len(currentSel) == 1:
		current = currentSel[0]
		opName = "switch"
		parentNode = hou.node(current.path()).parent()

		# Get inputs and outputs
		outNodes = current.outputs()
		inNodes = current.inputs()

		#Create switch
		newNode = current.createOutputNode(opName)
		newNode.setName(opName, True)

		# Set correct inputs to switch node
		if len(inNodes) > 0:

		# Insert switch between current and its immediate output node
		if len(outNodes) > 0:
			currentOut = outNodes[0]


Spiral Staircase

A simple & procedural game asset in HoudiniFX.

CHOPs experiment in Houdini

CHOPs are super fun to play with.
Here is an example of creating natural motion with mathematical tools in CHOPs.
There is absolutely no keyframe.