Experiments with Procedural Modeling
Events
Subscribe:  iCal  |  Google Calendar
1, Jul — 1, Aug
San Diego US   19, Jul — 23, Jul
Torino IT   25, Jul — 29, Jul
Shanghai CN   3, Aug — 7, Aug
Vancouver CA   12, Aug — 17, Aug
Latest comments

Um....holodeck anyone?. This is exciting stuff!

by Do My Programming Language Homework
1 hours ago

I Loved The Way You Discuss The Topic Great Work Thanks For The Share. https://www.progassignments.com

Why not? I'm a programmer by heart and I'd rather spend few days making solution which will turn hours of mundane work into minutes where you can actually focus on task at hand.

Experiments with Procedural Modeling
12 February, 2018
VFX

Paweł Rutkowski did a cool breakdown of his amazing scene, which was created with the help of Houdini software. 

Introduction

Hello everyone! It’s Paweł Rutkowski here once again. Last time I was writing about destruction process of one of my animations and tricks that can help you with creating better destruction effects in Houdini.

This time I have pleasure to present you my newest personal projects „The First Wave”. In this project I was focused not only on destructions and pyro effects (which was esential part) but also on other aspects like managing whole process of creating final scene, and creating story full of pressure and fear.

I used a lot of various techniques that helped me obtain planned results and move through this process in most efficient way, so I would like to share with you some of them.

I also recorded this breakdown video, which shows structure of project file and overall concepts of workflow.

Procedural Modeling

Is it necessary to create models procedurally? When creating animation that needs different looking objects of this same type (house and fence models in this case), creating them procedurally comes out to be the best option. Preparing asset in this way can take a little bit longer and is more engaging but at the end when you have to create tens variations of this object, it is only matter of minutes at tweaking sliders. So the answer is simple, the more procedural you objects are, the faster and more flexible workflow you get.

The assumption of creating whole neighbourhood is to have a lot of objects, among others fences, so it needs to be fast in creation and easy to tweak later on. Let’s take a closer look at this asset creation.

First of all it is good to consider all functions that you want asset to grant, that depend how much control will you need over model later on. The most popular way of placing objects like this is coping them onto a curve, especially when creating assets for game engines. So in Houdini, we can create temporary curve that will be replaced with target one later. Below is basic idea behind creating this model, of course it still needs improvements to avoid intersections and make it more destruction ready. Final version of this asset is available to download on my website.

Instancing plants

Placing all models as separate geometry would be inefficient and make impossible to work in viewport. So here instances comes with help. Thanks instances it is possible to replicate one geometry as many times as it is needed, with no consumption of extra memory. Process behind creating instances is very intuitive for all Houdini users with basic knowledge of attributes.

Here I have bush and using instances replicated them on curves points, but to provide better interaction with environment, I want this bushes to shake a little bit after explosion. To get this effect only on plants that are closest to the house I separated them on to groups, in radius of 20 meters and farther, after this using bend SOP I created movement of the bush. To match theirs bending to direction that shockwave comes from it is necessary to create normals on instances points that are pointing to origin on explosion. Here is VOP network that shows how I achieve this normals direction ( with a little bit of noise to make it not perfect every time). Instances points also have pscale attribute to randomize plants sizes.

Instancing grass

For lawn I also used instances of single grass blade. There was about 8 million points with various normals direction and pscale attribute. That made scene a little bit heavy and slow also for rendering (generating geometry process take Arnold few extra seconds for every frame).

To better optimize scene I decided to delete instances points that are not in camera field of view for actual frame. That reduced number of instances to about 2 million in peak. I achieved this by creating cone that represented camera field of view and remove all points that are outside this cone. As you can on screen below cone has limited length, so to avoid sharp edge at the end of the grass I scale down blades to zero between 50 and 70 meters from camera.

Render queues

When dealing with lot of passes that needs different render settings or using different lights and objects, it is really handy to create queue inside ROP Network. It simply achieved by connect all render nodes with merge. They will be rendered in order from left to right and from top to down. Queue is activated by last merge node, and it allows to choose order of rendering. „Frame by frame” will render first frame of every node and then start to render second frames, „Node by node” will render all frames of first connected node and then go to next one.

Project organization

Good organization of project file can also significantly speed up your workflow. It is good to figure out your own system of naming and caching files or coloring and grouping nodes, which you will use in everyday work. Of course studios have their own workflows which is first thing you learn when starting new job, but freelancers or even students should also have their own ways to organise projects. Here is few suggestions from me how to keep project file clean and transparent:

– Set different colors for different types of operators, for example (orange – output with geometry, green – output with constraints, purple – output with volumes etc.)

– Mark with color all nodes where you are using keyframes to find them quickly anytime

– Divide your networks using „network boxes” to smaller parts and give them names, for example (fracturing, constraints, RBD sim, debris sim, etc.)

– Name your output nodes or those that you referring to with capitals to make them appear on top of the node list in browser

– Use sticky notes or comment section in node info panel, since H16 comments can be also visible in network without entering into info panel every time

– Try to avoid $F in file names, instead use $F3 or $F4. It is not very big difference but when you working with other artists, it is safer to name files this way.

Time Costs

Despite the use of all of these optimization techniques, whole process still took a lot of time. From building assets and placing them into scene, through dynamic simulations, lighting and shader design to rendering and compositing, it took more then 2 months (only rendering took about 250 hours). Conclusion after working on project like this is simple, it doesn’t matter how good your project is optimize, to create something even more complicated it is needed to use external computing force or condemned yourself on staring at endless progress bar. There is no escape from this, some things just need time to compute, that’s charm of 3D. I am sure next time I take challenge of creating such big scale project on my own, I will use services of farm for simulation and rendering.

Paweł Rutkowski, Freelancer – Houdini VFX Artist.

Interview conducted by Kirill Tokarev.

Comments

Leave a Reply

1 Comment on "Experiments with Procedural Modeling"

avatar
Anton
Guest
Anton

Thanks for the article, it’s great.
I’ve just downloaded the fence generator and looked through it.
I found out that instead of using this vex code in the attribwrangle2 in the for-each loop:

vector min, max;
getbbox(0,min,max);
float cex = (max.x + min.x) * 0.5;
float cey = (max.y + min.y) * 0.5;
float cez= (max.z + min.z) * 0.5;
vector centroid = set(cex, cey, cez);
removepoint(0,@ptnum);
addpoint(0,centroid);

it’s possible to use just this one (but run on primitive):

addpoint(0, @P);
removeprim(0, @primnum, 1);

Thus, you don’t need the next Fuse3 node.
It gives the same result but just a bit less coding and nodes :).

wpDiscuz