TD Essentials: Parallel Transport

CCurve 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.

Download the original paper by Hanson and Ma

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

2. Alfredo says

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

3. Jason Iversen says

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

4. alex gvaramia says

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!

5. arturo valle says

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.

6. Nic says

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

7. milos says

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

• milos says

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

8. Dav says

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.

• Dav says

Okay, sweep node haha, saw it 🙂

9. Mohan says

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

• Mohan says

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.