Some notes to self on my first encounter with Houdini.


If the view tool is not active alt (or spacebar)

Tumble LMB
Zoom RMB
Perspective 1
Top / Bottom 2
Front / Back 3
Left / Right 4
UV 5
maximize pane Cmd + B
Toggle views B
Default Home views G
Frame selected F
Frame All A
Home C-plane H
Single View Ctrl + 1
Four views Ctrl + 2
Twp views stacked Ctrl + 3
Two views side by side Ctrl + 4
Grow Selection Shift + G
Shrink Selection Shift + S


scale E
Rotate R
Translate T
Handle tool Enter

While in the Handle tool pressing Y toggle betweens different handles.

Increase Handle *
Decrese handle /

If shift is held down the transfrom will be done is smaller increments.

To select coordinate system to transform in right clich the transform handle and select > Align Handle (M)

Edit Pivot Insert
Object select mode 1
Dynamic select mode 7


Note that you do not need to hold down the hot key, on press will activate it

Grid X
Curve C
Point V
Multi Ctrl + J

Network View

Double click a node to enter it

Object level U
Component level I
Frame all Spacebar + H
Arrange nodes L
Toggle Parameters P
Display Options D
Switch Inputs Shift + R
Create subnet from selected Shift + C
Operator Tree Shift + W

The Operator Tree is similar to the Outliner in Maya. Viewing controls > Display Options > Common > Enable Operator Tree

When you tab create a new node if you Shift + Enter it will create, connect the node and set the display flag on the new node.


To create geometry at the origo hold ctrl while clicking the create button. To translate in Y during the creation process hold shift, else we will be constrained to the XZ plane.

Move all upstream nodes hold shift + LMB click and drag


ch CHOPS Channel Operator
img COPS Compositing Operator
obj   Object Operator
out ROPS Rendering Operator
shop SHOP Shading Operator
vex VOPS VEX Operator
pops POPS Particle Operators
dops DOPS Dynamic Operator


Select edge loop A + MMB click on an edge
repeat last extrude Q


Scene scale:

Edit > Preferences > Hip File Options >

Console on OSX or Linux

There is no specific console window on OS X or linux. If you want console output you’ll need to start Houdini from a terminal. To get a console we can open the Houdini Terminal application in the Utilities directory, the type “houdini”. If we now use printf we will see the output in the console.

vector va = {0,1,0};
va.x = ch("val");

addpoint(geoself(), va);
printf("%s\n", va);

Attribute VOP

To create a visualize node in an attribute VOP move the mouse over a out port and hit X this will create an hook up a visulize node.



Control clicking the light or camera icon will create a light based on the current persp view.


to only render specific objects, in the mantra node on the “Objects” tab, click and drag the object you wish to render to the field “Force Objects” and remove the * from the “Candidate Objects”.

UI Tips

Set keyframe attributes Alt + LMB on the label or individual component
Del keyframe attributes Ctrl + LMB on the label or individual component
Reset attributes Ctrl + MMB on the label

VEX Wrangle

Fetching vector P

// fetch first input P

// fetch second input P

// fetch ?th input P

Fetching float foo

// fetch first input foo

// fetch second input foo

// fetch ?th input foo

With the @ symbol you can only pick up attributes of the same type of attr you are wrangling over. So if you are in a point wrangle and want to pick up an attr from the detail you need to use a VEX function called “detail”

Lets say we want to find the max curvature of a grid and store that to be used inside of a point wrangle. There is not an efficient way to do this within the vex wrangle. So we could use some sops instead. We connect a measure node to the grid and set the type to curvature. Then we can add an attrib promote node to the measure node and set the original class to points and the new class to detail and give the new detail attr a name of our choosing, for instance “crv_max”. To get the attrib in a point wrangle node we can use the detail function, like this:

float c_max = detail(0, "crv_max", 0);

Fetching an input of a specific point number

Lets say we have a grid and we add a point wrangle to it. To the second input we connect a primitive sphere (which only has 1 point) if we use the vex code above v@pos = @opinput1_P to acces we will only get a “valid” pos for the first pos since there is only one point so the subsequent values will be (0,0,0).

To get a “valid” pos per point we can use the “point” vex function. It allows you to access a specific attr index. The last argument is the point num.

v@pos = point(1, "P", 0);

Variable prototype

In a wrangle node, if we want to declare a variable to a specific value if an input variable is missing we can use the following:

float @foo = 42;

This will initialize @foo to @foo if it exists else to 42. Note that the prototype must be a constant it connot be another variable.

You can also enable “Enforce Prototype” in the checkbox below the wrangle code input field. If this is checked you must declare the prototypes on all variables even “built in” like @P or @Cd. This could make it easier to detect typos when you write longer vex code, since the wrangle will throw an error if we accidentally do a type like @Cf when we meant to write @Cd. If enforce proto is not enabled the wrangle will simply create a @Cf attribute where as if it is enabled the wrangle will raise an error. If the force prototype is enable you declare the variables ot the top of the vex code:

vector @Cd;
// and then use it like normal

@Cd * .5;

Or give it an initial value

vector @Cd = (.5,2,.5)
// and then use it like normal

@Cd * .5;

Group Membership and wrangling

You can fetch members of groups that match the given “Run Over” setting.

  • run over points
  • run over primitives

Use the @group_mygroup form to test group membership and a ternary operator to set the value.

@Cd.x = @group_mygroup ? 1 : 0;

A similar but simple example would be this. Lets say we are in an pint vrangle and some of the points are in agroup called mygroup. To color thepoints based on group membership we can use:

@Cd = @group_mygroup;

Debug VEX code with sprintf().

s@debug = sprintf()

Do NOT debug with print() it is very slow.

Threading and run over number

In a wrangle if we set the type to Run Over Number we can make the wrangle use threading even for a small number of input points. This can be useful if each of the points take a long time to process and we have few of them (<1024)

VEX Snippets

f@pscale = float(@ptnum)/(@numpt-1);


On the Physical tab of the RBD Fractured object we can set the Density (kg/m2) to the material we are simulating (for concrete that would be 2600). Set friction to 100 and the Dynamic Friction to 0.01. This would be like in real life where we have higher friction when an object starts to move, then lower. In our case it would mean that the friction of a moving object will be 1 (100*.01). Set Bounced to 0.1

Houdini 16

Rename tool Alt + w
Cut connection(s) y + LMB drag