Curve framing is important for a lot of things, like trajectories, creating geometry from curves or aligning copied geometry to curves. In this tutorial Manuel implements the parallel transport algorithm that transports an initial normal vector along a curve to create a smoothly varying frame. But be warned. This video is very VEX heavy.

In this tutorial you’ll learn how to read a scientific paper and translate it’s content to Houdini.

Thanks guys! This was an excellent exercise for this morning!

I enjoyed a lot with the VEX, it is very nice work to see such versatility.

Very nice…. you might also mention the slideframe() VEX builtin.

that is the nice tutorial, and i have to ask if you could make tutorial about anchor and spring constraints? that would be great as well!

i dont know why you always apologise for using vex in a heavy way, dont be sorry for that, a technical director need to go deep on to this, if they dont want to code in houdini they should get out of the software right now.

Thumbs Up ! The slideframe() function mention above looks interesting, would using this simplify anything?

That’s good to know! The slideframe() function does indeed simplify this, looks like it utilizes the double reflection method presented in this paper.

https://www.microsoft.com/en-us/research/site/uploads/2016/12/Computation-of-rotation-minimizing-frames.pdf

If someone prefer to do vex over vop for making orient attrib, just add these two lines at the end (and bypass or delete vop)

//set attributes

for (int j=0; j<pntcnt; j++){

setpointattrib(0, "PT_tangent", pnts[j], tangents[j], "set");

setpointattrib(0, "PT_normal", pnts[j], normals[j], "set");

bitangent = normalize(cross( normals[j], tangents[j]));

setpointattrib(0, "PT_bitangent", pnts[j], bitangent, "set");

// same as vop that creates orient attrib

matrix3 mat = set(normals[j], bitangent, tangents[j]);

setpointattrib(0, "orient", pnts[j], quaternion(mat), "set");

}

[Edit] If someone prefer to do vex over vop for making orient attrib, just add these two lines at the end (and bypass or delete vop)

//set attributes

for (int j=0; j<pntcnt; j++){

setpointattrib(0, "PT_tangent", pnts[j], tangents[j], "set");

setpointattrib(0, "PT_normal", pnts[j], normals[j], "set");

bitangent = normalize(cross( normals[j], tangents[j]));

setpointattrib(0, "PT_bitangent", pnts[j], bitangent, "set");

// same as vop that creates orient attrib

matrix3 mat = set(bitangent, normals[j], tangents[j]);

setpointattrib(0, "orient", pnts[j], quaternion(mat), "set");

}

Thanks for the tutorial.

I would like to know if there is no easier way already implemented in Houdini to achieve the result. Kind of Spline Wrap or maybe ussing the Polyframe node?

Thanks guys and waiting for more.

Okay, sweep node haha, saw it 🙂

Thanks a lot. I was trying to do something exactly similar to this, and I was almost there only thing i was struggling is to make the framing work for the straight lines. I found this video after few hours of struggle and got a better understanding of whats going on, the way you explain is really good and easy to understand the complex pseudo code. But even in your setup if I connect a straight line in y axis then its is not orienting the copies properly as we are initializing the @N in {0,1,0}, so I have to make a special case for that and tell if my line is straight up then make initial normal to @N={0,0,1} or something orthogonal… Can you suggest me any better ideas to solve this problem.Your videos amaze me always. Thanks a lot

I found a solution for this, on the parallel transform wrangle at the line 5 we are initializing the first normal to {0,1,0} instead of this we can initialize that with a very slight offset in one of other axis (for ex: {0,1,0.0001}

so that whenever doing cross product with {0,1,0} it will work fine so this is working fine with curves which are straight up in y axis.

Thank you for this wonderful tutorial it helps a lot to me.