For those who tried or afraid to start to learn VEX but fail and stop because it was too hard. Here you will learn VEX and some Math beginning from the basics with a clear detailed explanation. You need elementary knowledge of Houdini UI and understanding of core programming concepts. If you can render metal sphere in Houdini and know what is syntax, data types, variables and loops then you are fine to go check Programming Basics tutorial if not.
If you will feed some data to Attribute Wrangle connect any node to input leave Run Over parameter at default Point state. All exercises from this chapter you can find in VEX snippets hip file. The goal here is to start with the very simple and basic tasks keeping the amount of code minimal and gradually, step by step increase complexity of exercises. If you will really understand the basics it would be easy to develop extra functionality for the staring code. Point is a basement of 3 Dimensional data representation and its a core entity in Houdini.
Understanding points allow understanding a huge part of SOP context an area where you are creating models in Houdini. To make things simple you can consider the single point as a complete geometry of any complexity. Point in Houdini is a basic container in 3D space with a number of attributes associated with it.
Attributes are just variables on points to store data. The minimal amount of point attributes is one: point position in the scene P. Point position is a built-in vector attribute, it holds 3 float number: point position in X, Y and Z in the global coordinate system scene.
The attributes could be built-in standard, already existing in Houdini and custom created and defined by the user. You can examine point attributes and their values in Geometry Spreadsheet window.
Attributes syntax. You define an attribute in VEX with data typesign and attribute name :. All modeling and bunch of other operations in Houdini are just around creating and managing points and their attributes. Now to create a point we need to know a command for that. Search for "create point Houdini vex" and you will definitely find out that addpoint will allow us to solve the task. Search for "addpoint vex" to read Houdini documentation on addpoint command.
Always start from reading the documentation for the command you wish to use, even if explanation there would not have any sense for you. This could happen at the beginning, but you will get more and more benefits from docs later, just do it to build an experience. One of possible usage of this command is: int addpoint int geohandle, vector pos What can we learn from this? So with addpoint we will create a point in a given position in space. Let's do it, write in your Attribute Wrangle node:.
Turn on Display points and Display pint numbers. If you did everything right you should get one point at the origin of Houdini scene:. Check Geometry Spreadsheet to see point attributes: point number 0 has one vector attribute P which is "point position" and value of this attribute is P.
Curious minds might notice one issue: point position is a vector attribute, but we feed an integer as a second argument of addpoint command.
Despite our code works it is actually wrong, we never should mess up our data types! It's a good practice always to declare the data type explicitly. Let's also use a variable to organize our code better. Organizing one line of code may seem ridiculous but proper structuring and organization should be done to any amount of data we work with.
Read the next section "Manage attributes" if you keen to learn more about this topic or skip the additional theory and go to the next step and create a line. Ok, we create a point with a default position attribute.Create a polygon or polyline without any points. You can then add vertices to the primitive with addvertex.
Make sure to add at least one vertex to the created primitive. You can use these numbers with setvertexattrib to set attributes on the vertices, however they may not be the final numbers of the vertices. If the primitive was created, but any points were invalid, the corresponding vertex numbers in the array will be These signatures overwrite the primnum variable with the new primitive number instead of returning it.
A handle to the geometry to write to. Currently the only valid value is 0 or geoselfwhich means the current geometry in a node. This argument may be used in the future to allow writing to other geometries. Sphere, circle, tube, metaball, or metasuperquadric primitive. Require exactly 1 point. You cannot add vertices to these primitives.
Packed Alembic or packed disk primitive. A primitive number for the created primitive, or -1 if the point could not be created. You can use the return value with setprimattrib to set attributes on the new point, however it may not be the final number of the point.
Returns number of elements where an integer or string attribute has a certain value. Copies the value of a geometry attribute into a variable and returns a success flag. Interpolates the value of an attribute at a certain parametric u, v position and copies it into a variable.
Returns position derivative on a primitive at a certain parametric u, v position. Returns one of the set of unique values across all values for an int or string attribute. Returns the set of unique values across all values for an int or string attribute. Interpolates the value of an attribute at certain UV coordinates using a UV attribute. Returns the albedo percentage of reflected light for a bsdf given the outgoing light direction.
Returns an anisotropic volumetric BSDF, which can scatter light forward or backward. Returns the value of a CHOP local transform channel at the specified sample and evaluation time.
Returns 1 if the edge specified by the point pair is in the group specified by the string. This function computes the intersection of the specified ray with the geometry in uv space. Returns the linear vertex number of the next vertex sharing a point with a given vertex. Returns the linear vertex number of the previous vertex sharing a point with a given vertex. Returns 1 if the point specified by the point number is in the group specified by the string.
Returns 1 if the primitive specified by the primitive number is in the group specified by the string. Returns 1 if the vertex specified by the vertex number is in the group specified by the string. Returns the point into which the vertex following the destination vertex of a half-edge in its primitive is wired.
Returns the vertex following the destination vertex of a half-edge in its primitive.I thought my collection of SOuP walkthroughs was a nice gentle intro for the average maya artist. Now that I've been using Houdini for a little while, and knowing that SOuP is heavily influenced by Houdini, it seemed like a good idea to try and port those tutorials over. I've become the Houdini evangelist I always despised, and I apologise for nothing.
It really is a great piece of software, warts and all, and it's easier to get into than ever. Do it! If you've landed here and you're totally new to Houdini, maybe head to HoudiniGettingStarted first, has a quick overview of how to use this site, and how to get comfy with Houdini as quickly as possible.
Same as before, just type 'Cd' in the list of transferred attributes. If you want more than one attribute transferred, separate them with a space. Eg, you want to transfer colour, normal, and pscale, you'd type "Cd N pscale". I added a colour node to the grid to make it red, another to make the sphere green, so you can see what's going on.
00. VEX attributes:
Why 'Cd'? Houdini uses a lot of naming conventions derived from prman. Cd is 'colour diffuse'. This was for the point sop in H It's been replaced with a vex equivalent, but its so fiddly to use, you're better off using the vop and vex versions of this below.
I rant a bit further down that no-one should use a point sop anyway, the 'improved' point sop is so strange and fiddly to use, it seems SideFx agreed. Houdini, as well as having the renderman style parameters, often uses variables with capital letters and a dollar sign, called local variables to be used in hscript expressions.
These can usually be found by looking at the help for that node, and scroll down to the 'local variables' section. Some older or esoteric nodes don't have any local variables defined.How to Stay Procedural in Houdini with VEX
Usually Houdini folk see these expressions and say 'ah, hscript'. Strictly speaking, houdini expression language and hscript are two different things in the way that maya MEL and maya expression language are two different thingsbut no-one can be bothered to say 'houdini expression language' out loud, and HEL sounds wrong.HScript expression example.
Variables and attributes. Quoting in HScript expressions. You can enter short bits of code, like mathematical expressions, in parameters to compute their values using math and variables such as the current frame number, the point number, random numbers, and so on.
For example, to make a sphere rise over time without having to manually keyframe it, you could set its Y Position to equal the frame number divided by 5. Houdini lets you write expressions in two different languages: traditional HScript expressions, and Python.
In addition, some specific nodes let you write VEX snippets to control the node behavior.
The traditional way to write expressions. Uses the expression functions. A more powerful but more verbose way to write expressions. By default, parameters in Houdini use the traditional HScript expression language explained below. To switch to use Python in a specific parameter, node, or everywhere, see Python parameter expressions.
Create a new Geometry object and dive inside. Create a Grid node. Trying playing back the animation using the playbar at the bottom of the main window. In numeric parameters such as position, rotation, scalethe text in the parameter is evaluated as an expression.
In string parameters such as filenames, or the text created by the Font nodethe text in the parameter is treated as text. Variables are expanded, but to use math or expression functions to generate part of the text you must place the expression within backticks.
For example:. See expressions in filenames for more information about using variables and expressions in filename parameters. See the list of global variables below. Geometry attributes. In HScript expressions on geometry you can reference the value of an attribute using attributename. For example, you can use pscale to get the value of the pscale point scale attribute on the current point.
For vector attributes such as P positionyou can use dot notation to grab a component, for example P. You can use. Local variables. Nodes often provide variables that are useful for expressions on nodes of that type.
For example, a node that operates over the points in a geometry will have a ptnum variable representing the point number of the current point. The help for a node will list the local variables you can use in expressions on that type of node.
In HScript expressions you can reference the value of a parameter on a node using the ch function. This can be useful to make a number on one node follow or be relative to a number on another node. You can create your own custom parameters to reference in your expressions.
See spare parameters. Right-click the destination parameter and choose Paste relative reference. Houdini will enter the proper ch "" syntax to make the second parameter reference the value of the first.Updated: Sep 10, VEX is a scripting language that is native to Houdini. It allows you to develop very fast and very complex functionality for you procedural modeling tasks, as well as many other tasks inside of Houdini. Throughout these posts we will focus mainly on how to use VEX to create procedural models for games.
This post assumes you are completely new to VEX and would like to learn the language from the ground up. You do not need any experience with the VEX language but having knowledge of how to use Houdini is a plus as we will not be covering the basics of using the Houdini application. Ok so let's move on and get into VEX.
We are going to start with the Wrangle node. As of this posting, we are using Houdini When you hit tab inside of a GEO node, you will find that there are a bunch of different types of wrangle nodes available. Don't let these nodes fool ya. They are all the same, except that their context is set to their respective type. So lets drop down an Attribute wrangle node and begin to learn a little about VEX.
I usually drop down the Attribute Wrangle node and then just change the context to the type I want. Most times you will find yourself working with points or prims. Detail is useful but we will discuss that here in a bit. So create an Attribute Wrangle node inside of a geometry node. This will get us set up for the next step. Variables and Attributes:. When we are working with VEX code we should start by understanding the difference between a "Local Variable" and an "Attribute".
These are two very different things so making sure we have a solid understanding is key to being successful with VEX. A local variable has a very specific format we should follow.
We always write a local variable as such. The first part of that declaration is the variable type.
By saying we want this variable to hold a float value we are saying that this variable will hold a decimal value Any number that has a decimal in it is a float value. There are a lot of types we can declare in VEX and it is pretty much the same in any programming language you might encounter.
We have the integer type which is indicated by the "int" keyword, the string type which is indicated by the "string" keyword, the vector type which is indicated by the "vector" keyword, and a few others. See the following for an explanation of what each of the types hold. There are a few more value types but we will focus on these for now and get into some of the more complex ones in a later post. We can do quite a lot with just this set of value types. The next part of a variable declaration is the variable name.
This tells the computer how to identify the value that we are declaring. It can be any name you want but without spaces or special characters. I perfer to use what is called camel case for my naming.Returns the position of the first occurrence of the needle string within the haystack string. You can limit the result to the first substring that starts at or after a start position, and at or before an end position. You can find each occurrence in a loop by setting start at each iteration to the end of the previous match.
Returns a list of positions of occurrences of the needle string within the haystack string. You can limit the results to substrings that start at or after a start position, and before an end position.
Returns the position of the first occurrence of the target value within the array. You can limit the result to the first occurrence at or after a start position, and at or before an end position. You can find each occurrence in a loop by setting start at each iteration to the next position after the previous match. Returns a list of positions of occurrences of the target value within the array. You can limit the results to occurrences at or after a start position, and before an end position. When you specify an end position, it means the matching substring must start before the end.
The scalar versions return -len haystack -1 to indicate no matches. You cannot use negative indices for the start and end arguments. Returns number of elements where an integer or string attribute has a certain value. Copies the value of a geometry attribute into a variable and returns a success flag. Interpolates the value of an attribute at a certain parametric u, v position and copies it into a variable.
Returns position derivative on a primitive at a certain parametric u, v position. Returns one of the set of unique values across all values for an int or string attribute. Returns the set of unique values across all values for an int or string attribute. Interpolates the value of an attribute at certain UV coordinates using a UV attribute.
Returns the albedo percentage of reflected light for a bsdf given the outgoing light direction. Returns an anisotropic volumetric BSDF, which can scatter light forward or backward. Returns the value of a CHOP local transform channel at the specified sample and evaluation time. Returns 1 if the edge specified by the point pair is in the group specified by the string. This function computes the intersection of the specified ray with the geometry in uv space.
Returns the linear vertex number of the next vertex sharing a point with a given vertex. Returns the linear vertex number of the previous vertex sharing a point with a given vertex.
Returns 1 if the point specified by the point number is in the group specified by the string. Returns 1 if the primitive specified by the primitive number is in the group specified by the string. Returns 1 if the vertex specified by the vertex number is in the group specified by the string.
Returns the point into which the vertex following the destination vertex of a half-edge in its primitive is wired.I know, I know. Luckily, work has kept me busy and also doing some training in Unreal and shader writing. Yet, it all comes back around to Houdini in some way or another.
The USD plugins are not installed by default. The good news is that Houdini includes the plugins with its install. The bad news is you have to compile them yourself. Digital assets allow you to turn your networks into reusable custom nodes with their own user interface. You can think of them as a preset but way more powerful.
Really more like a plugin. As a matter of fact, many of the common nodes we use everyday day are themselves HDAs. Anytime I need to modify or convert images in bulk, rename images or even move images when you render frames to the Desktop I reach for a shell. If a tool is not available, I just whip up a quick Bash script to do some work. Now, there is definitely no shortage of image modification or conversion utilities and applications.
You may have a favorite app you always reach for or you may do it the hard way of opening up that bulky image editor to do the modifications or conversions. What does this […]. Today I have the pleasure of having a few words with 3D artist extraordinaire Lucie Lescuyer. Lucie works as a game artist in Montreal, Canada. Apart from production work, she has also set up shop to sell some of her 3D assets on the Unity Asset Store.
In addition, Lucie has started creating some Houdini tutorials for those who want to learn how to use Houdini in a gaming pipeline. Recently, she participated in the Global Game Jam and along with a partner created a rather impressive game in such a short amount of time. Lucie shares a bit […]. Sometimes you come across Houdini setups that just blow your mind. I still remember seeing this setup of a baseball and thinking how in the world did they figure out how to accomplish this?
And who is this individual who posses such magic?