Special Guest Tutorial: Shortest Path Growth

comments 8
Featured Video Play Icon

Say hi to our very good friend Ben Watts of BW Design. We’re thrilled to have him on Entagma for a guest tutorial showing his newest technique for vein growth in Houdini without any VEX.

Vein growth has been pretty popular recently. Most setups rely on rather intricate techniques such as Space Colonization. However Ben managed to come up with a neat compact setup that relys purely on Houdini’s built in tools to achieve effects of similar complexity without the need for any coding.

Make sure to check out Ben’s Vimeo channel and portfolio for additional Houdini goodness.

Download Project File (.hip)

Share on FacebookTweet about this on TwitterPin on PinterestEmail this to someoneShare on LinkedInShare on Google+


  1. This method creates a lot of overlapping polylines. Is this a side-effect of it being a clean and simple process? Im guessing that creating a proper branching data structure would require a mostly VEX solution, but I wonder if there is a feature in Houdini (only been using for about 2 months) that can help reduce the number of points/vertices? My exported geo ended up being several GBs.

    Great tutorial nonetheless. So simple, and produces such beautiful results.

    • Moritz says

      Hi Robert,

      EDIT: Nope, I was wrong – the culprit is the carve SOP.

      the reason this setup creates a bunch of overlapping polylines is that the find shortest path node is setup to connect a few starting points to a big number of end points. Thus the paths needed to form all the connections end up using parts of the same paths to get to the individual end points, similar in a highway network where the big cross country highways are the biggest and most frequented roads. A very simple (yet not perfect) technique to get rid of most of the overlaps would be to drop down a fuse SOP after the carve SOP.


  2. Mike says

    Hi guys,

    Really enjoying this tut! Thanks!
    But I’m having a problem, just at the beginning, you select “start” and “end” at 3:40, in the “findshortestpath”, but I have not this option, just “Windows_NT”. What am I missing?


    • Had the same issue… If you get rid of the $os in the start/end groups and name it “start”, “end” you’re able to select it in the findshortestpath node. Don’t know exactly why, but it works.


  3. Hey! thanks a lot for this!
    really straightforward way of doing it 🙂

    about the way to fill the object with points, you could use poly to vdb > points from volume> connect adjacent points.
    it is kind of the same idea anyway but it might be a bit faster ( maybe ).
    thanks again guys!

  4. Hello!

    You always make so fantastic renderings to teaser your tutorials. Did you make these renderings within Houdini or did you use another software? If it’s all Houdini (with mantra), could you make an dedicated lighting / rendering tutorial? Please! 🙂 (Please, please, please!)

    And thx again for all your great tuts here – you guys rock!

  5. Sebastian Schmidt says


    first, thanks a lot for this one and the whole entagma project!
    It may be a noobish an slow resolution, but for getting the lines moving trough the volume. It worked quite good (slow but a lot of control of the look) to scatter some points from the mesh >voronoifracture>connectadjacentpieces

    Thanks again!

  6. Here’s a little setup to remove overlapping prims after the findShortestPath.

    5 nodes:

    1) Create group of all points. I called it ‘cutPts’.
    2) Put down polyCut and put ‘cutPts’ in the cut group. Set Strategy to ‘Cut’. This separates every prim.
    3) Attribute wrangle, iterating over prims, to set a centroid attribute per prim. Vex =

    int prpts[] = primpoints(0,@primnum);
    vector sumP = {0,0,0};
    foreach(int prpt; prpts){
    sumP += point(0,”P”,prpt);
    sumP /= len(prpts);
    v@primcentroid = sumP;

    4) Attribute wrangle, iterating over prims, to compare current centroid against every prim remaining in the loop and remove itself if very close. Vex =

    int primCount = nprimitives(0);
    vector curCentroid = prim(0,”primcentroid”,@primnum);

    for(int i=(@primnum+1); i<primCount; i++){
    vector checkCentroid = prim(0,"primcentroid",i);
    if(distance(curCentroid,checkCentroid) < 0.001){

    5) Fuse sop to reconnect.

    If you now do a connectivity you'll get a nice unique class per branch.

    Cheers, Carl.

Leave a Reply

Your email address will not be published. Required fields are marked *