How not to suck at Python / SideFX Houdini
This course is made for artists or TD (technical director) willing to learn Python to improve their workflows inside SideFX Houdini, get faster in production and develop all the tools you always wished you had.
Note that the course is now fully fleshed out and will keep uploading additional material through most parts based on feedback and relevant requests. Don't hesitate to reach out to ask question !
Part01 - Python Fundamentals // (63min) - FREE
Get Python Fundamentals before starting the fun stuff, it's important you are familiar with all these concepts before starting next Parts. I invite you to check again these videos later if you forget some of these concepts while we dig into more Houdini specific types of things
- A - Data Types (6min24)
- B - Variables (3min14)
- C1 - List (7min33)
- C2 - List Join and Split (3min47)
- C3 - List Method (4min04)
- D - Loop (3min46)
- E - Conditions (6min33)
- F - Extract List (2min13)
- G - Nested Loops (3min34)
- H1 - If short version (3min24)
- H2 - Loop short version (2min33)
- I - While loop (3min53)
- J - Dictionaries (7min56)
- K - Try / Except (4min08)
Part02 - Python Construction // (57min)
Going further with python fundamentals :
- 2A0 - Linking Houdini with an External Editor (4min40)
- 2A1 - Introduction, establishing the goal of part02 and the study of python construction. (7min40)
- 2B - Functions : Explanation of what functions are, how to create a function. (4min57)
- 2C - Local and Global Variables : Differences between local and global Variables (3min22)
- 2D - Python Class : Explanation and example of "Class" in python. (8min23)
- 2E 1 - Modules : Introduction to python modules (4min38)
- 2E 2 - OS module : Introduction to os modules and creating an easy script to return HDAs contained in your preference folder. (11min50)
- 2F - Handling Text Files : Showing here how to create, read, edit and remove text document on the fly with python (13min42)
Part03 - Python Basics in Houdini // (7h34min)
3A - Node (2h)
- A0 - SideFX Help / Documentation (1min)
- A1 - Create Node : Basics on creating Nodes and establishing sop hierarchy. (4min34)
- A2 - Define existing Node : How to define a python node already created. (4min35)
- A3 - Object Manipulation : Creating a bunch of spheres and iterate on their position, scale in world space (10min24)
- A4 - Color node : Create node and set a specific color, also using a houdini UI to select the color. Iterate on the color to stylize the network. (6min26)
- A5 - Shape node : How to change the shape of nodes in python. (4min31)
- A6 - Selected Node : Simple example to apply a color based on name of the nodes (similar nodes gets green color...), rename nodes. (9min42)
- A7 - Get node flag / Delete Node : Depending on the way displayFlag is set, color nodes accordingly. We'll also see how to delete node with a displayFlag off as a python practice. (5min18)
- A8 Children / setFlags / Node Types : Going through imported 3dmodel's path and importing their LOD. (18min49)
- A9 Connecting Nodes : Creating a proper module with a simple UI to import multiple 3dmodel from a directory and automate node network. (18min27)
- A10 Exercise : Creating a script to convert a mantra shader (principleShader) of a megascan asset into MaterialX. (35min17)
3B - Subnet and Parameter Template (1h30min)
- B1 - Subnetize : How to turn a selection of nodes in subnetwork in python. (4min)
- B2 - CopyNodesTo : How to copy the content of a subnet somewhere else. Showing here also how to handle simple UI dialogs. (10min35)
- B3 - Creating parameters in python : Showing how to add folders and basic parameters to a node's interface. Digging here into the parmTemplate class.(14min34)
- B4 - Parameter Conditionals : How to set up conditions on python created parameters to get them hidden or disabled based on the state of an other parameter. (15min03)
- B5 - Set Expression : How to set set expression within parameters, showing here a way to reference the absolute path of a parameter into an other node's parameter. (13min15)
- B6 - Light Control Introduction : Sharing here the goal for the rest of lesson B, creating a script/tool to control lights sharing the same settings. (4min34)
- B7 - Init Subnet : Turning a selection of light into a subnet and expose the most important parameters. (6min44)
- B8 - Color Parameter : Creating here a custom parameter to control the color in the most efficient way. (5min56)
- B9 - Link Parameter : Using what we learned in part B5 to connect the newly created parameters so they control the lights. (7min04)
- B10 - Finishing the Tool : Bringing the finishing touches to the tool to make it user and pipeline friendly. (9min06)
3C - Geometry Class Introduction (25min)
- C0 - Presentation of geometry Class (2min53)
- C1 - Reading point geometry (11min18)
- C2 - Get Attribute Value (11min24)
3D - Python SOP and Geometry Class (1h21min)
- D1 - How to reference current node (5min43)
- D2 - Set an Attribute Value (10min20)
- D3 - Adding Attributes (3min15)
- D4 - Group Manipulation (5min41)
- D5 - Bounding Box : create a group using the bounding box of an object (6min23)
- D6 - Nearest Points : all you need to know about point neighbor (11min20)
- D7 - Infection ! Creating a cool infection effect (44min30)
3E - Python and Houdini Digital Asset / HDA (53min40)
- E0 - What is an HDA and how to create one ?? (10min05)
- E1 - Linking HDA with Python (5min21)
- E2 - HDA and Event Handlers (13min03)
- E3 - Python Module Practice 1 (6min44)
- E4 - Python Module Practice 2 - SuperObjectMerger / Multiparm (18min26)
3F - Python and ViewerStates in HDA (1h 6min14)
- F0 - What is a ViewerStates (3min08)
- F1 - Basics of ViewerStates : Creating a subdivision preview Tool. (10min08)
- F2 - ViewerStates Mouse Events : Creating a superClone tool to give more user-friendly controls to the "Copy And Transform" sop. (17min40)
- F3 - ViewerStates Reason Events : Improving superClone HDA to make the user experience much more satisfying thanks to "reasons" functions and their ability to breakdown a click or pressing of key into different steps. (11min40)
- F4 - ViewerStates Reading Keyboard : Creating a special transform tool that control the position of an object through a keyboard (13min09)
- F5 - ViewerStates Context Menu : Adding a popup menu to our right click controlling the shape of our clones in our superClone HDA (10min29)
3G - Python and Keyframes (15min)
- G0 - Keyframes in Houdini : Introduction to keyframes in Houdini and showing how to convert a premade animation as a code (6min18)
- G1 - Set, Read and Delete Keyframes : Using python to create Keyframes on a parameter, read them and delete them. (8min41)
3H - Python Special Tricks (29min27)
- H1 - save Node As Python Code : Going through a workflow to convert a selected node into a fully detailed python code and storing it in preference folder. Can be a more simple alternative to storing HDA (13min48)
- H2 - Load and execute Python script : Following H1, we are here doing the opposite, bringing back to life the saved node (as code) (4min41)
- H3 - Camera & SceneViewer : Showing here how we can manipulate the viewport display (current camera) and refit the view to a specific object via python (10min58)
Part04 - Python Pro in Houdini // (3h08min)
- A1 - Turntable Script Setup (44min)
Coding from scratch a turntable script that generate a full Turntable + lightspin setup based on the model selection. Auto setup the camera, grey/chromeball rig, keyframes, domelight settings, mantra render settings.. Get ready to fire Turntable renders in one click !
We are reusing here all the knowledge we accumulated from part 1, 2, 3 to step up our coding game into this practical exercise. We are not covering yet the Interface in PyQt, we will revisit this script into the part 5 - Python Export in Houdini with that in mind.
- A2 - Turntable Simple UI (14min23)
Creating a simple UI to drive our Turntable settings ! Setting up here a better python structure that will help us once we dive deeper into PyQT in part5...
- B - MaterialX converter (1hour 5min)
B1 - Basic UI Guides : Creating here some basic UI control for the script we started in part 3A to improve user experience (script provided as start), for example if the wrong node is selected for conversion a message will artist know about it, if it's the right node an UI will popup to let us send the converted result into the selected materialLibrary lop. (20min30)
B2 - Improving Tool : Creating here some basic UI control for the script we started in part 3A to improve user experience (script provided as start), for example if the wrong node is selected for conversion a message will artist know about it, if it's the right node an UI will popup to let us send the converted result into the selected materialLibrary lop. (42min22)
- C - SmartSave Tool (24min52)
C0 -Introduction : Showing here the goal of this part C, creating a handy tool to save our .hip file in a consistent fashion. Let see the different case scenario on how we want the tool to react. (2min18)
C1 -Coding: Let's code a functional and easy to use saving tool ! (22min34)
- D - HDA - Selectors / LightAttach (40min)
4D0 state Selectors - intro (7min): Going through the logic of python viewer states different selectors and how we gonna implement them.
4D1 state Selectors - templateSetup (13min) : Setting up our HDA and our code to run the basic functions that will drive the creation of our point lights.
4D2 state Selectors - constraint lights (19min): Now that we retrieved a list of points based on selection, time to loop through those points and constraint some lights ! Also adding an offset control in our HDA to push our lights away from initial geometry.
Part05 - Python Advanced with Houdini & QtDesginer // (2 hour 50min)
- A1 - QtDesigner Introduction (10min29)
Going through the fundamentals of QtDesigner to create custom UI for our houdini tools.
- B - QpushButton / Creating a simple toolbox of buttons (25min48)
B0 : Introduction of the exercise (1min47)
B1 : UI design in QtDesigner (2min46)
B2 : Connecting Clicks in Houdini (4min00)
B3 : CreateNode custom function (10min21)
B4 : Finishing the tool thanks to LambdaExpressions / Anonymous Functions (6min54)
- C -Node Cleaner / Coding a tool with a more complex UI (42min17)
This exercise C is here to slowly buildup stronger knowledge of PySide/Qt, the purpose of the tool designed here is to delete or hide geometry nodes by evaluating an expression in which we are passing a parameter (tx : "translate X" in example) and comparing it to a given value (0 in example).
In order to evaluate this comparison we are using the operator module. (In example "<" : "smaller"), if the result of this comparison is True... Then Delete ! (or Hide...)
C0 : Introduction of the exercise (2min23)
C1 : UI design in QtDesigner (4min40)
C2 : Python UI - Starting to attach a function to update the UI based on the state of the dropdown menu (QcomboBox) (8min15)
C3 : Operator Module Integration - Explaining how we can extract the text of the QlineEdit and evaluate the expression attached to it (11min35)
C4 : Hide and Delete Function - Based on evaluated expression let's either hide or delete selected nodes (10min19)
C5 : Reset Function - Add a reset button to make things user friendly (5min5)
D - HDRI Importer / Coding a tool using PythonPanels (1h31min58)
UI of finaled tool : HDRI Import
D0 : Introduction of the exercise (3min12)
D1 : UI design in QtDesigner (3min05)
D2 : Python Panel - Introducing how to use python panels within houdini (3min57)
D3 : Directory Selection - How to script our browsing system (9min45)
D4 : QTable Setup - Setting up our QTable to display the proper amount of cells (item) based on amount of hdri in directory (8min38)
D5 : QTable Item - Displaying HDRI's name inside each cells/item of QTable (5min27)
D6 : QTable SetData - Attaching data (the fullpath) of HDRIs to the cell and creating the Import function of our Tool (7min41)
D7 : HDR Convertion to Jpg - Creating a script to auto convert all HDR images contained in a directory into JPG (23min02)
D8 :QIcon - Inserting a thumbnail into the item of our QTable... browsing experience x100 ! (8min59)
D9 : Finishing - Adjusting the UI and script to offer more display controls and comfort for user (17min12)