Website powered by

Houdini: Using Python to Use Cumulative Sum

Making Of / 09 September 2019

Hip file is here;

In this article I explain what I've done to make Cumulative Sum using Python in Houdini.

What is a cumulative sum?

According to Wolfram Mathworld,

cumulative sum is A cumulative sum is a sequence of partial sums of a given sequence. 

Let's say you have a list like {1.2, 3.2, 0.6, 1.5, 7.5}, Then you want to get a list of its cumulative sum {1.2, 4.4, 5.0, 6.5, 14.0}.

So, how do I recreate in Houdini?
As usual I tried in VEX first. But unfortunately the consequence isn't what I expected.
And this led me to trying in Python SOP. 

What I was trying to do is that placing randomly selected shapes(see images below) next to each other.

And the result is below;

Randomly Selected Shapes

First of all, I created 3 basic shapes and connected them to switch node so one of them are randomly selected.

In switch SOP node, I put an expression below;


ch("../seed/seed") is a null SOP node I created.

Copy to Point

Next, I added a point by using add SOP node. The position the point is set to {0,0,0} which is the center of the world position.
Then copy the randomly selected shapes to the point inside the foreach SOP node.

At this point I had  several shapes but with uniform scale.

Random scale and get each length

I created another foreach SOP to make each shapes randomized scale, and get each length.

To get the length I did a math in VEX;

And the result is below;

Get cumulative sum in Python

At attribute wrangle4, I added a new attribute that slide "length" attribute one step.
I called them "lastLength".

From now it's python time.
I wrote comments for each function to understand what I've done in each of them. 

And the result is below;
As you see, a new attribute called "Accum" was added.
This is the one doing cumulative sum.

Then there is another foreach loop.
Inside it, I transfer Accum attribute from primitive attribute to point attribute.
And in VEX, each shapes are moved their position so each of them are next each other.  


What can it be used for?

I did this to make procedural frame for paintings;
But this system can be used for various things which I want to find out from now on.

You can get the hip file here;