Cre­ate pro­ce­dural GROWTH sys­tems

Si­mon Holmedal de­tails his process for the cre­ation of the Us By Night event open­ing ti­tles

3D World - - CONTENTS - Watch the ti­tles at: www.si­mon­holmedal.com/us­bynight Author Si­mon Holmedal Si­mon has been work­ing in the mo­tion graph­ics in­dus­try for the past 8-10 years. His fo­cus has been cre­at­ing cin­e­matic films with an em­pha­sis on de­sign, us­ing VFX tools for var­i­ous

Si­mon Holmedal de­scribes his process for pro­duc­ing the open­ing ti­tles for the Us By Night event

Back in Novem­ber 2017 I di­rected and pro­duced my first ti­tle se­quence for a de­sign event in An­twerp called Us By Night. The film is one con­tin­u­ous shot of a grow­ing su­per­struc­ture that acts as a back­drop for the ti­tle cards.

I have al­ways been fas­ci­nated with pro­ce­dural work­flows so the goal was to take this to the next level. I wanted to build some­thing with de­pen­den­cies that fol­lowed a rule­set, so that it could grow it­self with­out me hav­ing to di­rect it. I had over 65 ti­tle cards that needed to be shown through­out the piece. My in­tent was to cre­ate a scrolling back­ground that con­tin­ues to build from the bot­tom up to form a big­ger struc­ture that would rep­re­sent a tro­phy of sorts for the event it­self. This shape would rep­re­sent the cre­ation and evo­lu­tion of ideas and the vis­ual style would hope­fully com­mu­ni­cate per­sonal growth. This ‘tro­phy’ would be re­vealed at the very end of the se­quence and would also act as a sign-off for the event.

I have done many growthre­lated sys­tems in the past that aimed to achieve sim­i­lar goals – gen­er­at­ing highly de­tailed ge­om­e­try on the fly in a sim­u­lated struc­ture over an ex­tended pe­riod of time with­out any cuts to the edit. One of the key hur­dles that needed to be over­come was (un­sur­pris­ingly) the in­evitable mem­ory limit, not to men­tion the strug­gle of try­ing to main­tain sur­face de­tail up close while still pre­sent­ing an in­ter­est­ing-look­ing sur­face from a dis­tance.

My strat­egy was to cre­ate a number of pre-made el­e­ments that would have their own UVS and ma­te­ri­als al­ready in place, then to build up the larger sur­face out of these as in­stanced ge­om­e­try. This way I could main­tain a high level of de­tail at any scale since I wouldn’t have to worry too much about the mem­ory limit.

01 Build­ing the el­e­ments

Since the launch of Hou­dini 16 we have been blessed with an in­sanely ca­pa­ble Boolean tool, so I de­cided to put this to the test. I started with a cube as an in­put ge­om­e­try and quickly gen­er­ated some UV co­or­di­nates on this, then scat­tered some smaller copies of the same cube onto the sur­face of it­self. I used these smaller copies to cut away chunks from the orig­i­nal cube, and I did this mul­ti­ple times with a feed­back loop.

So now we have a less reg­u­lar shape. The next step was to use this shape in an­other feed­back loop that copies a smaller ver­sion of this shape onto it­self and unions ev­ery­thing to­gether into a larger shape, over and over again. The end re­sult is a some­what com­plex sur­face that has more of an ir­reg­u­lar form, but still has the same vis­ual style as the orig­i­nal chunk we cre­ated in the first step.

The next step is to go through each prim­i­tive on this shape and shuf­fle the UV co­or­di­nates of each poly­gon to cap­ture a dif­fer­ent part of the UV tile. This is so that when we ap­ply tex­tures to this ob­ject later we won’t get any rep­e­ti­tions on how we sam­ple the tex­ture. I used a VOP for this.

02 the main Struc­ture

I de­cided that I wanted the sys­tem to grow in a very or­ganic fash­ion, to cre­ate a hyp­notic vibe where it would just seam­lessly ex­pand and evolve, sim­i­lar to how plants grow in na­ture. My in­tent was to vis­ually con­trast this be­hav­iour with a hard metal­lic/ min­eral look to cre­ate fa­mil­iar­ity but with a dark twist, mainly be­cause I’m a sucker for darker, more cin­e­matic de­signs.

First I needed to form a base shape. I started with a disc and scat­tered a few hun­dred points on it. I then ad­vected these points with a vec­tor vol­ume and traced their paths to form lines mov­ing up and away from the orig­i­nal po­si­tion on the disc. I de­cided I needed to break up the shape a bit so I scat­tered some prim­i­tives on ran­dom lo­ca­tions of these paths and some ad­di­tional points on the prim­i­tives. Then I scat­tered points on the orig­i­nal curves and merged the two point clouds to­gether.

Next I stepped through the points with a VOP net­work us­ing a point cloud lookup, ef­fec­tively find­ing the po­si­tions of the ten near­est points from any given point and con­nect­ing them with lines. I later re­sam­pled these lines to

cre­ate ad­di­tional curve points. I dis­placed these points from the orig­i­nal curve to cre­ate more of a spring or coil shape. All of this was done to break up the orig­i­nal shape formed by the ad­vected points while more or less stay­ing within the same sil­hou­ette. Once I had this struc­ture in place I remeshed it by cre­at­ing a VDB vol­ume from the points and con­vert­ing it back to poly­gons. Now we fi­nally have a base shape that we can work with.

03 cre­ate com­mu­ni­ca­tion net­work

The next step was to dis­place the shape with a Mountain SOP and tri­an­gu­late the sur­face by Polyre­duc­ing it. This does two things for us: first, we are get­ting fewer points, mak­ing it less in­tense to work with and will re­quire less mem­ory, but the poly­gons are also a more var­ied size and as­pect ra­tio.

Now we need to build a com­mu­ni­ca­tion net­work. This will be the un­der­ly­ing net­work that will in­form how each piece of the sys­tem will trans­form and scale in the end. I started by defin­ing a few source poly­gons on my shape to act as the seed for our net­work. From these points I then traced a path through the en­tire shape, con­nect­ing and branch­ing each poly­gon un­til the en­tire ob­ject was cap­tured. This was done in a vex-based sub­net­work that I later com­piled with a com­pile block. The re­sult of this is that we now have a net­work that de­scribes the path for any given part back to the source of the struc­ture. It also al­lows us to find the di­rec­tion along this path by sub­tract­ing the first and sec­ond point of each line seg­ment, ef­fec­tively cre­at­ing a vec­tor point­ing along this path.

04 Dart-throw­ing Ap­proach

We are now al­most ready to grow the en­tire sys­tem. But first we need to scat­ter a point cloud on our orig­i­nal shape. This is the ac­tual place­ment of the el­e­ments mak­ing up the sur­face. For this I used a dart-thrower tech­nique.

A dart-throw­ing ap­proach is ba­si­cally a way to pro­duce a nat­u­ral-look­ing dis­tri­bu­tion of points over a sur­face. The way

a dart-thrower works is that you start with a sur­face and you ‘throw’ a bunch of points on it, and each point gets a size (or ra­dius) as­signed to it. Then we check if any of these points were in­ter­sect­ing with nearby points. This can eas­ily be achieved with point cloud lookup in a wran­gle or a VOP. My pre­ferred method is VOPS.

We re­move in­ter­sect­ing points. Then we ‘throw’ more points onto the sur­face, this time slightly smaller points but more of them, then we check for in­ter­sect­ing points and re­move them.

A few it­er­a­tions later and we now have the sur­face filled with points, and I also did this to the vol­ume of the shape. I de­cided I wanted to add a unique ma­trix ro­ta­tion to each point as well so that it would look even more var­ied, to hide the fact that I only had a hand­ful of in­stanced min­er­als to make up the en­tire sys­tem in ad­di­tion to the size dif­fer­ence. I also ran­domly split the point cloud into four dif­fer­ent groups that would get dif­fer­ent ob­jects as­signed to them. Each ob­ject had its own shader at­tributes too.

I then cre­ated a small sys­tem to han­dle the weight­ing of the trans­for­ma­tion by walk­ing through the net­work and nor­mal­is­ing the amount of steps needed to walk from the first to the very last po­si­tion on the com­mu­ni­ca­tion net­work. By nor­mal­is­ing the range I got it down to a range be­tween 0-1 so that I could eas­ily an­i­mate later. The an­i­ma­tion is con­trolled through the net­work, giv­ing it the im­pres­sion that the en­tire shape grew from just a small seed.

05 Fi­nal touches

All that is left to do now is to do some se­ri­ous ma­trix math to fig­ure out the ori­en­ta­tion, trans­for­ma­tion and scale of ev­ery point of the point cloud.

We need to find the near­est seg­ment in the com­mu­ni­ca­tion net­work to any given point. Once we have this we just need to add up all the points in the net­work down to the seed point and ap­ply the ma­tri­ces of all the points, not for­get­ting to mask this with the weight at­tribute or there will be no an­i­ma­tion at all. The last step is to in­stance the ge­om­e­try onto the points and we are more or less done with the fold struc­ture.

This step-by-step fo­cuses on just one part of this project, but it was the hero part. I essen­tially cre­ated a joint sys­tem from scratch, rather than tak­ing a more tra­di­tional rig­ging ap­proach.

This is mainly in­tended as a win­dow into how I prob­lem-solved and came up with these so­lu­tions when cre­at­ing this piece. The one ad­vice I give you is this: stay cu­ri­ous and when faced with a com­pli­cated task, re­gard­less if it’s Hou­dini re­lated or any­thing else in life, break it down into bite-size tasks and solve them one by one. Be­fore you know it, you will have solved the en­tire prob­lem.

The rest of the film was built up us­ing var­i­ous mod­el­ling tech­niques such as Booleans and VDB vol­umes with vol­ume ad­vec­tion. Then at the very end some kit-bash­ing of baked-down sys­tems and ver­sions of this fold struc­ture to cre­ate more com­plex­ity at a dif­fer­ent scale. •

evo­lu­tion The theme for this project was the con­cept of evolv­ing ideas and per­sonal growth, de­picted by the se­quence’s ever-grow­ing in­fra­struc­ture

el­e­ment ren­der

Fold struc­ture

Base mesh – ad­vected points

Base mesh – tri­an­gu­lated

This project was ren­dered in Oc­tane, and all the post was done in Fu­sion com­posit­ing in Fu­sion

Dart-thrower ex­am­ple

Newspapers in English

Newspapers from Australia

© PressReader. All rights reserved.