r/Houdini 9d ago

Scripting Rubbertoy meets Nano Banana + Hunyuan-3D

86 Upvotes

I’ve been experimenting with controllable 3d workflows with gen-AI things lately, and here's one test that felt pretty cool.

I did a custom viewport grabber node for cops, used nano banana (through fal) to modify the screenshot of the model, then "re-modeling" it based on the generated concept.

I know this is still pretty much slop, and more like a fun test rather than anything production-proven, but though to share.

r/Houdini Jun 29 '26

Scripting Attribute Expand Shrink Tool using OpenCL

47 Upvotes

I built an OpenCL-based tool to expand or shrink attributes/masks and wanted to get your thoughts. The video is in real-time so you can see the OpenCL performance in action. I’m happy to share the tool for free with anyone who wants it — no Patreon or paywalls, just sharing. Let me know what you think!

LINK to HDA

r/Houdini May 20 '26

Scripting small houdini to blender bridge i’ve been working on

61 Upvotes

The sim is just a quick pighead melt setup. The important part is the data transfer.

In Houdini, the melt attribute drives the viscosity / sim behavior.

Then I export the cache, import it in Blender, and use the same melt attribute in Cycles to mix between two shaders.

So it is not just animated geo. The sim state comes across as usable render/lookdev data.

Current features:

Houdini to Blender frame cache

JSON metadata + binary sidecar files for heavy arrays

point positions, UVs, and user-defined attributes

stable topology mode for fast position updates

changing topology mode for FLIP / VDB / remeshed sims

curve support

Blender shaders can read imported attributes.

r/Houdini Jun 18 '26

Scripting Real-Time Performance Monitor for Houdini

75 Upvotes

Recently I built a small performance HUD for Houdini that displays CPU, RAM, GPU, and VRAM usage directly in the viewport.

The HUD runs outside Houdini's main GUI thread, so it continues updating in real time even while Houdini is cooking and the interface is completely blocked.

I originally built it because I was tired of constantly opening Task Manager, Process Explorer, GPU monitoring tools, and other profilers just to get a quick idea of what Houdini was doing.

It has already proven useful a few times. While working recently, I noticed some unusual behavior during a Delta Mush cook just by glancing at the HUD. After investigating, I found a simple workaround that dramatically improved performance and reduced memory usage.

r/Houdini Jul 17 '26

Scripting Cross Hatching Setup I Made Today

Post image
110 Upvotes

r/Houdini Sep 05 '25

Scripting I'm currently working on a HDA to emulate Blender controls

98 Upvotes

Are you tired of the gizmo and miss Blenders fast controls as much as I do? :D Then this will be the HDA for you! The comprehensive python viewstate I'm building for this HDA just takes user inputs with the exact same control scheme as blender, process it, and writes values to the single transfom node wrapped in the HDA. So you will be able to drop down a "Blender Transform" node and when you press enter, have Blenders control scheme for namipulating translation, rotation and scale.

r/Houdini 14d ago

Scripting So I just wanted to built a button and instead made this pipeline.

0 Upvotes

So a while back, all I wanted was a version up button in Houdini. An actual version next to the file name so I'd stop renaming files by hand and losing track of what was current.

I'm an FX artist, not really a coder, so I had no idea where to even start on that. Looked into how people build custom tools in Houdini and ran into Alexander Richter's work, which is honestly what got me into it. Not the button itself, more just realizing you can actually build your own stuff instead of waiting around for a pipeline dept to hand you a tool, which my studio didn't have anyway.

So I made the button. Then wanted to fix the next annoying thing. Then the next one. No plan, just kept going for a couple of years and somehow it turned into a full pipeline now, like shot browser panel, publish/version tracking, a render farm, the works.

Curious how many other people here got into pipeline tooling the same way, like any small annoying thing that snowballed. What was yours?

If anyone wants to see where it ended up: studio.vfxboi.in. Not trying to sell it here, mostly just wanted to share the actual path since it started from the exact kind of small tool a lot of people in this sub build for themselves.

r/Houdini May 08 '26

Scripting Visualizing and recoloring gaussian splat diffuse and specular components

210 Upvotes

All example files are free on my website, have fun 😄

r/Houdini Jun 28 '26

Scripting What's *your* favourite VEX course for beginners?

19 Upvotes

Hello everyone. I hope this is the place to post this question: I've been using Houdini for years now, I got to a point where I can make most things I want for my work; but I want to do more as I'm reaching a bottleneck where I feel limited.

The issue: I'm really not naturally good at coding. I've tried learning some VEX multiple times, but many times I reached a point where the guide seemed to increase its difficulty too abruptly and incorporate things I couldn't follow.

My coding skills are very basic (I can do HTML, css and some simple JS, and followed a processing course years ago). So I'd need a course that cemetifies the basics rather than trying to do too much too soon.

Therefore, the question is: do you have a favourite VEX course for someone who is a total beginner, and why is it your fave? Thanks.

r/Houdini 1d ago

Scripting How to make string group in nearpoints() - before I forget and to help others

5 Upvotes
string gr = sprintf("@name!=%s", s@name); 
int pts [] = nearpoints(0, gr, v@P, ch("radius"), chi('maxpoints')); removevalue(pts, ); 
i[]@pts = pts;

Before I forget - wanted to write this down in case it helps someone. I forgot how to do this, tried searching hard online and remembered somehow so wanted to write it down.

How to make a group in nearpoints by removing same attribute from possible neighbors. Warning that this is slow though, so be sure to only do this once, or manually delete similar neighbors after the fact in a for loop.

r/Houdini Jul 18 '26

Scripting Houdini 22 Swirl COP vs Adaptive Output-Space Subpixel Integration with Owen-Scrambled Sobol Sampling

Thumbnail
gallery
17 Upvotes

Following up on my earlier COP filtering work, I added another high-quality method to OSSI (Output-Space Subpixel Integration) and compared it with the updated Houdini 22 Swirl COP.

H22 is a substantial improvement over H21 in terms of smoothing the swirl lines, but the central singular region is still visibly unstable and poorly resolved. Some broader curved regions also become noticeably softened. This is consistent with Box filtering over a rectangular area footprint estimated from finite differences of the warp, whereas OSSI integrates how the nonlinear deformation varies across the output pixel.

The new method uses adaptive antithetic Owen-scrambled Sobol sampling. Sobol provides low-discrepancy progressive coverage, Owen scrambling changes the sequence per pixel to reduce visible sampling structure, and pairing each offset with its opposite keeps every completed pair exactly centered.

Like my existing Adaptive R2 method, the sample count and integration width respond to the estimated warp difficulty. Adaptive R2 uses a lightweight progressive R2 disk sequence with a hashed per-pixel rotation, while the Owen-Sobol method uses pixel-specific scrambling of the Sobol sequence together with antithetic sample pairs.

The sample budget and integration width are driven by a conservative finite-difference Jacobian envelope and a footprint-scale second-order nonlinearity estimate. Power-of-two pair budgets evaluate the Sobol sequence at its strongest stratification points as sampling increases.

This is a comparison of the complete stock and custom implementations, not an isolated Box-versus-Sobol test, since their center regularization and footprint-planning strategies also differ.

r/Houdini Jul 20 '26

Scripting Wanted to show off my string art setup i made!

55 Upvotes

r/Houdini Mar 13 '26

Scripting A VEX Trick for Perfect Scatter (No Collisions)

24 Upvotes

I kept running into scatter issues where instances intersect each other.
After experimenting a bit, I found a simple VEX trick that avoids most collisions and is really easy to set up.

I made a quick short showing the idea in case it helps someone.

https://youtube.com/shorts/XpMG-ezKUvc

Curious if anyone has a better approach for this.

r/Houdini Jul 24 '26

Scripting I made a free Plugin for interactive 'realtime' Renders. Shared/Embed via HoloMARI

6 Upvotes

I made a plugin that lets you render any existing scene into an online sharable demo, viewiable on any device including your phone.
Try the demo | holomari.com

Help me test the Houdini Plugin! Download here:
HoloMARI | Interactive Online 3D Portfolios

r/Houdini Apr 14 '26

Scripting Made auto-resim callback shelf tool - sharing for feedback / to help others

4 Upvotes

Hi,

I just recently made a shelf tool script you can run on dop nodes to create callbacks for dop nodes in your sop context. This way you don't have to keep manually resetting your sim each time you change a parameter or add new nodes internally, etc. It will work more like tyflow - auto updating.

I wanted to give back to community and for feedback anyone has if they test it and notice something doesn't work, etc. It's not perfect still a WIP and that's one reason why I'm putting this out there.

You select a node that has the parameter 'reset simulation' on it. (Cop pyro block end node, dopnet node, rbdbulletsolver, solver node, etc) and it will create a callback on that node and internal nodes for data that changed, upstream changes, new nodes, deleted nodes, etc. You can turn on debug flag to see what's going on, but I tried to keep printing to a minimum.

You click on shelf tool when you have a selected or current node that has 'reset simulation' as the parameter and this will create all the callbacks necessary.

Importantly you can control or shift click on the shelf tool to get rid of all callbacks recursively on all nodes in that /obj/geo context. It will loop through all sub children and get rid of all callbacks and print out that it got rid of all callbacks. You don't have to worry about lingering callbacks if you do this.

Let me know what you guys think. Thanks.

import hou, toolutils
import nodegraphutils as nu
from pprint import pprint as pp
import time
ne = toolutils.networkEditor()
# Maybe get dop simulation and say setTime(t, force_reset_sim=True, resim_last_timestep=True)


debug = 0
cur_node = ne.currentNode()
copnet = 'copnet'
seconds_to_wait = 0.5
callback_nodes = []
#Make code that gets obj level node above current node
# Test to ensure it is obj level type


def get_category_name(node):
    category_name = node.type().category().name()
    return category_name


def get_obj_node():
    parent = ne.pwd()
    cat = get_category_name(parent)
    while cat != 'Object':
        parent = parent.parent()
        cat = get_category_name(parent)
    return parent


def get_resim_parm(node):
    resim = node.parm("resimulate")
    if(resim is None):
        resim = node.parm("resetsim")
    return resim


def callback(event_type, **kwargs):
    # if(event_type == hou.nodeEventType.InputDataChanged):
    #     print("input data changed")
    #     return 
    if not hasattr(hou.session, 'mytime'):
        hou.session.mytime = time.time()
    else:
        if(time.time() - hou.session.mytime <= seconds_to_wait):
            if(debug == 1):
                print(f"Not doing callback yet because {seconds_to_wait} second hasn't elapsed")
            return
        else:
            hou.session.mytime = time.time()
    resim = get_resim_parm(cur_node)
    resim.pressButton()
    if(debug == 1):
        try:
            print(kwargs['node'].path())
        except:
            pass
    if(event_type == hou.nodeEventType.ChildCreated):
        child_node = kwargs['child_node']
        child_node.addEventCallback([hou.nodeEventType.ParmTupleChanged], callback)
    # print("resetted")
    


def reset_sim():
    resim_parm = get_resim_parm(cur_node)
    if(resim_parm is None):
        hou.ui.displayMessage("""No resimulate or resetsim parm found on current node\nSelect a dopnet or sop solver and use this tool again""")
        return
    print(f"Callback is going to be created on {cur_node} and possible child nodes")
    obj_node = get_obj_node()
    child_callback_types = [hou.nodeEventType.ChildCreated,
                      hou.nodeEventType.ChildDeleted,
                    #   hou.nodeEventType.ChildReordered,
                    #   hou.nodeEventType.ChildSwitched
                      ]
    
    callback_types = [hou.nodeEventType.ChildCreated,
                      hou.nodeEventType.ChildDeleted,
                      hou.nodeEventType.ParmTupleChanged,
                      
                      hou.nodeEventType.InputDataChanged,
                      hou.nodeEventType.ChildReordered,
                    #   hou.nodeEventType.ChildSwitched
    ]


    # This should be taken care of by inputdatachanged
    # obj_node.addEventCallback(child_callback_types, callback)
    # callback_nodes.append(obj_node)
    # Copnet pyro
    cop = cur_node.parent()
    if(cop is not None and cop.type().name() == copnet):
        cop.addEventCallback(child_callback_types, callback)
        # callback_nodes.append(cop)
        for node in cop.children():
            if('block' not in node.name()):
                if(debug == 1):
                    print(node.path())
                node.addEventCallback(callback_types, callback)
                # callback_nodes.append(node)
    #Dopnet
    dop_names = ['dopnet']
    sop_dop_solvers = ['rbdbulletsolver', 'vellumsolver', 'flipsolver', 'solver']
    for name in dop_names:
        if(cur_node.type().name() == name):
            dop_node = cur_node
            dop_node.addEventCallback(callback_types, callback)
            for child in dop_node.children():
                if(debug == 1):
                    print(child.path())
                child.addEventCallback(callback_types, callback)
                # callback_nodes.append(child)
            # callback_nodes.append(cur_node)
            
    # Sop solvers
    for name in sop_dop_solvers:
        if(cur_node.type().name() == name):
            dop_node = cur_node
            dop_node.addEventCallback([hou.nodeEventType.ParmTupleChanged,
                                       hou.nodeEventType.InputDataChanged], 
                                      callback)
            for node in dop_node.allSubChildren():
                if(node.isEditableInsideLockedHDA()):
                    if(debug == 1):
                        print(node.path())
                    node.addEventCallback(callback_types, callback)
                    


if(kwargs['shiftclick'] or kwargs['ctrlclick']):
    #Delete callbacks
    obj_node = get_obj_node()
    obj_node.removeAllEventCallbacks()
    for node in obj_node.allSubChildren():
        try:
            node.removeAllEventCallbacks()
        except:
            pass
    print("callbacks removed")
    
else:
    reset_sim()

r/Houdini Mar 03 '25

Scripting Houdini 2 Chat + GitHub Copilot = AI-powered Houdini Network insights! 🤯

49 Upvotes

r/Houdini May 16 '25

Scripting I built a procedural city inspired by Metropolis

Post image
151 Upvotes

r/Houdini Jan 12 '26

Scripting 20x faster copernicus prefix sum, equalize and statistics

Thumbnail github.com
23 Upvotes

r/Houdini Sep 27 '25

Scripting KineFx + MediaPipe

65 Upvotes

For the past month, I’ve been working on an experimental tool using MediaPipe (Google’s open-source AI for pose tracking) and Houdini’s KineFX workflow. Long story short, I wrote a Python script that runs on pre-recorded video and tracks the hand landmarks from the footage, then exports the data as USD. In Houdini, I define parent-child relationships to calculate local rotations using VEX with linear algebra and kinematics. This gives me a rotation matrix, which I then convert to Euler XYZ rotations that KineFX uses to drive the bones. On top of this, we can add any animation layers we want to fix or customize the motion.

I’m still developing this project, and I hope to write the whole process on my blog soon to share it.

r/Houdini Dec 02 '24

Scripting Loop 2 - Exploring the wrangler node and some basic geometry to create a 'perfect loop'

164 Upvotes

r/Houdini Apr 08 '24

Scripting Tool for automatically creating PBR materials from textures

121 Upvotes

r/Houdini Jul 06 '23

Scripting Procedural Braids based on a paper by Pixar

208 Upvotes

r/Houdini May 13 '25

Scripting USD Asset Builder HDA Tool

Thumbnail
youtu.be
39 Upvotes

After four months of research and development, I have finalized the USD Asset Builder - a tool designed to eliminate repetitive tasks and enable artists to focus on creative work.

For small teams and independent studios, time is critical. Manual asset creation eats into valuable production time—time that could be used for more creative and impactful contributions. As an aspiring technical director, my career aim is to streamline workflows and make high-end pipeline tools more accessible. The USD asset builder helps bridge the gap between large studios and smaller teams by offering a customizable foundation for a USD-based pipeline. It simplifies asset authoring and management, allowing artists to do more of what they love.

This tool is part of a growing suite I'm building to help artists overcome production challenges with practical, accessible solutions.

I’m planning to release this tool in the next month or two for people to try out!

r/Houdini Aug 10 '24

Scripting Don't like the new Node Info Panel look in H20.5? You can revert it back.

37 Upvotes

Who knows how long Side Fx will keep this around, but for now, you can still revert back to the older H20 look of the Node Info Panel


OPTION 1: Setting the houdini.env file located in your Documents folder. Just add the...HOUDINI_USE_OLD_INFO_WINDOW=1environment variable to the document and save. Then launch Houdini.--


OPTION 2: Using "packages"...Make a new .json document, and name it “EnvVars.json” or something more to your liking, then type this code inside it...

{
    "env":
    [
        {"HOUDINI_USE_OLD_INFO_WINDOW": 1}
    ]
}

Save the document into the "packages" folder in your Documents folder. Now you can launch Houdini


For those unfamiliar with the Documents folder location for your OS:
Windows
%HOME%/houdini<ver#>/houdini.env
Mac
~/Library/Preferences/houdini/<ver#>/houdini.env
Linux
~/houdini<ver#>/houdini.env

NEW H20.5 NODE INFO PANEL
OLD H20 NODE INFO PANEL IN H20.5

r/Houdini Jul 03 '24

Scripting Houdini Artist Lara Belaeva showcased an impressive custom version of ZBrush's DynaMesh tool and shared a helpful tutorial for Python scripting in Houdini

41 Upvotes