Houdini

A Long-Winded Guide to Houdini Instancing

On the Houdini Discord server(s) I keep seeing the same kinds of questions over and over again, mostly related to instancing. The most common questions asked seem to be: "How do I randomly rotate/scale my copies?" "How do I rotate each copy along a specific axis?" "How do I randomly change what objects get instanced?" "Why am I not supposed to copy stamp anymore?" Houdini's documentation can admittedly be a little vague at times, but more importantly they expect you to have a decent understanding of how some fundamentals of computer graphics work, like how a 3x3 matrix works for orientation. I'm admittedly not great at math, so hopefully I can explain everything both intuitively and in such a way that I don't completely embarrass myself in front of people who actually know what they're talking about (i.e. this guy). Anyways. The Copy SOP. One of the first things to learn about the Copy SOP is that the point attributes on the points you're templating to can influence how each copy is placed in the world. Aside from the obvious position of each point, P, there are a few other attributes with obvious effects. You can view the complete list here: http://www.sidefx.com/docs/houdini/copy/instanceattrs The important ones to remember are:

  • v@N and v@up (these vectors work together, explained later)
  • f@pscale (uniform scale of each copy)
  • v@scale (a vector that can scale each axis independently)
  • p@orient (a QUATERNION that defines the orientation of each copy
  • p@rot (another quaternion that defines an additional rotation)
(Keep in mind that those little @ prefixes in front of the attribute names are only used in Wrangle nodes... they're just there to hint to Houdini what attribute type they are. For common attributes you typically don't need to include them in your Wrangles, and you never need to use them when writing group masks.) Now, in many situations, you can get by with just using the Attribute Randomize SOP to randomly generate an N attribute for you, and a random float for pscale, and you're good to go. But there's always going to be times where you need specific orientations for copies, and these times are when you'll need a more thorough understanding of what the Copy SOP is doing under the hood... (more…)

By toadstorm, ago
Houdini

The joy of xyzdist() and primuv()

I'm going to try to make a nice easy introduction to my two favorite functions in Houdini VEX (besides fit01 and chramp of course): xyzdist and primuv. These functions are at the core of a lot of really useful and cool tricks in Houdini, including rivets, the attributeInterpolate SOP, the old "droplets falling down a soda can" effect, and some really awesome stuff with volume shaders. I'll do a little example of each as a way of showing off what you can do with these clever little tools. First, let's take a look at the VEX definition (the third overload here is the most frequently used): float xyzdist(string geometry, vector pt, int &prim, vector &uv, float maxdist) At its most basic, xyzdist will return the distance from the sample point pt to the nearest point on the surface geometry. Note that this doesn't mean the nearest actual point, but the interpolated surface in between those points. Those little "&" symbols mean that this function will write to those parameters, rather than just read from them. So if we feed this function an integer and a vector, in addition to the distance to the surface, it will also give us the primitive number prim and the parametric UVs on that primitive uv. Note that parametric UVs are not the same as regular UVs... this just means the normalized position relative to the individual primitive we found. So, what can we do with this? Click below to find out... (more…)

By toadstorm, ago
Houdini

Branching circuits experiment

My good friend and motion graphics bromance, Eli Guerron, asked me to help him create a procedural system of branching circuits that would look something like a schematic drawing. I stupidly thought this would be an easy trick with particles, but to get the right look it actually took quite Read more…

By toadstorm, ago
Houdini

Rendering huge Houdini meshes in V-Ray.

I'm working on a production right now that involves sending absolutely enormous animated meshes (6.5 million polygons on average with a changing point count every frame) out of Houdini and into Maya for rendering. Normally it would be best to just render everything directly out of Houdini, but sometimes you don't have as many Houdini licenses (or artists) as you'd like so you have to make do with what you have. If the mesh were smaller, or at least not animated, I'd consider using the Alembic format since V-Ray can render it directly as a VRayProxy, but for a mesh this dense animating over a long sequence, the file sizes would be impossibly huge since Alembics can't be output as sequences. Trying to load an 0.5 TB Alembic over a small file server between 20 machines trying to render the sequence and you can see why Alembic might not be ideal for this kind of situation. Hit the jump below to see the solution. (more…)

By toadstorm, ago
Houdini

Houdini Cloud FX tweaks

Side FX added a new Cloud FX toolkit a version or two ago, and I recently had a chance to mess around with it. Their Cloud Rig shelf tool is pretty great out of the box... pick a shape, turn it into a cloud, done. The Cloud Noise and Cloud Light SOPs that are built into the rig setup can get some pretty good results, but it's not exactly what I wanted... I was looking for a solution that would be a little less dependent on the volume container resolution, and more based on textures instead. It's not necessarily the greatest solution for swirling, dynamic simulations, but for more-or-less static clouds, it gets resolution-independent nice results that are quick to generate. Maya's fluid shader supports textures by default, but the Cloud Shader that Houdini uses doesn't have much in the way of textural control, so I had to make some customizations, and that's what this post is about. Check the link below to keep reading... (more…)

By toadstorm, ago
Houdini

Texturing flowing liquids

One of the bigger challenges with rendering liquids is that it can be difficult to get good UVs on them for texturing. Getting a displacement map on a liquid sim can make all the difference when you need some added detail without grinding out a multimillion-particle simulation. Unfortunately, liquid simulations have the annoying habit of stretching your projected UVs out after just a few seconds of movement, especially in more turbulent flows. In Houdini smoke and pyro simulations, there's an option to create a "dual rest field" that acts as an anchor point for texturing so that textures can be somewhat accurately applied to the fluid and they will advect through the velocity field. The trick with dual rest fields is that they will regenerate every N seconds, offset from each other by N/2 seconds. A couple of detail parameters called "rest_ratio" and "rest2_ratio" are created, which are basically just sine waves at opposite phases to each other, used as blending weights between each rest field. When it's time for the first rest field to regenerate, its blend weight is at zero while the rest2 field is at full strength, and vice versa. It's great that these are built into the smoke and pyro solvers, but of course nothing in Houdini can be that easy, so for FLIP simulations we'll have to do this manually. Rather than dig into the FLIP solver and deal with microsolvers and fields, I'll do this using SOPs and SOP Solvers in order to simplify things and avoid as many DOPs nightmares as possible. Here's the basic approach: Create two point-based UV projections from the most convenient angle (XZ-axis in my case) and call them uv1 and uv2. As point attributes, they'll automatically be advected through the FLIP solver. Then reproject each UV map at staggered intervals, so that uv2 always reprojects halfway between uv1 reprojections. We'll also create a detail attribute to act as the rest_ratio which will always be 0 when uv1 is reprojecting, and 1 when uv2 is reprojecting. It all sounds more complicated than it really is. Here goes... (more…)

By toadstorm, ago
Houdini

Particle motion blur in Houdini

I ran into a problem recently where I was trying to make some nice-looking embers in houdini, complete with nice motion-blurred trails. Typically with a particle system you use the velocity attribute to handle motion blur, but geometry velocity blur is always linear, so your motion trails will always be perfectly straight even if you have nice squiggly motions with your embers. Deformation motion blur looks great, but in most simulations particles are being born and dying all the time, and deformation motion blur doesn't work with a changing point count. The solution is to force a constant point count. This can be problematic when your particles need to have a lifespan, so there are a few little tricks you're going to have to pull in order to make this work... (more…)

By toadstorm, ago
Houdini

Houdini Creep POP

I just wanted to post a little bit about the Creep POP in Houdini because I’ve had such a hell of a time getting it to do anything useful. I was trying to create the effect of raindrops sliding down glass. In Maya, this is a pretty simple thing- enable Read more…

By toadstorm, ago