Environmental VFX

Week 1 – Introduction to the tools

For our first week we went back to the basics of Houdini and experimented with adding colour to meshes.

For the first one we added colour to particular points on the box, because the points don’t hold shape data Houdini calculates a median surface to apply the colour too, giving this faded look

Alternatively we can also apply the colour to primitives (faces)

These node graphs show how each colour was applied, by specifying points or primitives in the colour parameters

The next thing we experimented with was adding colour procedurally using a group node and a bounding box.

Firstly we made a group which I called “grey faces” we applied a bounding box to it which means that it operations made to the group will only appear within that area. From here I then specified the height/area of the box added the grey colour to it. Now that I have a group that is being manipulated I can also add other nodes such as a transform node allowing me to move just those faces collected in the group node which is what I have done above.

Individually I decided to also experiment with adding a yellow colour to specific faces. This ended up being very easy as I just used the face selection mode to select faces and entered that data into the colour node to tell it what primitives it should affect.

Overall these exercises really helped in getting me accustomed to Houdini again and it’s improved my confidence in the software

Making cheeseboard

Our first little project was to make some cheese on a cheeseboard.

Here we defined the cheeseboard. We used an expression for the centre of the depth of the cheeseboard so that if the thickness needed to be changed the board would still be positioned in line with the grid (and cheese location)

Here we added a texture to the board

Next we started working on the cheese and making the holes. First we scattered some points on the rectangle that we made for the cheese and then used a “copy to points” node to add spheres to the location of the points

We then used an “attribute randomise” node to randomise the size of the holes, using the “pscale” attribute

After that it was time to use a boolean operation to extract the hokes from the cheese.

In order to improve the realism of our creation we converted our cheese block into a volume using a VDB from polygons node, this allowed for spheres to be created inside the block rather than just on the outside surface.

This is the final outcome of my block of cheese for finishing touches we converted our cheese in and out of a volume again to round the edges slightly, in between this we also added a “vdb smooth” node and I added a yellow colour.

This was a good exercise to get back into modelling in Houdini and using the interface, I learnt a lot and can definitely see how transferable these techniques are

Puzzles

To finish the lesson we were set some puzzles where we had to rearrange/ connect the nodes in the right order to achieve a particular result, these are the couple I accomplished. I enjoyed the challenge of these however I did get stuck more than I would have liked

At home skills check

To test what I had learned I decided to try and make a crumpet as it was something similar to the cheese exercise that I thought would reinstate what I had learned in class

Week 2

This we week worked on an activity of making a line of dominoes that fell down

Here we used the Bézier curve tool to create curves on the plane in top view. This is where the dominoes would sit

Here we created a box to represent a single domino

Copying the domino to the points on the curve

Resampling the curve to give the dominos accurate spacing

Changing the length of the resampling node so that the dominos will touch when they fall therefore creating the desired effect

Displaying tangent property of the resample node in the viewport

Renaming the tangent attribute to “v” so that the resample nodes reads it as velocity so that all the dominos face the right direction according to their placement along the curve

Node graph for the project

Here is a first rendered result of the simulation

Here is a modified result where I added colour to the dominos and made the scene a little more aesthetic

Next we repeated this process however this time we used some stepped geometry to map the dominos to using a ray node

We made the path for the dominos above the geometry and then the ray node projected that path onto the geometry from above.

This is a result. Unfortunately we could not get this simulation perfected however this example shows some of the stages to achieve this effect

Lego Bricks

Th next exercise was to make lego bricks.

For this we modelled one brick duplicated it over a grid. Copied the grid with an offset and transform and then copied both of those layers on top for any desired number of times.

The stack of bricks

We then added in some pre-made geometry and isolated the points of the grid of bricks that it came into contact with. This meant we could show only these bricks therefore making it appear the object was made out of lego

To improve the results we made the bricks smaller and more compact. I also changed the colouring so that it would only use certain colours throughout the piece and tweaked the frequency a little

Adding specific colours

Full node graph

Final result

Work at home to reinforce learning

At home this week I decided to try and make my own version of the dominos exercise

Node graph for at home dominos project

Week 3 – Oceans and destruction

Making an ocean sim and adding scattered ducks/geometry that move with the surface of the water

We started the lesson by learning how to simulate oceans by exploring the “oceanspecturm” and “oceanevaluate” nodes. These allow us to make realistic ocean simulations that are highly customisable.

Our next step was to add points to the surface that we could copy our ducks to

Here is the final node graph for the project. Essentially to get the points to accurately move the ocean sim, we had to freeze the first frame and then project the ducks to the points based on the points’ normals, the point deform then calculates where to move/orientate the points for each subsequent frame

Final node graph for the ducks

We then randomised the “up” value which were the ducks orientation on the x and z axises meaning all the ducks would look in different direction

Node graph for the ocean

As seen here we made two different versions of the sea, one will less geometry that would run the simulation more effeciently and a more highly detailed that would run out. This saved system memory and time while achieving the same result.

 

Building a brick wall that will be destroyed

Our next exercise was building a brick wall. For this we used a trick we have learnt in week 2 where we used multiple copy and transform to get a customisable wall that can be added to or reduced at any point in the project

Nodes and result of building the wall

Full node graph for the exercise

This is the first render of the excersise where each brick was its own entity so they all fell individually.

This is not particularly realistic as brick walls in real life are glued together therefore we experimented with adding constraints.

This was my first result with constraints which worked but they were only sticking together horizontally so the result was still not ideal

This last experiment was doing the sim when the bottom row of bricks was glued/constrained to stay on the bottom of the ground plane, thus meaning they didn’t crumble like the rest of the scene. With these parameters I struggled to get the velocity to work in the same way so the balls motion is not ideal.

I then decided to try and neaten the node graph a little and make the sphere it’s own object/geometry node so I did that and just used an object merge to add it in to the solver again. This made more sense in my head in terms of navigating the file. Especially with it being a non destructive workflow

Inside the sphere geometry node

The main node graph

Week 4 – Introduction to vellum

This week we looked at creating cloth simulations with Vellum

This was our basic node graph where we remeshed a grid (to make better geometry for the cloth), had a sphere as the object the cloth would adhere to. The simulation is all handled by the vellum solver

This is one of my first simulations.

Making this more complex

To make this more complex we added pinned sections using groups and bounding boxes to select the points we wanted to stay in place. In this scene we decided to make a hammock type setup where two parallel sides are pinned

We also added tearing to the cloth by breaking the geometry, then stitching it back together but making those binds breakable. We did this using a noise node.

Additionally we added some more geometry to make some balls fall onto the cloth and break it

Node graph for the cloth including tearing and pinned sections

The same node graph with additional asset of the tube and balls that drop and tear the cloth

A render of the balls tearing the cloth with pinned sections of the cloth fighting the weight

Cloth falling on crates

For this project we were supplied assets and materials for some crates and we made a project where the cloth would fall over them in a relatively natural way

Our first step was to make the crates fall

To do this we copied the cases to scattered points on a sphere.

Cases scattered on points of a sphere

This is the result of the falling cases

The node graph when the cloth (grid) simulation is added in

This is the result of the cloth falling on the crates.

I enjoyed these activities as I had been curious about cloth sims in Houdini however I do need to get more practice before I feel confident in recreating it

Week 5 – Making a plate, some noodles and a sauce simulation

This week we delved into a project of making a scene when noodles fall onto a plate and the sauce on them transfers from the noodles to the plate.

Creating the plate and giving it a UV map to texture

Using colour groups looking at the normals to select the “top” and “bottom” of the plate so that we could texture it accurately

Texturing the plate

This is a screenshot of all the geometry nodes used in the project. It shows how we segregated the piece up into different node charts

This is a lot inside the stage view where we can see how Karma will render the object. Here we have to import the objects and add materials to them (inside material libraries) as well as lights and cameras to render

This is the stage view with all our objects in the scene, each with their own material libraries

This is a comp of the initial simulation of the noodles landing on the plate

Full node graph for noodles

This is the full node graph for the noodles. We made a circle of lines using copy to points. Randomised the normals slightly to make them slightly different rotationally. We then put them in a solver to collide with the plate. The last few nodes focus on the look of the noodles and adding the sauce attribute

Inside the noodle sauce geometry group

In the noodle sauce geometry tree we imported the output of the plate and noodle trees and plug them into a solver that is detailed below

Inside the noodle sauce solver

Inside the noodle sauce solver we transferred the sauce attribute from the noodles (input 2) onto the previous frame of the plate

This is the result of the simulation.

There was a lot to learn here and I would like to revisit it to make sure I understand it fully but I think I got a lot of transferrable knowledge from this exercise

Week 6 – Working on wind and sail collision

This week we build a project where a windmill would spin and a furnace next to is smoking and the smoke affects the sails of the windmill

This is how we built the sails for the windmill

The final result of the windmill model

The nodes for the windmill creation

A video of the windmill with animation

The furnace model

The node graph for the furnace

A video of the smoke sim interacting with the furnace

Left: The node graph for the smoke sim, right: the smoke sim solver which adds the furnace as a collider

A video of the final sim result

This node graph shows how we split up the sails into the different elements needed

  • The sails put into a sim to make them act as cloth
  • The parts of the windmill model that were unaffected by cloth
  • The sails collider to use in the smoke sim to make sure those two are interacting properly

These are all the objects we had in the scene to make the sim

Week 7 – Destroying various materials

In this weeks lesson we used a default character and animation and built some walls for them to smash through.

These walls/obstacles were made of different materials so we could learn how they all worked and how they functioned differently

Firstly we started with a glass panel

This is the glass panel and how the fracturing looks for this material type. Here you can also see the node graph used to make this

After setting up the glass panel we wanted to modify the simulation so that the bottom fragments of glass would stay pinned to the floor as this is what would happen if the pane were in a window or doorway.

To do this we selected the bottom points grew the selection to select the lower fragments and then set these to be inactive (we made an active attribute assigned 1 to everything by default and then made these points 0). This meant they would not be included in the simulation

This screenshot shows the active and inactive points of the glass

This is a video of the sim. We temporarily deleted the majority of the characters geometry just so that the sim would run faster and more efficiently whilst we were working on it

Next we added some wooden poles as an obstacles for the character and this is a video showing the result of that

Here are all the node trees. Initially we set up multiple solvers for each sim however we learnt how to use “packing” and “unpacking” in order to combine both simulations into one solver

Here is a close up of the wood sim and the nodes for it. It’s a very similar set up to the glass including pinning the lower points of the geometry

Something we did have to do so that the sims would run independently is to make sure that the “enforce unique name attribute per instance” was ticked within the red unpack node. This meant that the data for each sim would be read seperately

The last obstacle we added was a concrete block that the character would smash. This was still using and rbd material fracture just with another setting, this time we didn’t need to pin down the lower geometry points as the block was already on the floor and being smashed from above

We also learnt how to make the character themselves crumble at a specific time. To do this we added a time shift node, simulated them falling/crumbling and then used a switch to say after this specific frame, please crumble the character

The nodes for making the character crumble at a specific time

Full node graph for all of the simulations

All of the geometry nodes, one for the character and one for the sim

This is inside the character geometry node. We had to unpack the character so that we had more data points to work with for our simulations

Week 8 – Using tracked camera data and adding an asset and effects

This week we looked at adding a truck to a piece of live action footage and adding smoke to the tyres

This is the node graph to add in the truck. We added the truck object and also a path for the truck to follow through the footage

Here is the animation graph for the truck. Here we can make sure the truck stays on the screen. Additionally for as the truck stops we changed the animation type to match so that the velocity evens out as the truck slows down (similar to easing in and out)

truck_anim

truck_anim_with_curve

Here are some links to videos that show the progression of this piece

The is the result of adding a show to the truck

This is a look at how the shadow material can be made

Adding the smoke

Here we made a null section off the truck so that we could add those pieces as smoke emitters

This is how we fed the lower pieces of the truck into the smoke simulation. We had to use a poly fill node here too as the simulation scatters points a lot more accurately on enclosed meshes

Here is a screenshot of the smoke emitting from the tires

truck_with_smoke

Here is a video of the smoke simulation added

Doing a Maya test

Thinking about my final project for this module. I took some time to test out moving assets from Maya and moving them in to Houdini so I tried out making a glass pane in Maya and shattering it in Houdini

I made a very simple rectangle for the glass and an animated sphere as the collider and got those to collide as expected which I was pleased about

The two pieces of geometry which I used in my scene

The rectangle I exported from Maya

A test glass fracture simualtion

The node graph for the sim

Week 9 – Making a procedurally modelled building

This week we learnt how to make a procedural model of a building in Houdini

To set this up we learnt how to make a control node that has all of the parameters for the different aspects of the building. This is made by adding parameters to a null that we can define the values ourselves.

We then use these relative references as we make the different components so that we can change these values whenever we want to

The menu for how to set up the controller node. Adding in floats and integers depending on what attributes we need to control

Here we were building the floor plan. We put a switch down here so that we could have two options for the layout of the building

The other floor layout that was part of the switch

Screenshot off further through the process where we have made the floor columns and walls

Here is the node graph for that part of my progress. Here you can see how we made each aspect as they are separated into their separate trees

Video of the procedural model completed

This is a video of the completed procedural building model in practice

 

Learning how to add materials to imported FBX models

Something I had been struggling with at home was how to assign materials to imported FBX files from Maya/Substance as I am beginning to work on my final project and had been stuck on this.

It was explained and after that I decided to make a cube with materials as a test to complete in the lesson so that I could test out the workflow and get more support if I needed it

Importing the cube mesh

Adding the mesh and a material library into the stage module for Karma

The materials in the material library

Inside a material. This is where I add in the images from substance and plug them into the relevant shader properties

This is where we plug in where Houdini can find the material and then where to place the material on the mesh

This is the result. This simple experiment worked and I can now see the imported texture on my model in Houdini

I was very grateful for this explanation and that it worked out and I look forward to being able to take this workflow forward into my own final project.

Week 10

This week we created a flamethrower sim.

We started of making a particle simulation to generate where the fire emits from

These videos show the progress of the particle system.

This was the initial pass

With this one we added noise so that the flame would jitter and also expand and constrict slightly. Just to add more movement to the flame

This is a look at the fire applied to the particle sim

This is the node graph for making the particle sim and adding the fire sim on top

This is the same script but more organised and readable with the different processes sectioned out

This is how we moved the sim to karma to prepare it for rendering

Here I am highlighting the pyrobakevolume node which allows the fire sim to be rendered and gives us a lot of options for controlling density, temperature and smoke

This is a look at the sim in the stage context, rendered with Karma

This is a single frame from the final sim

Week 11 – Making a rain simulation

This week we learnt how to make a rain simulation with secondary splashes from the raindrops and rippling water

This is a video of the rippling

This is a video of the rain particle sim and the ripples

Week 12 – Working on final project

the idea for my final project piece was to focus on one building that was being destroyed during a blast of Godzilla destruction. In my mind there are building surrounding mine however I didn’t have time to generate those.

Therefore my simulation is off my one building being impacted. First by the wind of the explosion, secondly by rocks/debris hitting the glass panels from another buildings destruction and lastly by Godzilla trampling it from above.

I kept the camera angle quite tight as to focus on the sims butI could have extended this to include more context

Reason for separating the sims

When creating the sims I had trouble with them not overwriting one another so I had to make them quite separate in order for them to render the way that I wanted them to. This doesn’t give the best result as the hanging sign and window glass stay rigid during the building collapse which in reality wouldn’t happen however within the time frame I couldn’t figure out a way to have them be involved in two simulations following on from one another.

This is also the reason why I have struggled to make renders of the individual sims, having completed the third and having to render the scene pre and post building collapse and comp it together I am struggling to find a way to make individual sim videos

Final output

Making of

Modelling the building in Blender

Texturing the building in Substance painter

The view of the completed obj elements. Showing all the components of the scene

The node graph for importing the building file

The node tree for the hanging sign vellum simulation as it blows in the wind

Creating the rocks for the glass smash simulation and using transform nodes to animate them

Glass sim node graph, using rocks as a collider

This is the node graph for the building simulation, I used a switch node here so that the building would stay stationary until frame 48 which is when the other simulations are mostly completed

This is an image of the stage context for this project. I had a lot of materials to assign to geometry. Additionally I found that I had to reassign the materials for the building, depending on whether a simulation is running on it or not, therefore I had two different sets of materials that I had to apply depending on whether the sim was running (I based this on frame range rendering the scene out twice)