Kindred Dance - Synopsis

The exploration of the rythmic nature of marine life. This piece emphasises on the interplay between marine life and their environment. Strong emphasis will be placed on light and it's reaction to the rapid movement of elements with varying surfaces. Throughout the journey, the viewer is taken from tranquility to hostility, then back again.

Kindred Dance is an ongoing project, first conceived for my Visual Effects Concepts class. Technically, my main focus in this part of the project is the dynamics and procedural animation of the schools of fish. My main tool will be Sidefx Houdini.

Timeline of Events

Class 1 March 23 Class 2 March 25
Class 3 March 30 Class 4 April 1
Class 5 April 6 Class 6 April 8
Class 7 April 13 Class 8 April 15
Class 9 April 20 Class 10 April 22
Class 11 April 27 Class 12 April 29
Class 13 May 4 Class 14 May 6
Class 15 May 11 Class 16 May 13
Class 17 May 18 Class 18 November 20
Class 19 May 25 Class 20 May 27

Class 1 March 23

For Class 1 the plan for the continuation of this poject was pitched. After that, I began researching different implementations and logics behind "steering behaviors" for autonomous characters. First of all, let me list my research resources and reference materials:

img 1 img 2
ACM Siggraph '87 Technical Paper

Inspirational footage closely resembling some of the final shots for this project:

First off, a few rudimentary steering behaviors need to be implemented on a basic particle network. These behaviors are:

Separation - Or to an extent, collision detection. Each point needs to steer to avoid crowding or colliding with the neighbours. There will be a pre-determined radius to establish how close is too close.
Alignment/Cohesion - Align and steer towards the average direction of all the particles, or towards a leader if one is assigned. Obstacle Avoidance - Avoiding specific geometry within the scene by applying a steering force that is inverse the direction of the surface normal of that geometry.
Path Following - Setting the determined path of travel in the form of a spline curve. The particles will traverse the path and implement corrective steering only when the particles begin to veer off a specific radius surrounding the path.
Wandering - A random steering implementation where one particle's specific direction of travel depends on a random offset that's added to the wander direction.

In addition to these behaviors, I may try to combine the behaviors to achieve these effects:

Crowd Path Following - This will be a combination of the Separation and Path Following behavior that will allow a group of particles to follow a predetermined path, while staying within a certain radius. Also, collision will be avoided through Separation.

<<back to top>>

 

Class 2 March 25

I've started working on the asset and have quite a few controls worked in. So far i've implemented a custom collision system in VOPs to alter the particles based on what geometry is in the scene. A ray is shot by each particle, in the direction of their velocity. If the ray hits a primitive, it takes the normal of that primitive and apply a near inverse steering force to the particle. It works somewhat. There's still a proble with particles being unable to see what is behind of them, hence colliding with objects that come up from behind.

My custom flocking system works by scanning ONLY nearby particles and averaging out the velocities of those particles. As a result, particles follow a certain direction.

I am still working on maintaining the explicit travel path defined by my curve. Currently, 10% of the particles eventually stray away from their path. After they avoid a collision objec 40% of them stray. I will post screenshots here shortly.

<<back to top>>

 

Class 3 March 30

Here are the screenshots for the collision system. As described earlier, it is a barebones collisons system that works by applying steering correction based on the normal of a nearby geometry.

<<back to top>>

 

Class 4 April 1

Currently, a bit of tweaking needs to be done for the flocking system so that it works smoothly with the collision based system I have set up in VOPs. Here is the current flocking system:

<<back to top>>

 

Class 5 April 6

Well I can say the swarm asset is pretty much done and currently has all the controls necessary to re-create a fairly stable school of fish. There are ALOT of parameters, to the point where the amount of fine-tuning necessary makes it hard to control. The last set of controls I added were controls to implement fish geometry. You can choose a Geometry file from disk, and also adjust the global scale of the fish. I've also allowed fine control over the wave-like swimming motion of the fish. In the asset, the speed of the fish swimming motion is also linked to the acceleration which is dependent of the "normal force" of the curve. This add more believability to the behavior of the swarm.

First swim test with a low-poly model. This salmon, as well as all the other models used in this project will be done by Tanji Dion James. Here, no bones are used. I am just deforming my geomety based on the deformation of the original curve. All points on the geometry within a certain radius of the original curve will be deformed.

First official test of the swarm was fairly successful. Here, you can clearly see the variation of swimming speed and how it correlates with the wave-like oscillations that pushes the fishes foward. There are geometry penetrations at the start of the sim, but that can be easily dealt with through asset controls. I am feeling fairly confident that I can begin directing a shot with this asset. I will be giving it a try.

<<back to top>>

Class 6 April 8

I've been so behind in posting these updates. I have been still working on the asset though, and building up the first shot that I'm going to attempt. This shot, incidentally, is also the most difficult. There should be a seal in this shot and in this test, I use spheres as temporary rough guides to show where the seal will go through. This test shows two swarms.

<<back to top>>

Class 7 April 13

This is a rough draft of what I call the "seal shot". The seal has already been modeled by Tanji James, who will also be animating it. Here is the unrefined motions of the school of fish.

<<back to top>>

Class 9 April 20

I've spent the entire weekend rigging the Seal in houdini, as well as painting the appropriate weights. It's a pretty basic rig, considering that it's my first rig ever. Throughout this week, I will be working on beginning some render test on the very first shot. By the end of the upcoming weekend, hopefully, I'll have a shot finally rendered! I will make updates on my workflow for the upcoming shots shortly.

Seal Rig Seal Rig Weights

Class 10 April 22

Because of a lack of information online, I think that I need to mention a bit of an issue I had with the rig in houdini. After passing it on to my animator and getting them up to speed with animating in Houdini, it came to our attention that I did not implement reverse rotations on the last two bones on the seal's spine. Reverse rotations would make it easier for the animator to achieve certain movements on the lower parts of the seal's body with much ease. Basically, to give my animator this functionality, I had to replace two bones on the spine of the seal with two new bones with reverse orientation. It turns out that I can replace the bones, but the capturelayerpaint node will always reference the old bones internally. Turns out that the reference to the old bones are stored in an internal "detail" attribute called pCaptPath. Using an AttribStringEdit node however, you can replace all references to the old bones and replace it with the name of the new bones:

In the Attributes tab, be sure to choose "detail" for attribute type and enter PCaptPath. Then in the Editor tab, enter the information to change bones references. In this case I want to switch all instances of "chain_bone1/cregion 0" to "chain_bone16/cregion 0".

After this node I would append a "capturecorrect" node to correct any outdated capture regions. The rig should reference the new bones after that, without you having to repaint weights. The rig will work, but once you close and re-open the .hip file, you would get a wierd event happen where the bones are all back to their original location, while the model that should be attached to the bones is where you last posed it. This seemed to be essentially a cooking issue where the "capturecorrect" node is not getting all the necceary data to produce the correct results. To fix it, I needed a brand new capturelayerpaint node, with correct references to only the bones i'm currently using AND all my painted weights still intact. To make a long story short, here is the network:


I disconnected all my nodes from the seal geometry and re-captured my geometry using the shelf tools. This essentially gave me brand new capture, capturelayerpaint, and deform nodes. I would then transfer attributes from my old capture nodes to the new ones. I would transfer specifically these attributes:

Only when your old attributes are transferred to a new capturelayerpaint node would your new bones work for good. If any questions feel free to email me about this technique, capture attributes or houdini rigging in general.

<<back to top>>

Class 11 April 27

So I have the first animation test done. Based on this test, it turns out that we'll be able to get animations on the seal done faster than expected, leaving more time for implementing the fishes and lighting. Using curves to define the explicit path the seal is going to take removes loads of work from the hands of the animator and gives her more time to focus on the more subtle movements of the seal:

I've begun lighting tests on the intro shot using elements from a lighting rig I developed for the first phase of kindred dance. Hopefully this will save me some time. My aim is to try to finish this shot by the time the seal animation is finalized:

<<back to top>>

Class 12 April 29

The lighting for the intro shot, which also contains the most amount of frames, is just about done. The only significant change i'm going to make to this shot before I start rendering out in HD is to add more fishes, so the circular pattern is more dense. Because of time constraints, I haven't done written any shaders for this project yet. I may or may not do some shader development, depending on my results with the houdini shaders.

I'm almost ready to start blocking out lighting for this shot. The seal animation is also not completely finalized yet, but it is pretty close. For this shot, I think I may settle for one single but large swarm trying to evade the seal. So I may just add more fishes to the current swarm. I'll maybe try to supress the chaotic movements of the fish at the end if time permits. Currently, this is the next major shot I need to really work on once I get the above one ready to render.

<<back to top>>

Class 14 May 6

Finally the main seal animation has been finalized. I have also tweaked the swams that I would be including in this shot, and increased the amount of fishes to around 7000. Will be working on lighting over the weekend.

<<back to top>>

Class 15 May 11

Here is my first lighting test for this shot. My priority list of issues to work on include adding a bit more specularity and ripples to the ocean surface, tweaking the specularity for the fishes, and adding minuta (particles) to the ocean in an attempt to break up the empty space a little bit.

<<back to top>>

Class 20 May 27

Wow, I failed epicly at updating this blog. I have however been working on this project and the second sequence is done. The result is a highly flexible flocking system and two new underwater shots added to the first sequence of Kindred Dance. Although currently still in an incomplete state, the project was voted as Best Individual Project by SCAD's Visual Effects Department. I may continue working on it depending on how I feel after two weeks of taking a break from 3d. For now, here is Kindred Dance!


<<back to top>>