Nathan Koch

Procedural Systems: Week 3

Tuesday, June 19th 2018

Sketch 1: Porting strategies challenge #1 to Houdini VEX

I took the original p5.js code for challenge #1 (replicate a collection of circles of different colors on-screen) and ported it to Houdini. Some concepts translate well, others are more complex. Because each Attribute Wrangle needs a context (one piece of geometry, all points, all primitives, etc) I needed to seperate the work of creation from any downstream modifications of point positions, colors, or sizes.

Sketch 1

Sketch 2: Solving challenge #1 in Houdini VEX

Through analyzing the original sketch, my guesses were that the original circle colors used a weighted random (which I simulated with a Color Ramp parameter in Houdini) and that circle positions were based not on random values but on noise - it felt more controlled than a random distribution would create. Sketch 2

Sketch 3: Porting strategies challenge #2 to Houdini VEX

This sketch was easier because I already had some context in placing and moving points programmatically in Houdini. Again, I seperated the code into two Wrangles - the first created the points according to "Start location" and "End location" parameters, and the second randomly offset those points on each frame. Sketch 3

Sketch 4: Solving challenge #2 in Houdini VEX

My increasing familiarity with VEX and Houdini paradigms allowed me to focus on solving the underlying problems. I was able to really dial in the parameters to create a close match to what I saw on the comp form site. The animation shows an example of moving through the noise parameter space.

With a clearer understanding of what belongs in what node, I was able to write terser wrangles and clearly break apart point creation and point animation in this sketch.

Sketch 4

In order to reflect the parameters available on the original sketch, I broke out noise offet, frequency, speed, and amplitude in the animation wrangle.

Sketch 5: Noise culling

The strategies section exposed me to some techniques I had never used before, one of which was noise culling. I parameterized the threshold and then keyframed it in Houdini to demonstrate increasing the threshold over time. This technique seems tailor made for procedural map making.

Sketch 5

Sketch 6: Noise displacement

Noise displacement was a technique I've used, but without a lot of real understanding what is going on "under the hood" - I created a sketch displacing a grid of circles on the x and y axes. This is a powerful technique when used with subtlety and it is one I'll return to.

Sketch 6

I seeded this sketch with a mix of values derived from geometry and time , in order to make it animate in a compelling way.

Sketch 7: Relaxation displacement

I wrote a relaxation displacement algorithm that iterates through a collection of one thousand randomly placed points, and then pushes or pulls the points closer together or further apart based on its relationship to a minimum and maximum threshold.

Sketch 7

My first attempt at this used a naive algorithm combined with a slow, single-threaded approach to iterating through all the points. Coming back to this sketch, I used some common Houdini abstractions like a a For Loop combined with running the attribute wrangle in "Points Mode" – meaning it iterated over all of the points by default.

Sketch 7 screenshot

Week 3 code

Code for this week's Procedural Systems sketches is available on GitHub