Pages

Tuesday, July 31, 2012

Jellyfish update!

Reference

Render test

!
Test for the random motion paths

Did the jellyfish's shading for the most of today and finally managed to get closer to the translucent look I wanted. Charles also came by today for the weekly mentor meeting gave me some tips on optimising the background jellyfish.

Monday, July 30, 2012

Sunday, July 29, 2012

Weekends!

Grill at Steven's and Shih Peng's house yesterday! They also brought us to San Gabriel Valley, with a mainly Asian population, for lunch today! The food was awesome! After that, we went to Cosco to do some grocery shopping. Cosco is kind of like a huge warehouse type supermarket and they sell almost everything, even fuel.

Annnd I seem to have invented a new flavour of bubble tea (they call it boba tea here): Plum and peppermint :D



Welcome to.. California?

Friday, July 27, 2012

Model Update

Created the oral arms of the jellyfish using noise and twist after hours of trial and error.

Sine to create the wavy patterns, aanoise to make the curves non-uniform. Another layer of aanoise is used to displace the points three dimensionally. Without this, the arms look pretty flat. Also, since this VOP SOP is after the wire sim, the point position changes every frame and the noise would swim. To solve this, I did a time shift, locking the oral arm on the first frame and referencing it into the VOP SOP. This way, the noise would "stick" to the geometry as it moves.

Mr Daniel and Mr Albert dropped by the office to see us today!

Thursday, July 26, 2012

Modeling Update for the Jellyfish

Managed to model the oral arms of the jellyfish, not that great, but progress nonetheless. Also passed them into my wire sim, apparently if a surface is passed in, the wire solver will treat each edge as a wire. Due to this, my simulation is slowed down by a LOT. I'll have to find a way to use the back bone to run through the simulation before using a wire deform to transfer the data to the high resolution geometry.

Also found a way to have the jellyfish move along a curve (using the carve) at a preset speed, no matter the length of the curve. I needed this because I have an expression which animates the jellyfish forward  to the animation of the head. Hence, since the carve node works on a 0-1 range, I wouldn't want to go in and adjust it for the many background jellyfish I have. Hence, I used an arclen() expression to translate my translation value into a 0-1 range that can be used by the carve node. fit01() does not work.

Lighting and Kelp Reference

Lighting Reference

And we had a VOPs Houdini Challenge today! We had to distort the provided model in VOPs, VOPs is fun!

Getty Museum!

We went to the Getty Museum today! It was awesome! Photos coming soon...

Shot update!

Completed the animation for the other jellyfish by using timewarps and timeshifts on the original jellyfish's animation. Also made the Jellyfish a digital asset so changes will be propagated to all models. There was also a problem with having a DOP sim in the SOP level and animating on the object level. The transforms on the object level did not affect the DOP sim, which pretty much defeats its purpose. To work around this, a transform node was placed before the DOPnet node, with the channels referencing the transformation channels on my master control object, which I'm using to animate on the object level. Pretty funky, but it works. There was another problem here: the transform node in the digital asset was referencing channels that would be different for each instance of the asset. To solve this, I created vector channels at the top level of the asset, which would be referenced by the transform node. Those parameters on the top level could then be referencing a different object for each instance of the asset.

Shrimp Scampi & Linguine with sausages

Wednesday, July 25, 2012

Getty Images Report

Sir Guyon Tempted by Phaedria
This shot has the diffusion and blooming I would like in my shot.

A Banquet Piece by Pieter Claesz
This painting makes good use of light and shadows to bring out the form of the subjects, which I would want to mimic for the foreground jellyfish in my shot. Also, it has the nice shaft of light that would make my shot look interesting.

Portal of Rouen Cathedral in Morning Light
This painting has the obvious diffusion that would be appropriate for the background jellyfish in my shot.

Souvenir of a Meadow at Brunoy
This painting has the affinity of hue and diffusion that would be a good reference for the background in my shot.

Lady with Cape and Hat

This painting controls what is shown well with dark shadows and gives the subject a nice rim light, which are good references for my jellyfish and kelp.

Tuesday, July 24, 2012

New Blocked Camera


Blocked the new camera for my shot, it's just a simple pull out. Keyframe animation for the jellyfish, and I'll have to animate another one to form the other half of the pseudo Yin Yang. I originally planned for the tubes in the background to be proxies for my cables, but after Travis' remark about kelp forests, I did some googling and actually found photos of jellyfish among kelp forests. On top of that, they were awesome lighting references.

So I thought it'll be interesting if the kelp were bendy instead of going vertical up, and it'll also help the motion of my composition.

Monday, July 23, 2012

Just a post

I did a bunch of test POP sims today, but they're not going to be used in my project anymore, so I guess I just wasted one whole day.

Also changed (simplified) my idea a lot after talking to Travis. Some problems with doing my huge swarm of jellyfish would be: 1) the insane rendering time, and 2) doing wire sims for all those jellyfish. The reason I wanted to have the huge swarm at the end was to make the shot interesting, as I was concerned that having some jellyfish floating around really doesn't seem very interesting. However, since Travis said having photorealistic-ish bioluminescent jellyfish swimming around could be made interesting if the lighting, shading and depth of field were used properly, I'm just going to to stick with something simple and polish it. I actually wanted to just concentrate on the jellyfish, but worrying about ending up with an uninteresting shot made me add all the other extra stuff, with POP sims and what not.

At least I get the feeling that I'm on the right track now and not floundering around trying to have an interesting shot.

Sunday, July 22, 2012

Rise

FLIP fluids workshop yesterday at our office! Couldn't understand 70% of the things the trainer went through though.

And and and we went to watch Dark Knight Rises with the other interns! It was pretty good, despite the clichéd twist at the end. 

Night falls on 3rd Street Promenade 



Some random shots of our office 


We made pancakes! Yum!

Saturday, July 21, 2012

Jellyfish Modeling Update

Here's the wire sim for the tentacles:


I've also managed to model the frills (thanks to Travis!!!) and revamped my animation solution for the jellyfish propulsion so it works on the subdivided mesh now instead of the curve. Up till now, I've avoided switching to using the subdivided mesh to apply the deformation. However, now I needed a way to copy the tentacles to the bottommost points of the frills created after the mesh has been subdivided.

Speaking of the frills, this was done by using the UV coordinates. For some reason, Houdini's UVs are vectors with 3 components.  But anyway, one of the float components go from 0-1 around the y-axis of the head. Just what we need! What's left is to multiply the value by a certain number and mod it by 1. This way, if it's multiplied by 8 and the modulus is used, it goes from 0-1 8 times, giving us 8 segments. And this is how we can control the number of segments. However, there's one more thing to do.


 The modulus currently gives us a 0-1 range before jumping back to 0 immediately. That's not what we need. On top of that, the edges are too sharp. To solve this, a sine function is used after multiplying by pi, effectively fitting the range from 0-1 to 0-pi. This then gives us a smooth blend from 0 -1 -0.


We then mask the effect with another float component of the UVs that go from top to bottom.

Final Result


On to the problem of the animation. I knew that having the animation occur after the subdivided mesh was a good idea, but I just couldn't figure out how. And apparently it was quite easy. Again thanks to Travis!
Here's what it looks like after plugging my VOP SOP after the subdivided mesh.

To achieve this, center position of the mesh is found by averaging the min and max of the bounding box. We then find the vector from the current point to said point and we now have the direction we want the sine wave to displace in. This might actually be more accurate than my previous solution of displacing along the x-axis. It's that simple. For the rest of the mesh to rotate around the topmost point is slightly more complicated. We find the inverse of the vector position of the top (pivot) point and cross it with a vector from the pivot point to the current point. This gives us the axis of rotation for the rotate node to work. Not that much more complicated. Also, the cross product doesn't like unnormalised vectors.
Annnd here's the end result!

We went for dinner with Steven and his wife again! This time at Simpang Asia, an Indonesian restaurant. Annnd the food was really good!

Thursday, July 19, 2012

Even more references




Adjustments to the particle sim


I've updated my VOP POP to allow for intervals between the switching of vectors, and also to allow control of the amount of time when blending occurs. Unfortunately, it might not be used in the end..

Anyway, the Two way switches function the same way as an if statement, taking the value from a compare node and deciding whether to output input 1 or 2. It looks like a big convoluted mess, but what it's doing is basically deciding whether to blend at the current frame based on the value returned by the modulus. here is where the interval can be controlled. If value of 10 is given, the node will do $F%10 and the compare returns a true value if $F%10 = 0 and a false if $F%10=/=0. And so the particle continues on its current course since a zero value is being plugged into the bias of the mix.


Some problems I will encounter in the near future: Placing a swarm of about a thousand jellyfish on the screen. Instancing completely isn't an option, since the tentacles of each jellyfish will have a unique motion based on the particle's motion. A solution I have in mind is to instance all the jellyfish heads and use a foreach to sim every single one of the tentacles.

Also, refined the wiresim today so it looks more like what I'd expect jellyfish tentacles to behave.

Tuesday, July 17, 2012

Jellyfish modeling update

Retooled the jellyfish head. Duplicated the revolved surface, scaled it and merged it with the original surface to get this hollow inside. For some reason, the surfaces don't interpenetrate anymore. I tried this again (although I used a slightly different method this time) because the result of my "workaround" didn't look too great from certain angles.

Also refined the animation of the jellyfish's propulsion. Currently, my rotation parameters (speed, amplitude, offset) are separate from the sine parameters controlling the wave traveling down the head. This might be a problem later on when I try to randomise them based on particle ID, so I'll have to solve that.
Here I'm doing a simple particle sim with a VOP POP handing out a random direction every second. The normal rotates from the current direction to the new direction in the space of a second. For wildly different direction, it looks too fast for a swarm of jellyfish, more like a swarm of ants.

My VOP POP (Thanks to Charles for helping me with the blending between vectors part!)

So the floor is basically taking only the integer component of a float (only 1 of 1.5 is taken). Fraction does the opposite, taking only the decimal components of a float. What the VOP POP does is taking the current time (in integers) and t+1, and mixing between them based on the current frame's position between t and t+1. This solution is limited by the fact that the vector changes every second, and not after a user defined duration. Hence I threw in a noise so the vectors don't all change at once. I also added the 1 to the time because at frame 1, all the vectors point in the same direction for some reason.

I also noticed that they seem to like a particular spot in world space and would constantly swarm in that direction. This would be a problem since the jelly fish are supposed to be inside my cables, so they have to stay within the cable geometry. 

After trying collision (which didn't work because the particles would head back in the same direction after bouncing away, creating this jackhammer like effect), I tried attractors instead. I ended up copying lines onto the surface of my object and have them point towards the centre, then using the points on those lines as attractors to keep the particles in more or less the same region while they swam around. I found that this would work if the speed scale of my VOP POP was lowered a tiny value, preventing the particles from speeding in a very unjellyfish-like way.


It's been a long post, so let me cheer you up with some (badly taken) photos of food:
California Monster Salad

 Chicken wrap for USD4 at Denny's

Pancake Puppies for USD2

Sunday, July 15, 2012



 Went to the pier with Praveen's dad yesterday. Zombie Apocalypse!!!
 Police trying to get through the horde.

 Chile Relieno Burrito at Famous Burritos
Cross section

Jellyfish update and random waves in VOPs

Switched back to using the points on the head's mesh as the template points for the copy SOP. However, this time I used the points on the edge of the head instead, adjusting the width of the tentacles so they would appear to be branching out from the head. The tentacles also have more rotating motion now due to the head's huge expanding and contracting motion. It looks slightly weird now, but it'll be better once it goes through CHOPs. Another change is the removal the multiplication of the noise with the custom attribute sortY that was created. The reason for this was that it made the tentacles transform differently from the head, causing the tentacles to become detached from the head.




Just some waves I created in VOPs with the sine function, the random function and noise.

Thursday, July 12, 2012

Jellyfish Update

Update on my jellyfish head

Rebuilt my sine expression in VOPs instead of having an expression on the parameter. I'm really glad I did, I can push sliders and watch my animation update interactively instead of editing an expression. So much more intuitive!

Now here's a problem: Since there's a lot of movement in the y axis now, my sort y doesn't work that well anymore, and the problem can be clearly seen with point numbers displayed. Also there's nothing I can do about it since my sine function is working on the curve, not the revolved geometry.

In order to get the "buffeted by fluids" noise on the head, Ari showed me a trick to achieve the effect I had previously achieved with the point numbers, but instead with a colour attribute. So a colour is multiplied onto the normalised point number before revolving. This can be done because the points are in the right order on the curve. When the mesh was subdivided, the attribute was transferred properly, so I could then multiply the noise by this attribute, achieving the desired effect. Thanks Ari!

I then tried creating another attribute instead of using the colour, and it still worked! Hurray!

Shot blocking


Here's my new blocked shot! As it zooms out, the title of the project will be revealed by some jellyfish glowing brighter than the rest.


We also met with Steven (the mentor for the first batch) and his wife for dinner today at True Food Kitchen. Unfortunately the food was so good that I forgot to take photos today. But anyway, they're really nice people! And it rained today! Twice! For the first time! I hope it doesn't rain while I'm halfway to work though.

Jellyfish model/asset

I have no idea where to begin, I've fixed so many issues these few days that I've lost count.

Let's start from the "head" of the jellyfish. To create the head, I used a curve and revolved it, using polyextrudes to add detail. I initially duplicated and scaled up the curve, joining it to the previous one before revolving, however the surfaces started to interpenetrate when I applied a noise function. This is why I'm a big fan of the procedural way :D

Jellyfish node graph

A VOP with anti-aliased noise and an animated offset was then applied to give the illusion that the head  was getting buffeted by moving fluids from the side. Before this, an additional step is required for the noise to have a greater effect on the base of the head. This is because the top seems to be slightly more solid than the sides, hence would be less billowy. To achieve this effect, I first sorted the points in the y-axis, then normalised the point number in the VOP SOP and multiplying it with the noise. Sorting is required as the revolve and subdivide node order the points in an unfavourable way.

VOP network for the noise

In order to create the wave on the jellyfish's head when it swims, I tried 3 different approaches. The first one was a normal transform after the curve with the pivot at the highest point and a sine expression in the rotate channel. It had the motion, but not the subtle wave. On top of that, the entire head was opening and closing like a claw. That was not what I needed. What I needed was for the top of head to remain pretty much stationary with increasing movement down the head. To get this effect, I used a soft transform and played around with the soft radius. This was closer to the effect I wanted, however not the ideal. On top of the expanding and contracting, I needed to have a sine-like wave going down the head (refer to my references).

Normal transform with sine expression on the rotate

Soft transform with sine expression on the rotate

VOP SOP with rotate and sine functions

By using a VOP SOP, I could apply a sine wave to my curve, hence creating the propulsion effect.
However, this created another problem where the centre point of the head moves back and forth due to the sine wave. I solved this by duplicating the network and running only point 0 through that network, later subtracting the result from the result of the original network, effectively translating every point the distance of the first point from (0, y, 0). Confused? Never mind, just take a look at my node graph below.

My VOP SOP


Rotation of all points about the first point in VOPs, and dampening the rotation with the normalised point number

Above with sine function


Above with post-transform and dampening

I later realised that after multiplying the normalised point number to the displaced points, the first point would stay in place. However, keeping the post-transform in the network gave me some extra waviness. I'll have to do some tests to see if it's worth the extra nodes.

By now, you might be wondering how I rotated the entire curve about a point in VOPs. I believe that VOPs rotates each point around the origin. To rotate about a point, I deleted all the other points before importing the pivot point into VOPs as a reference input. A pre-transform was then done, subtracting the pivot point's vector from the current point's vector, essentially making the pivot the origin. A rotate VOP was then used, with a preset axis.

Creating the tentacles
To create the tentacles, a simple line is used, stamping the randomised copy number from the copy node downstream into the distance parameter, hence creating variance in the length. It then passes into a VOP SOP that does 2 things: First the AA noise with an animated offset messes up the point positions to create a waviness in the tentacle as it was moving through a fluid. There is also dampening applied here. Next, it goes through a ramp parameter that gives the point an attribute "scale". This is understood by the copy sop and scales geometry accordingly. The geometry is then skinned and capped.
Node Graph for the noise

Next, the tentacles are copied onto the head. To do this and have the tentacles stayed attached to the head while it deforms, groups generated by the polyextrude is used to isolate a certain band of  primitives from the head geometry. A foreach is then used to add a point at the center of each primitive and deleting the primitive.  The points are scaled in and moved up a little, and the VOP SOP adding the noise to the head is duplicated here, with it's channels referenced, so the tentacles will more or less stick to the head's deformations.


 Spinach and Feta Crepe @ Crepe Cafe

Buffalo Chicken Sandwich @ Domino's! Cheesy goodness!

Tuesday, July 10, 2012

Your weekly jellyfix

More References:
 

It's been a busy (albeit productive and fun one) few days! I'm really getting the hang of VOPs now after some hours of cmiVFX videos, help from Charles our mentor and all the other interns (big thank you) and that Character FX Bootcamp. We've been having some cool classes by Jeff Wagner recently too for instancing, delayed load rendering and controlling FLIP fluids! Kinda regretting not bringing by notebook over now and having to scribble on the fragile pages of the Houdini notebooks. I feel my skills improving just by being an intern. Hahaha!

Sunday, July 8, 2012

Our food (yum!) for the past few days!

Home cooked sirloin!

 Home cooked ribeye!

 Four Cheese Pesto (Mozzarella, Fontina, Parmesan, Goat Cheese) from Wolfgang Puck

Spinach and Feta Artisan Pizza from Domino's. Awesome!