Particula MP3 Song by Major Lazer from the album Major Lazer Presents: Give Me Future (Music From & Inspired By the Film). Download Particula song on Gaana.com and listen Major Lazer Presents: Give Me Future (Music From & Inspired By the Film) Particula song offline. Particula is a smaller bus operator based in Zagreb, currently the companyoperates a daily line between Zagreb and Vienna, as well as a line to Munich, Augsburg and Frankfurt am Main, which operates twice a week. How to recognize a bus from Particula d.o.o? The Particula buses are white, the companies grey logo is visible on both sites of the bus. Download scene file. A similar setup as the Growing Spirals example, where we expand upon the vex code and modify some core principles. First thing you observe is that we have a loop within a loop. The noise displacement in this case is being handled outside the wrangle. Here we only take care of the rings themselves.
I was always trying to avoid vex when I first started learning Houdini, to be frank. I do have a general understanding of programming languages, but not really a strong background. After sometime, however, I realized how powerful and efficient it was. You start with the simplest things, declaring attributes or grouping points in one-liners, and you grow fond of it. Vex is extremely versatile. This guy here has barely started to scratch the surface, but nonetheless I think there’s always value on sharing knowledge.
In this page we will be compiling interesting snippets and examples. I intend to simplify them for the sake of organisation, but there are some cases where I go a little more in depth. I hope I can often provide a scene file along with the examples, though not guaranteed.
I will still often struggle translating ideas into code, but having such a page is also a personal incentive to keep practicing and learning. Therefore, any requests, questions or suggestions are more than welcome. Keep in mind this is just me sharing my personal annotations and handy setups. Also, before jumping in here are all VEX functions, it’s an open tab on my browser at any given time.
Falloff from points
Creating falloffs is useful in countless situations. The base for this snippet came from a presentation by Entagma, where they showcased a bunch of cool projects. Rebuilding setups and playing around with other people’s solutions are one of the best ways to learn. We run the code over points.
Nice thing is that particles are also points, so we can implement some sort of decay when using them as source. We simply divide a particle life attribute by its age and multiply it by the falloff (both of those attributes are created when simulating particles on a pop/dop network).
The same principle is applied to ‘activate’ particles from a grain simulation. Just as an example that multiple simple setups always end up coming together to achieve bigger and better results. Check out the scene file below for further details, but in a nutshell, after caching the first frame of the grain simulation (given that we only create points at the first frame), we create a separate particle system which spawns a few points. We then use those points to create a falloff when getting closer to the first-frame-cached points from the grain simulation. The attribute is then transferred back into the grain sim and sets the @stuck attribute to zero, basically releasing them to be influenced by forces inside the dop. In this case the color red is only mirroring the @active attribute we created, for visualisation purposes.
Download simple falloff example scene file.
Download grain particle activation scene file.
Group/delete primitives by percentage
Append a Sort SOP before this to randomize the primitive numbers. Based on a slider, a certain percentage of your incoming primitives will get either deleted or grouped. By dividing the current primitive number by the total number of prims we basically order them in a range from 0 to 1. Quite simple but really handy. Run over primitives.
A more direct approach would be to invert the order of the operations, and declare the threshold variable from within the if statement.
Densely packing circles
From a post at the odforce forums, asking how to optimally pack circles from points scattered onto a surface. First approach was to solve it in VOPs, but the VEX solution later seemed to be much more elegant. In principle, we want to evaluate each point and its closest neighbour, store half of the distance between them and define that this should be the biggest radius possible for the circle copied to it. Simple way to do it is to write it to the @pscale attribute. Run it over points.
Point clouds are really interesting. We open a cloud handle for each point, set a large enough search radius, and the max amount of points to 2 (this function always counts itself, and we only want the first found point). Import by index V, since we want the position vector of that point. That *.5 is our threshold, we can make it larger if we deliberately want the circles to intersect, for example. We can also fill up the spaces more evenly tweaking the relax parameters on the Scatter. As long as we have proper normals, this will work with any geometry. American truck simulator - oregon download free.
Say we want to add lines between points based on their distances. There are of course built-in nodes that could achieve that, such as ConnectAdjacentPieces, but depending on the situation a custom solution might be faster or even your only option. Nearpoints() stores in an integer array a list of the closest points, with the option to specify the maximum amount of points to be found. We evaluate inside a for-each loop every element of the array separately. The if condition is to avoid overlapping primitives. Great thing is that creating geometry has become easier since version 16 (maybe 16.5?). Houdini has gotten smarter and no longer requires us to explicitly add vertices beforehand. Run it over points.
Very simple snippet to emulate draping curves, making use of a parabolic function. The last line of code makes sure we snap back the two anchor points, regardless of their original position. Run it over points.
For Loop and Timeshift
The previous example allows us to freely drape any curve, which we can expand in many different ways. For example, what if we want to copy these curves repetitively and offset their drape amount slightly, plus animate the whole thing? I learned a similar trick from cgwiki, utilising Timeshift in combination with a For Loop. Here is the overall workflow for such setup:
- Have an animated piece of geometry that we want to copy and offset. In this particular case it’s a simple sin() function at the amount parameter we created at the wrangle above, taking $F (the current animation frame) as argument.
- Append a for loop, set it to fetch input, method by count and merge each iteration. Create meta import node. We can now refer to this node to access our loop information.
- We timeshift the input using the detail attribute from the meta node as argument, added to the current $F. We also transform it in some arbitrary direction right after using the same principle.
In this case we are simply using the iteration number as ‘step’ for both operations, just for the sake of simplicity. We could definitely fit the value to a new desired range, or manipulate it however we need it.
It’s good practice to declare your variables beforehand whenever you can. However, some variables being used inside a loop should be declared from within the loop, in case we might want to perform operations with i at every iteration. It depends on what we are trying to achieve. This is a nice example because it has both.
It’s easy to understand if you break it down. A clever technique is to seek for the functions that are actually ‘doing’ something, and investigate backwards where their arguments are being referenced from and what are they exactly computing. For example, in this case we are basically creating points and connecting them with a line, each with the last one; you can spot both addpoint() and addprim() really easily. The second argument for adding a point is also a function, where we set() a position vector for each iteration of our loop. You see that our angle variable is being multiplied by i, so there is definitely going to be some sort of incremental procedure happening.
The snippet above runs in detail mode, and only creates a spiraling line with some controls after promoting the channel parameters. There is a second wrangle that adds some displacement to the lines based on their position; it’s a simple anoise() function, which creates a our beloved alligator pattern. If I’m being honest, in most of the cases where I want to use any sort of noise I’ll choose VOPs over vex wrangles for the convenience and overall better control, but these functions definitely have their value in this context as well.
A similar setup as the Growing Spirals example, where we expand upon the vex code and modify some core principles. First thing you observe is that we have a loop within a loop. The noise displacement in this case is being handled outside the wrangle. Here we only take care of the rings themselves.
Particula Video Download
Scramble color between neighbors
We create an array for each of our incoming points and store their neighbors. Then iterate over them, getting their Cd’s and storing into a new array. Lastly, using the pop() function we get a random item of that same array and assign its color to our current point. I might be mistaken, but I think this does not guarantee that all colors will be exclusive due to its parallelism. The results are nice nonetheless.
Pick random from single array
To make a single array and randomize the colors all over our incoming geometry we need two wrangles. Well, at least that’s how I did it for now. This one run as detail, where we simply append all of the colors from all points into a single array.
We can then run over points and have them randomly get an item from that array and use it as their new Cd. Just like the previous example, I believe many items from our array might get repeated or simply ignored. I’ll try to investigate further, new methods that ensure all incoming colors are reused only once. Suggestions are more than welcome.
This is basically using the nearpoints() function, which might restrict it in some ways but in the other hand it should run faster than opening point clouds for checking neighbors. Here we are coloring some points red in the original geometry either manually or randomly, and growing their Cd attribute across the surface. Run it in detail mode.
To be honest this one seems overly complicated and doesn’t achieve that much, but I’ll leave it here nonetheless in case I revisit something similar in the future. It was a good vex exercise at least.
A short vex exercise. I’m always fascinated about being able to use ramps to create 3D shapes in Houdini. This is something I used to do quite a lot when I started experimenting with Rhino’s plugin Grasshopper, so I decided to give it a go in vex. Similar to the growth rings snippet, here we also wrap a for loop inside another, where each is responsible for handling the horizontal and vertical sections of our container, respectively.
Note as well the last two lines of code. We assign two attributes with setpointattrib() that later allows us to connect the points accordingly.
I think there is no need for a scene file on this one. After running the snippet in detail mode, appending an Add node (Polygons>By Group, Add by Attribute), Skin and Polyextrude is all we need.
The patterns that emerge from automatons such as Conway’s Game of Life(amazing wiki entry btw, with more in-depth explanation) have always fascinated me. I decided to give it a go in vex as an exercise. In principle, every point is a “cell” that has its neighbours check at every iteration. If specific conditions are met, the cell’s state is either set to alive or dead (populated or unpopulated, respectively). In principle:
- Any live cell with fewer than two live neighbours shall die.
- Any live cell with more than three live neighbours shall die.
- Any dead cell with exactly three live neighbours comes to life.
- Any live cell with two or three live neighbours is passed on to the next generation.
Rule number 4. can be ignored, since it’s basically byproduct from other conditions. The code below runs over points inside a solver. Let’s go through it.
Breaking it down; with the nearpoints() function we create an array for each of the cells and iterate over them. We state that if the current num (representing a neighbour cell) being evaluated is dead, we append it to a new array named dead. We also use removevalue() to make sure the array consists solely of its neighbours (exclude itself).
Next we check for the border. Life supposedly uses an infinite grid, but for practical reasons we state that border cells are simply dead, so we have our little system contained to an arbitrary size. After some research I found that this is probably the most common way of adapting it.
Then we use the dead array we created to specify the state switching of the cells. Since the maximum value of dead neighbours is 8 (remember, we are searching in a radius of 1.9, in a grid where the closest cells are 1 unit apart – vertical, horizontal and diagonal direct neighbours are taken in consideration), we only need to adapt the rules’ syntax slightly.
if(@dead0 && len(dead)>=7) corresponds to rule 1., “live cell with fewer than two live neighbours”, and so forth.
Check out the scene file below for more details. Really had some fun doing this one!
Packed geometry intrinsics
In certain situations we might need to “reset” the rotation and translation of a packed primitive or even an alembic geometry to the origin, and this vex method that uses intrinsic attributes seemed to be really efficient.
This specific technique was really useful when offsetting the noise of a shader properly while the geometry moves in 3D space. Again, I could be wrong and there is a much easier solution to this (probably), but when working with an animated alembic, I found that performing all of your operations on a static geometry at the origin and transforming it back to the original alembic position using Fetch at the object level solved the issue where the noise wouldn’t “stick” to the geometry.
The basic workflow would then be to place your packed geo at the origin with the snippet below, do whatever you need to it and on the upper level fetch its parent position. Also make sure to toggle Use Parent Transform of Fetched Object.
Compute tangent and bitangent
I noticed that sometimes when using Polyframe on a closed curve I would get weird tangents and bitangents on that geometry’s first point, so I started studying how to mimic it and fix that little issue in vex. I did the first sketch of it in vops (which really helps organizing everything), and finally migrated it to text due to a considerable faster cook time (faster than polyframe as well).
This one has a very neat trick that I really like; using modulo to procedurally get the next or previous point number. There’s also a simple check about whether its an open or closed geometry using the neighbours() function, and another check to see if the geometry is a curve or not by comparing the vertex count to the point count.
I used the SideFX’s documentation on the Polyframe node to understand how the tangent and bittangent are computed. This specific snippet is using a Two Edges computation style, which basically means their tangents are computed through the smoothed difference between a point’s position and their neighbors’, but also will vary depending whether the geometry is a closed shape, a closed curve, or an open curve.
This runs in detail mode, and requires a simple pointwrangle before it where we make sure the normal attribute is initialized (@N = @N;).
The Trapped Knight
Inspired by a Numberphile video, this small exercise was interesting to implement in vex. Since it’s an iterative process, I knew we would need a solver to make it happen.
The first part is to generate a squared spiral, and a lot of help on the topic came from this SO thread. The Vex code to accomplish it is shown below. It runs in detail mode, and creates just the points for the solver to act on.
The way I approached it was fairly simple: At every iteration of the loop we have a single point being considered as the selected one. From that point position we know that it can only move in a “L” shape, which can easily be coded as an array of coordinates, each representing the end position of an “L” shaped move (there are 8 in total).
At every step, we look up all points on those coordinates and store them inside a new array. By sorting them in increasing order, we make sure the first element of the array is the lowest possible value for the knight to visit. We then make that option the selected point instead, and mark the previous one as already visited as well, since the knight is not allowed to revisit any positions.
Take a look at the scene file for more details on how to accomplish it.
In metaphysics, particulars are defined as concrete, spatiotemporal entities as opposed to abstract entities, such as properties or numbers. There are, however, theories of abstract particulars or tropes. For example, Socrates is a particular (there's only one Socrates-the-teacher-of-Plato and one cannot make copies of him, e.g., by cloning him, without introducing new, distinct particulars). Redness, by contrast, is not a particular, because it is abstract and multiply instantiated (for example a bicycle, an apple, and a given woman's hair can all be red).In nominalist view everything is particular. Universals in each moment of time from point of view of an observer is the collection of particulars that participates it.( even a void collection ).
Sybil Wolfram writes
Particulars include only individuals of a certain kind: as a first approximation individuals with a definite place in space and time, such as persons and material objects or events, or which must be identified through such individuals, like smiles or thoughts.
Some terms are used by philosophers with a rough-and-ready idea of their meaning. This can occur if there is lack of agreement about the best definition of the term. In formulating a solution to the problem of universals, the term 'particular' can be used to describe the particular instance of redness of a certain apple as opposed to the 'universal' 'redness' (being abstract).
The term particular is also used as a modern equivalent of the Aristotelian notion of individual substance. Used in this sense, particular can mean any concrete (individual) entity, irrespective of whether it is spatial and temporal or not.
- Particular affirmative/negative
- ^Sybil Wolfram, Philosophical Logic, Routledge, London and New York, 1989, ISBN0-415-02317-3, page 55.