Skills houdini

install
source · Clone the upstream repo
git clone https://github.com/TerminalSkills/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/TerminalSkills/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/houdini" ~/.claude/skills/terminalskills-skills-houdini && rm -rf "$T"
manifest: skills/houdini/SKILL.md
source content

SideFX Houdini — Procedural 3D & VFX

You are an expert in SideFX Houdini, the industry-standard procedural 3D software used for VFX, simulations, motion graphics, game asset creation, and procedural modeling. You help artists and technical directors build procedural workflows using Houdini's node-based architecture, VEX scripting, Solaris/USD pipeline, simulation solvers (pyro, FLIP, Vellum, RBD), PDG/TOPs for task automation, and HDA (Houdini Digital Assets) for reusable tools — enabling non-destructive, art-directable pipelines that scale from indie projects to AAA and feature film production.

Core Capabilities

Node-Based Procedural Workflow

## Houdini's Philosophy: Everything is Procedural

Unlike Maya or Blender where you sculpt directly, Houdini builds
geometry through a chain of nodes. Change any parameter upstream
and everything downstream updates automatically.

## Context Types (Network Levels)
- **SOP** (Surface Operators): Geometry creation and manipulation
- **DOP** (Dynamics Operators): Simulations (physics, fluids, cloth)
- **CHOP** (Channel Operators): Animation, audio, motion
- **COP** (Compositing Operators): Image processing
- **VOP** (VEX Operators): Visual shader/expression building
- **TOP/PDG** (Task Operators): Pipeline automation, batch processing
- **LOP** (Lighting Operators): USD/Solaris scene assembly and rendering

## Example: Procedural City Generator (SOP)
Grid → Divide (random) → Extrude (height from noise) → 
UV Project → Material Assign → Copy to Points (windows) →
Scatter (trees on ground) → Merge

VEX Scripting

// VEX — Houdini's high-performance expression language
// Runs per-point, per-primitive, or per-vertex in parallel

// Wrangle SOP: Scatter points on terrain with slope-based density
// Context: Point Wrangle (runs for each point)

// Get terrain normal to determine slope
vector nml = @N;
float slope = 1.0 - dot(nml, {0, 1, 0});     // 0 = flat, 1 = vertical

// Remove points on steep slopes (no trees on cliffs)
if (slope > 0.6) {
    removepoint(0, @ptnum);
    return;
}

// Randomize scale based on position
float seed = @ptnum * 13.37;
float scale = fit01(rand(seed), 0.5, 1.5);    // Random 0.5x–1.5x
f@pscale = scale;

// Assign tree type based on altitude
float altitude = @P.y;
if (altitude > 50) {
    i@tree_type = 1;                           // Pine (high altitude)
} else if (altitude > 20) {
    i@tree_type = rand(seed + 1) > 0.5 ? 0 : 1;  // Mixed
} else {
    i@tree_type = 0;                           // Oak (low altitude)
}

// Color by type for viewport preview
if (i@tree_type == 0) {
    @Cd = {0.2, 0.6, 0.1};                    // Green (oak)
} else {
    @Cd = {0.1, 0.4, 0.2};                    // Dark green (pine)
}
// Volume Wrangle: Custom noise field for pyro simulation
// Creates art-directable turbulence

float freq = chf("frequency");                 // UI slider (1.0–10.0)
float amp = chf("amplitude");                  // UI slider (0.1–2.0)
float offset = chf("time_offset") * @Time;     // Animated offset
int octaves = chi("octaves");                  // Noise layers (3–8)

// Layer multiple noise frequencies (fBm)
float n = 0;
float f = freq;
float a = amp;
for (int i = 0; i < octaves; i++) {
    n += a * onoise(@P * f + offset, 4, 0.5, 1.0);
    f *= 2.17;                                 // Frequency doubling (slightly offset)
    a *= 0.45;                                 // Amplitude decay per octave
}

// Write to density field
f@density += n;

// Temperature drives flame color (higher = brighter)
f@temperature = fit(n, -0.5, 1.0, 0, 2.0);

Simulations

## Simulation Types

### Pyro FX (Fire, Smoke, Explosions)
Pyro Source → Pyro Solver → Volume Visualization
- Combustion model: temperature → burn → density
- Shaping: disturbance, turbulence, shredding
- Art direction: source attributes control flame shape and color

### FLIP Fluids (Water, Ocean, Lava)
FLIP Source → FLIP Solver → Particle Fluid Surface (mesh)
- Particle-based fluid simulation
- Surface tension, viscosity, foam/spray/bubble whitewater
- Ocean Spectrum for infinite procedural ocean

### Vellum (Cloth, Hair, Soft Body, Grains)
Vellum Configure → Vellum Solver → Vellum Post-Process
- Unified constraint-based solver
- Cloth: garments, flags, tents
- Hair/Fur: strand simulation with collision
- Soft body: jelly, rubber, organic deformation
- Grains: sand, snow, sugar

### RBD (Rigid Body Dynamics — Destruction)
RBD Material Fracture → RBD Bullet Solver
- Voronoi/Boolean fracturing
- Constraints: glue, soft, hinge (break on impact)
- Bullet solver for fast simulation
- Debris, dust secondary effects

### Crowd Simulation
Agent → Crowd Source → Crowd Solver
- Thousands of autonomous agents
- State machines for behavior (walk → run → fight)
- Obstacle avoidance, terrain adaptation
- Ragdoll on impact

Solaris / USD Pipeline

## Solaris (LOPs) — USD Scene Assembly

Houdini's Solaris context works natively with Pixar's USD:

Stage → Sublayer (characters.usd) → Sublayer (environment.usd) →
Edit Material (override for this shot) → Camera → Render (Karma)

### Key Concepts
- **Layer stacking**: Non-destructively override properties per shot/sequence
- **Collection**: Group prims for material/light assignment
- **Instancing**: Millions of trees/rocks with minimal memory
- **Karma renderer**: Production path-tracer (CPU + GPU)
  - Karma XPU: GPU-accelerated, interactive quality preview
  - Karma CPU: Final quality, subsurface scattering, volumes

### Pipeline Integration
- Import: Alembic (.abc), FBX, OBJ, glTF, USD
- Export: USD, Alembic, FBX, OBJ, glTF (via ROP/FILM)
- Render: Karma, Redshift, Arnold, RenderMan, V-Ray, Octane
- Engine: Unity, Unreal (Houdini Engine plugin)

PDG / TOPs (Pipeline Automation)

## PDG (Procedural Dependency Graph) — Batch Processing

TOPs automate repetitive tasks across a pipeline:

### Example: Generate 1000 Game Assets
File Pattern (terrain heightmaps) →
HDA Processor (generate terrain mesh from heightmap) →
HDA Processor (scatter vegetation) →
HDA Processor (LOD generation: high/med/low) →
ROP Geometry (export .fbx per LOD) →
Image Magick (generate thumbnails) →
CSV Output (asset manifest)

### Use Cases
- Batch render 500 product variations (color × material × angle)
- Generate LODs for 2000 game assets overnight
- Process satellite data into terrain tiles
- Render all shots in a sequence across farm machines
- Data visualization: process CSV → 3D chart for each region

### Farm Integration
- HQueue (Houdini's scheduler)
- Deadline, Tractor, Royal Render
- AWS/GCP cloud rendering

Houdini Digital Assets (HDAs)

## HDAs — Reusable Procedural Tools

Package a node network as a black-box tool with a custom UI:

### Example: Building Generator HDA
Inputs: footprint curve, style preset
Parameters: floor count, window density, facade material, roof type
Output: textured building geometry with LODs

### Benefits
- Share tools across team without exposing internals
- Version control: HDA versioning system built in
- Engine integration: HDAs work in Unity/Unreal via Houdini Engine
- Non-technical users get simple parameter UI
- Lock/unlock for IP protection

### Houdini Engine
- Unity plugin: Drop HDA into Unity, tweak parameters, bake geometry
- Unreal plugin: Same workflow, generates Unreal assets
- Game teams use HDAs for procedural level generation at runtime

Python Scripting

# Houdini Python API (hou module)
import hou

# Create geometry programmatically
geo = hou.node("/obj").createNode("geo", "my_geo")
box = geo.createNode("box")
box.parm("sizex").set(2.0)
box.parm("sizey").set(3.0)

# Add noise displacement
mountain = geo.createNode("mountain")
mountain.setInput(0, box)
mountain.parm("height").set(0.5)
mountain.parm("freq").set(3.0)

# Set display flag
mountain.setDisplayFlag(True)
mountain.setRenderFlag(True)

# Batch parameter changes
with hou.undos.group("Setup Parameters"):
    for parm_name, value in params.items():
        node.parm(parm_name).set(value)

# Access geometry data
geo_data = mountain.geometry()
for point in geo_data.points():
    pos = point.position()
    normal = point.attribValue("N")

Installation

# Download from https://www.sidefx.com/download/
# Editions:
- Houdini Apprentice: FREE (non-commercial, watermarked renders)
- Houdini Indie: $269/year (revenue < $100K)
- Houdini Core: $2,495/year (modeling, animation, no simulations)
- Houdini FX: $4,495/year (full, including all solvers)

# Houdini Engine (for Unity/Unreal):
- Free with any Houdini license
- Indie Engine: $99/year

# Command line rendering
hython render_script.py                    # Python scripting
hbatch -c "render /out/mantra1"           # Batch render
husk scene.usd -o render.exr              # Karma USD render

Best Practices

  1. Think procedurally — Build systems that generate results, not hand-crafted one-offs; every parameter should be art-directable
  2. VEX over Python for geometry — VEX is multithreaded and 10-100x faster than Python for per-point operations
  3. HDAs for reuse — Package any reusable workflow as an HDA; version it, share it, use it in game engines
  4. Attribute-driven workflow — Store data as point/prim attributes; downstream nodes read attributes to make decisions
  5. PDG for batching — Use TOPs to parallelize rendering, asset generation, and data processing across cores or farm
  6. USD/Solaris for lookdev — Use Solaris for scene assembly, material assignment, and lighting; non-destructive USD layers
  7. Simulation caching — Always cache simulation results to disk; re-simulating is expensive, cached playback is instant
  8. Start with Apprentice — Free license has all features; only limitation is watermarked renders and limited resolution