Special Guest Tutorial: Shortest Path Growth

comments 19
Free Tutorials

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)

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


  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.

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


    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.

    • Very very cool – thanks a lot for sharing this, Carl!

    • Alvaro Moreira

      That’s really awesome, thank you very much, Carl!

  7. Houdini 16 has a different Group node which doesn’t give you any of those options – could anyone explain a way around this?

    • Yes, H16 split the group node’s functionality into different SOPs. You can use different approaches, the simplest might be to drop down a group create node, check base group and just enter the point numbers you’d like to have in a given group.


      • Perfect – many thanks!
        and thanks again for the tutorials – amazing platform!

        • Hi!

          After making some tests with the groups nodes, I still have the Warning: No start points are specified.
          Someone could me help with this one?


      • Yeah took me a sec to find the “Group by range” node – also it operates differently to the one in the tut, the “end” in Group by range counts backwards from the number of points rather than up from 0 – So instead of $N you just need to leave it at 0. This will include all the points from point 0 to point N-0.

  8. Jon Møller Andersen

    I am trying to replicate it on an entire word but it only works on the first letter? What am I doing wrong or what do I have to do to make it work? Thank you for amazing tutorials

Leave a Reply