Showing posts with label groom. Show all posts
Showing posts with label groom. Show all posts

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);
}

Thursday, 12 April 2018

Quick note about Houdini hair

when using Houdini's toolbar hair tools, pay attention to the highest-level node's parameters.
The groom should take place on a static mesh (laydown a timeshift node), and the deform node will do the movement magic.