All Posts in ICE

February 13, 2016 - Comments Off on Making a Dynamic Tree

Making a Dynamic Tree

Here's a little movie I chucked together from screen captures during a recent project. Maybe I'll do a walk though one day on how it's actually done.
The tree model is from Evermotion. The rig was built in Softimage XSI, using ICE, strands. Syflex, and various compounds built specially for the task.
Once simulated, the tree was cached and exported to Maya. Rendering done in Vray, which made light work of the huge poly counts.
All the work is copyright to Analog Studio

September 9, 2014 - Comments Off on Film4 Idents

Film4 Idents


Concept, Design & Direction: ManvsMachine
Agency & Production Company: 4creative
Creative Director: Dan Chase (Channel 4)
Producer: Liz Arnott (Channel 4)
DoP: Alex Barber
Art Direction / Set Design: Simon Davies (UK) Max Orgell (US)
Post Production VFX: Analog
Colourist: Aubrey Woodiwss (Electric Theatre Collective)
Offline Editors: Alex Lea (Envy) Nick Armstrong (Envy)
Music Composition: Resonate

Here's another new bit of work. Completed over the past few months. Analog consulted on the shoot and live action. Then we did all the post, which even though it looks limited, was a huge amount of work. Hopefully there will be a making of shortly.
It's testament to my fellow Analog colleagues how invisible all the post stuff was, as many still cling onto this being completely 'in camera'.
My main task was fracturing the logo and the piano. This was done using DMM in Maya, after about 30 takes we got the right version. After this we cleaned it up in Softimage by 'wrapping' more detailed geo back the fracturing/flexing forms using ICE. It would have been nice to add all the strings etc, but it became way to complicated.

I also had to animate the logo for each version. This consisted of 20 'stop frame' positions to get the right feel as the footage ramped up and down.

There is a ton of work in progress stuff on this, I may post it up once the dust has settled.

August 21, 2014 - No Comments!

ICE – Constrain Null To Surface

XSI_ICE_TW_ConstrainNullToSurface_01

It's been a while since I've used ICE, but on a recent project involving lots of Alembic caches I thought it would be nice to be able to augment baked geometry. In 3dsMax the attachment constraint is perfect for this, but in Softimage there isn't really anything similar.

Needless to say I didn't get this implemented before the project was finished, typical. Anyway, now that project is done, I've made an effort to finish it.

To make this work, simply add the compound to a null, link your geometry to said null. Input the link to object name, and the polygon number you want to attach to.
Note: When working with kinematics in ICE. One very helpful tip (thanks to my co worker Simon Reeves for this one) is adding a key at frame 1. So when, as is normally the case, the kinematic tree gets 'dirty', Softimage can then work out where the null was originally, then re-apply the ICE kinematics. This saves, removing the ICE execution, zeroing and re applying it.

This compound works on quads, and Tri meshes, normal keyframed objects, and critically for me, imported alembic geo.

XSI_ICE_TW_ConstrainNullToSurface_02

XSI_ICE_TW_ConstrainNullToSurface_03

XSI_ICE_TW_ConstrainNullToSurface_04

How it works:

If anyone is interested in how this works, you can of course open the compound.

But in short I create all the matrix transforms in a temp pose, then apply it in one go at the end. It starts by grabbing the polygon position, this becomes the snap transform. Then I get the polygon normal, and multiply it by the matrix rotation only, of the attach object. Then using the snap location, closest location will give the point ID's of the polygon I'm attaching to. I then use two of these to find a poly orientated axis. Cross product this axis with the polygon normal, and you get a rotation matrix.

The trickiest part was working with an ice tree on the local object and referencing another object. Once the current null moves you cannot do any more computations, as you have the attachment object global position and the null objects new location, which causes problems in the kinematic stack. So you work everything out once, then apply the kinematic once.

A big issue I found was grabbing the normal off attachment object. If you use multiply by matrix on the normal, you get a distorted normal that is pushed from the null's zero, to the attachment object. Thanks again to Simon, I use only the matrix rotation in the multiplication, and ignore the rest.

Scale is not supported, but if you need it, it could be added easily.

Download:

TW_ConstrainNullToSurface 1.1
TW_SnapToSurface_Example

March 16, 2014 - No Comments!

ICE – Display Circle

XSI_ICE_TW_BuildDisplayCircle_01

Here is another little compound. Very simple a modified version of the build circle compound shipped as standard. I wanted to know how it worked, so rebuilt it from scratch, and this time added the ability to align the circle displayed to whatever you want by adding a vector per point input.

For example, build points on a surface, then just add the point normal and they should align. Not ground breaking, but very useful.

XSI_ICE_TW_BuildDisplayCircle_02
TW_Build Display Circle.1.1

March 16, 2014 - No Comments!

ICE – Align to camera view

XSI_ICE_TW_AligntoCameraView_01

Since the news that Autodesk had effectively killed XSI in the prime of it's life, and helpfully, only 1 year into my transition to the software. I have decide to package up what remains of the ICE compounds I have been working on. These will be in various states of unfinishedness, and usefulness too, but there might be something that others can salvage.

Softimage will be running for a few years yet before its removed from support, but I doubt I'm going to spend anymore time getting into ICE. Rather refocus my efforts elsewhere. I wasn't very good at it anyway!

Anyway. This one is called Align to Camera View.
Pretty simple tool that when applied to an ICE tree or Geo, will snap the points into the camera FOV. You can then use the settings to tweak the position and rotation. Apply at the end of your calculations, other wise it'll mess it all up.
Distance from Camera: This simply pushes the point cloud/Geo towards and away from the camera.
Autoscale FOV: Which ever is the smallest dimension of the render frame, auto scales the point cloud/Geo to fit.
Autoscale: As the FOV changes of distance from camera changes it maintains the relative scale to camera

Scale: Overrides the scale, you can scale up or down, post autoscale.
Position LR/UD: Move the point cloud around the frame.
Post Rotate: Rotate the cloud around in the frame.

Uses: Well not many, but...recently I made a reader for audio. It created an ICE tree that displayed the wave form, also you could clip or select the range being sampled. Normally the visual feedback would be seen at 0,0,0, but with this I could snap it to the render camera so I could see it throughout the animation. So making UI feedback elements would be possible.

XSI_ICE_TW_AligntoCameraView_02XSI_ICE_TW_AligntoCameraView_03

TW_Align to Camera View.1.3
WorkingCameraHUD_v004.scn

February 8, 2014 - No Comments!

Air Balloon – Lily Allen


Directed by ThatGo
Production by Friend London
VFX by Analog
Grade by Glassworks
Bit of a weird one this, completed over two weeks. Not my cup of tea music wise, but Glassworks did a great grading job. I helped with the mushrooms, modeling and animating about 10 different variations, before handing them over to Simon for texture and rendering.
Maybe there is a hidden meaning somewhere, maybe? Oh well, just look at the hypnotic zebra.

October 27, 2013 - No Comments!

ICE – Rotate around pivot

XSI_ICE_TW_RotateAroundPivot_01

Here's a compound I've used recently on a bigger project. Rotate around a pivot will do just what it says on the tin, rotate the point cloud around a pivot point as a whole.

Simply add the points to the vector input, then specify the pivot point, this can be a null, or if you place all the points into an array, then get the average you can then rotate around the centre of those points.
XSI_ICE_TW_RotateAroundPivot_02
If you can build a rotation matrix of the point you want to rotate you can also rotate in local space on top of the original rotation. For example see below,  take the rotation and add a rotate vector, this gives you the original rotation vector, plug this into a axis and angle to rotation. and you now have a local rotation. Simple. Download the scene.

XSI_ICE_TW_RotateAroundPivot_03

 

Download:

TW_RotateAroundPivot1.2
RotationTest_01.scn

 

October 27, 2013 - No Comments!

ICE – Look At Constraint

XSI_ICE_TW_LookAtConstraint_01

I've been looking into Matrix rotations recently. Here's the result, a more robust Look At Constraint. It has orientation axis, and you can flip the axis once activated to find your correct orientation. Due to the implementation of the kinetic stack, ICE does have some troubles with this sort of operation, so it might be flaky on the odd occasion.

If you mute the controller, it will keep the current built up rotation, activate again, and it will add the new rotations on top. Technically it still works, but on closer inspection you might find the constrained objects have really high rotational values. You can mute, then reset the rotations back to zero.

The controls are pretty self explanatory, add to your helper static ICE tree, pick the up axis. The manual rotation will enable you to custom orientate the controller, it will keep this offset on top of the constraint.

XSI_ICE_TW_LookAtConstraint_02

Download:

TW_LookAtContraint

 

October 27, 2013 - No Comments!

ICE – Array Compounds

Here are a few Array compounds you might find useful.

In the course of creating my Book Shelf tool, I've been forced into a huge amount of array processing. Apparently doing all your maths on arrays, before setting/creating points, is much much faster than other methods. It also proves more complicated, having to get arrays and pull data from specific Index locations, and set data back again in a non point context. But the speed of computations really does make up for it.

Build an array from array
XSI_ICE_TW_BuildArrayfromArray_01
This compound transfers a smaller array of values into a larger array, then shuffles that array. Simple but useful for populating arrays with for example 5 different widths of books etc.

XSI_ICE_TW_BuildArrayfromArray_02

Downloads:

TW_BuildArrayfromArray1.1

Build array of random numbers

XSI_ICE_TW_BuildArrayofRandomNumbers_01
A simple compound that creates an array of random numbers. Or randomises the current array plugged in, for this, plug the array into the mean value too.

XSI_ICE_TW_BuildArrayofRandomNumbers_02

Downloads:

TW_BuildArrayofRandomNumbers1.1

Build array of single values by percentage
XSI_ICE_TW_BuildArraybyPercentage_01
Builds a simple array that adds a value into an array based on a percentage. There are options for shuffling the array, randomising,  and also setting the remainder value.
XSI_ICE_TW_BuildArraybyPercentage_02

Downloads:

TW_BuildArrayofValuesbyPercentage1.1

Shuffle array
XSI_ICE_TW_ShuffleArray_01
Takes an existing array and shuffles the values around inside that array. This means, no new values are created, just jumbled up index positions.
XSI_ICE_TW_ShuffleArray_02

Downloads:

TW_ShuffleArray1.1

Shuffle Index array
XSI_ICE_TW_ShuffleIndexArray_01
Shuffles the index array, so you can than apply this random variation to other arrays.
XSI_ICE_TW_ShuffleIndexArray_02

Downloads:

TW_ShuffleIndexArray1.1

Slide Array
XSI_ICE_TW_SlideArray_01
Slides array forwards and backwards, useful for comparing values in two arrays.
XSI_ICE_TW_SlideArray_02

Downloads:

TW_SlideArray1.1

Move array up or down
XSI_ICE_TW_ArrayMove_01
A pair of compounds used to move an array up by one, or down by one. So you can do maths between them. Similar to the above but adds zero in the new created array space.
XSI_ICE_TW_ArrayMove_02

Downloads:

TW_ArrayMoveDown1.1
TW_ArrayMoveUp1.1

Downloads:

Download all in a ZIP file

TW_ArrayCompounds

June 27, 2013 - No Comments!

ICE Clone points with delay

XSI_ICE_ClonePoints_01

Cloning points with a delay is something I've struggled with for a while. It seemed pretty simple, but until I got the hang of simulated tree's I just couldn't get it working.

It's an interesting problem that has several facets to it, and I'll go through these below. I have also attached the file so you can see how I've done it.

Add the delay? 
Simulated tree's execute every frame, so we need a logic switch there to active the clone. Use a Nth frame compound attached to an 'if' node, so when it gets to the correct frame, it adds another point.

Cloning the last point, not all of them?
This was the trickiest part to figure out, and needs a simple state set-up to work. All new particles born using the 'Clone' node get a 'State' value of 2. We also use that 'State' value in conjunction with the logic switch above. Allowing 'Clone' to fire only when both the Nth frame is active, and the point is active on 'State' 2. After time, the point will revert back to 'State' 1, a dormant state where nothing is applied to it, and it can't be cloned. This happens one frame after it's cloned again. This is done by activating a timer on 'Clone' activation, then running a timer, then testing the timer though an 'if' node, changing the 'State' from 2 to the dormant 1.

That's it, a simple set-up when you think about it. I have added a few more bit's to the file for a bit of fun. At the time the point is created using the 'Clone' it's worth capturing some other info, for example the frame time at birth. If you then subtract this from current time, you can use this counter to apply scale, or color changes etc. With this approach you could create a culture or growth effect, where each new point inherits a bit of the last, and if they meet other cultures, they inherit a little of that too.

One thing to note, this current version doesn't like a delay value of 1 frame. In this situation there isn't enough time to change the States. 2 and upwards work's fine.

Update
This effect can also be achieved by using 'Add point' node. But rather than using the 'if' after the add point that filters the State, you would need to filter the positions before adding them into the 'Add point'. The reason is context. 'Add Point' works per object, so can't be filtered per point after the fact, whereas 'Clone Point' can.

XSI_ICE_ClonePoints_02

Downloads:
Scene File