TD Essentials: Parallel Transport

comments 13
Free Tutorials

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.

Download Initial File

Download Project File

Download the original paper by Hanson and Ma

Liked it? Take a second to support Manuel on Patreon!
Become a patron at Patreon!

13 Comments

  1. Jason Iversen

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

  2. alex gvaramia

    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!

  3. arturo valle

    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.

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

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

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

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

Leave a Reply