If you have a bunch of curves and then polyextrude them, sometimes the normals will get funky and some will be facing the wrong way. A POLYPATH sop added before the extrude can usually fix the resulting normals - I think it kinda fuses the curves into one object, something like that.
Thursday, 1 May 2025
Monday, 19 August 2024
houdini's unlock normals....
an equivalent to maya's "unlock normals" in houdini.. usually needed after a polyextrude -
reverse sop node, followed by a normal node
Thursday, 9 March 2023
creating orient for objects
Simon Verstraete - Houdini blog #42 Orient (artstation.com)
SUPER useful to make orient from your Normal and Up vectors (you will of course have to make those first!)
Thursday, 2 March 2023
curl curves with vex
VEX code taken from this forum post, by user F1 -
Curling hair curves with VEX - General Houdini Questions - od|forum (odforce.net)
Very hand bit of code that can curl up your curves for hairstyles, bits of fluff or any other curly things you might imagine.
If you're going to use a path deform SOP after this (eg, you're using the curves to deform a bunch of snakes) you'll want to Attribute Delete the Normal "N" attribute that this script creates. Otherwise your geo might come out a bit flat/squashed/wrong in places.
// Primitive wrangle.
#define TWO_PI 6.2831852 addpointattrib(0, "N", {0, 0, 0}); int pts[] = primpoints(0, @primnum); int npt = len(pts); // Loop variables. vector rest = point(0, "P", pts[0]); vector prev_pos = rest; matrix3 frame = ident(); for (int i = 0; i < npt; i++) { vector pos = point(0, "P", pts[i]); vector delta = pos - rest; rest = pos; // Make normal. Point normals could be used instead. vector normal = normalize(cross(cross({0, 1, 0}, delta), delta)); if (length(normal) == 0) { normal = {0, 0, 1}; } // Drive a shape with ramps and multipliers. vector axis; float ramp, angle; // Twist the bend axis. axis = normalize(delta); ramp = chramp("twist_profile", (float) i / npt); angle = fit01(ramp, -TWO_PI, TWO_PI) * ch("twist") / (npt - 1); rotate(frame, angle, axis); // Bend the curve. axis = normalize(cross(normal, delta)); ramp = chramp("bend_profile", (float) i / npt); angle = fit01(ramp, -TWO_PI, TWO_PI) * ch("bend") / (npt - 1); rotate(frame, angle, axis); // Compute new position and normal. vector new_pos = delta * frame + prev_pos; prev_pos = new_pos; setpointattrib(0, "P", pts[i], new_pos); setpointattrib(0, "N", pts[i], normal * frame); }
// Primitive wrangle. int pts[] = primpoints(0, @primnum); vector rest = point(0, "P", pts[0]); vector prev_pos = rest; matrix3 frame = ident(); for (int i = 0; i < len(pts); i++) { vector pos = point(0, "P", pts[i]); rotate(frame, 0.1, {0, 0, 1}); vector new_pos = (pos - rest) * frame + prev_pos; rest = pos; prev_pos = new_pos; setpointattrib(0, "P", pts[i], new_pos); }
Saturday, 3 December 2016
Attribute Reorient & giving animated geo new normals for fur
This is because you generally want your animation done AFTER the modelling process and your new normals don't know anything about the transforms that have happened before. Simply timeshifting and attribute interpolating doesn't seem to work.
Fortunately there's a node called Attribute Reorient. It will reorient more than just normals, but so far this is the use I've had for it.
Oh - my problem was having a pre animated alembic. I wanted to alter the normals for fur direction purposes, but the pre-animation was making the normals & thus also the fur behaviour freak out. By using the Attribute Reorient to essentially force new normals onto the animated geo I sorted out my problem! WINNER.
*note* seems like it looks for the vectors in the points section..so make sure your stuff is there!
Wednesday, 5 October 2016
using object's rotation as a vector value.
Useful for setting vectors to point in the direction of the object.