Mardini 2022


01|03|2022| Curve

Well I am already late to the party as it’s the 3rd here, so I’ve got some catching up to do!

The first challenge is the Curve SOP, this is what I made.

This setup takes a Curve with two points, this is resampled to increase resolution and also to add the @curveu attribute. The curve is then transformed along the X axis. A duplicate Transform SOP is used with relative reference to offset the curve in the opposite X direction.

Next each Curve is displaced along the X axis using a PointVOP. In the PointVOP the point position is split into its separate vector components and the X position is multiplied with some noise.


I wanted to ‘root’ the points and have the noise increase along the curve. This is achieved by multiplying the noise with the curveu attribute. Curveu starts with a value of 0 for the first point and 1 for the last point. Essentially zero displacement at the start, and full displacement at the end of the curve. Finally we recombine all the floats back into a vector and feed it into the point position output.

Next I want to create a blend between the two curves with the option to increase the number of iterations. This is achieved using a For Loop with Feedback. This allows you to iterate multiple times using a blend shape SOP.

This technique is from this tutorial by Michael Auerswald, huge credit to Michael for this! Thank you, this saved my arse on a gig once..

The trick is to add the metadata node into the loop and then use the iterations to drive the number of blend shapes. Watch the tutorial for the full explanation as Michael explains this clearly.

So far we have some wiggly lines.

Next I drew another curve along Z, this is resampled and the curveu attribute output.  Use copy to points to copy this new curve along the length of our wiggly lines.

The point wrangle is defining the pscale attribute by using @curveu inside a fit function. This adjusts the scale of the curve along the length of the line.

f@pscale = fit01(f@curveu, 0, 0.5);

Orient along curve is used to define the normal direction and then this is adjusted using some random noise with the attribute adjust vector SOP.

Finally Labs Make Loop, well makes it loop!

I rendered with Redshift Strands, using the curveu attribute piped into an RS Ramp so the lines change colour  along the length.

02|03|2022| Revolve

This idea was a bit like day one, but turning it all upside down.

First of all a line along z, which is resampled to a specific number of points. Then with a Group Range place the first and last points into a group called ‘ends’. The original line is piped into a PointVOP. This is used to add some noise to the Z position of the points and then connected to a null ‘ATTACH’.

Create another line,this time on negative Y, again resample to add many points. The second line is then copied onto the first line points using the ‘!ends’ group (not the end group), we now have a bunch of lines hanging down.

I then used the Configure Vellum Hair to create hair strands from each line, the Vellum Constraint Attach To Geometry is used to fix the hair to the moving points. This creates a nice flowing action, which I then Revolved around using the REVOLVE SOP! Finally I extruded and sub-divided this to create a smoother surface.

The end result is rather underwhelming, but it was still a fun exercise. Once again rendered with Redshift..

03|03|2022| Copy To Points

This is one of the most used nodes in my Houdini workflow, it seems to appear in most setups.

For this I used the test geometry head.

I selected the neck primitives and blasted those away, then I closed the holes using the polyfill SOP.

To keep it efficient, I used Polyreduce on the mesh so my computer didn’t die.

Then I created some random pscale values with Attribute Adjust Float.

Next a Group Expression is used to select a small percentage of points. I use this start group for the first copy to points. Copying the same head onto itself.

After that I used the same principle to create a random point group and copy the head to these points.

I then converted to a VDB and back to a polygon mesh.  This welds all the geo together, addition of a smooth here would blend the shapes even more, but I liked it like this.

Drop this into a For Loop so that you can increase the number of iterations (carefully!) and you end up with this thing which I’m calling ‘Head Head’.


04|03|2022| Sweep

For this setup, I created a Tube and set the connectivity to rows. I also created some test geo, using the head once again.

The tube is positioned in such a way as to fully enclose the head.  The idea is to project the rows onto the surface of the head, so do this I first use the Ends SOP and use unroll with shared points. This creates a curve from the rows.

The Point Wrangle is setting the normal of the curves using the following line of code.

v@N = v@P * -1;

This only really works because the head is at the world origin. If you enable normal visualisation, you can see this code points the normals to 0,0,0. This works fine for this example.

The Ray SOP then projects the points along their normal until they hit the head mesh. I animated the head turning for this effect, could certainly do with more work, but still has potential to be a useful effect for FUI elements etc.

The orient along curve is there to reset the normal, if not the Sweep will be messed up.  Finally the subdivide to smooth it out.