FX/Lighting reel 2011

Some of my FX and lighting work from the last couple of years.

Planet Dinosaur @ Jellyfish Pictures. FX TD building various Softimage ICE based tools to assist artists in populating scenes with rivers, rain, crowds etc. Working some shots too! Everything rendered in Arnold.
Audi Hummingbird @ The Mill, London. Fluid sims for the smokey bees. The hummingbird also has a transient fluid domain constrained to it (emFluid 4), which advects particles of pollen as its wings flap… if you can see them.
Whole New World @ Psyop. Character shading and lighting, ICE-based procedural environment tools, environmental particles. Big props to Todd Akita for pushing the shading on the fishies and Ed Manning for his sparkly eyes!
Sprite ‘Drake’ @ Mass Market. Fluid sims and particles in ICE with Thiago Costa’s SPH plugin.
Coke Zero ‘Invasion’ @ Passion Pictures. More SPH fun. There are a few cached liquid simulations that are attached to the character rigs, that can be retimed and animated along curves by the artists, with a few custom ICE tools. I think there’s also some emFluid in there on the exploding bottle tops.
Nestle Water @ Psyop. Rendering millions of volumetric particles sometimes looks like a waterfall! Good ol’ SPH again on the water drips.
T. Rowe Price ‘Glass’ @ Psyop. More CG liquids using Lagoa and meshed with Exocortex Surfacer in Softimage. Lots of little bubbles sim’ed with the super fast SlipstreamVX vortex simulator.
Weetabix ‘Happy Breakfast’ @ Glassworks. A simple but fun projection mapping job. Rigging and modelling of a creature face was a new challenge.
BT Infinity @ The Mill, London. Got to work with some great ICE setups from Andy Nicholas.
Q Sjokolade @ Swiss International. Created a custom ICE wave deformer rig that was versatile enough to work with on a very short schedule. Particles are born from the wave based on surface tangent and velocity, but otherwise nothing is simulated and the form of the wave can be entirely artist controlled.
Zirus Antivirotics @ XVIVO. A visualisation of programmed cell death. Lots of ICE particles with carefully programmed behaviour – changing from a stable structure to a collapsed and then boiling cell before death. All wrapped up in metaballs!
Life Cycle – personal. My research project from a few years back came from a collaboration with Dr. Christian Schulz at The New York Botanical Garden and NYU. A custom simulation and geometry operator generates the growth and form of a developing plant as part of its life cycle.


Posted in: ICE, Softimage by Ciaran Moloney 1 Comment

ICE Port Explorer

CM_ICEPortExplorer is a set of customisable context menus to speed up ICE workflow. It allows quick placement of your favourite ICE attributes onto Set Data or Get Data ports.


Features include:

  • Favourite ICE attributes – customisable list of your most often used attributes.
  • Browse for any ICE and kinematics attributes available on a port. Can be split into alphabetic groups.
  • Set port data type.
  • Quickly clear the port or set it to ‘This.’
  • Records a history of the most recently chosen attributes from the context menus.
  • In Softimage 2012 even typed-in attributes can be recorded into the history menu.
  • All menus can be disabled or switched between top level or sub-menus.
  • Auto management of name conversion – choosing “pointvelocity” from the menu on an empty node will automatically resolve to “This.pointvelocity”. If the set data already has a connection or entry in the name field, the menus will try to resolve that as a scene object and display its ICE attributes.


Posted in: ICE, Softimage, Tools by Ciaran Moloney No Comments

Quickly insert and remove ICE pass through nodes

A context menu plugin to quickly add or remove ICE pass through nodes.
Dave Barosin on the Softimage mailing list made the feature suggestion of a cool way to quickly insert pass through nodes into an ICE graph, just by right-clicking on a node. I thought I’d have a crack at it myself.

Just right-click on any wire coming out of a port to insert a pass through between that port and any or all connected ports. Or, right-click on a pass through node to remove it and re-establish the original connections.

Get it here: CM_ICEPortPassthrough-1.03.xsiaddon

*Updated to version 1.02 – improved port traversal
*Updated to version 1.03 – works with Softimage 2011 and earlier


Posted in: Softimage by Ciaran Moloney 2 Comments

Default Primitive settings for Softimage 2012

Quickly set a preset for the most common poly and surface primitives. Softimage 2012 only.

ICE geometry is the next hot thing (and rightly so), but most users will still rely on the old primitive meshes created from the modeling menu. Unfortunately, one of the more annoying things in Softimage is an inability to store presets for any of those primitives. If you always work with a 32×32 subdivided grid you’d probably have to add a new button somewhere in the UI to run a script or command that generated you favorite primitive. Hardly a very dynamic solution.

This plugin attempts to make it easy for users to quickly store a primitive preset, without the need for custom buttons cluttering up the UI – just use the same Get > Primitive menu as always. New SDK features (siOnEndCommand and the undo complex) are being used, so this will only work with Softimage 2012.


  • Supports cone, cube, cylinder, disc, grid, sphere, torus polygon and surface meshes.
  • Store size, subdivision and SRT settings for each primitive in a custom preference.
  • Pop-up menu allows the user to quickly store the settings from a selected primitive in the 3D view.
    • Alt-right-click on a single selected mesh that has a live primitive.
    • Select the Set Primitive Defaults menu.


Get it here: CM_DefaultPrimitives-1.2.xsiaddon


Posted in: Softimage by Ciaran Moloney 3 Comments

ICE Cache to String Nodes

Correclty resolve ICE node strings to cache files using this ICE Node contextual menu.

In Softimage 2012 it’s possible to load ICE caches using the new string nodes. Unfortunately after picking a file name, it doesn’t often resolve correctly to the cache file, particularly when there is frame padding involved. So, it’s necessary to manually edit the strings.
For those who are too lazy for such busy work, here’s a simple plugin that’ll allow you to pick a file and produce a string that’ll correctly point to the cache file.


Simply right-click one of the supported string nodes (string, string file path, string file path sequence) then click the contextual menu.








Posted in: ICE, Softimage by Ciaran Moloney No Comments , ,

Drag and Drop for ICE Caches

Drag and Drop for ICE caches

CM_ICECacheDragDrop is a plugin that adds support for dragging and dropping of ICE caches into a Softimage scene. Hopefully it removes a little bit of the monotony of importing ICE cache files back into your scenes.

After installing the plugin, you may simply drag and drop .icecache or .PC2 files or sequences from a Softimage browser or OS file explorer into a Softimage session.

By default each cache file/sequence will be hooked up to a cache on file node in a new pointcloud. However, by using the shift and alt keyboard modifiers you may append all the cache files together in a single ICE Tree or apply the cache onto an existing geometry. This makes it possible for example, to drag and drop a .PC2 cache straight onto a polygon mesh.

Drag and Drop a cache file into the viewport or scene explorer with these keyboard modifiers:

No key pressed – each cache file or sequence is placed into its own pointcloud.

Shift – the selected cache files are appended into a single pointcloud.

Alt – brings up an option page that allows the user to choose into which construction region the new ICE Trees should be placed.

Alt + selected object – same options as above but if a valid scene object is selected during drag and drop, then optionally the cache may be applied directly to that object.

Combinations of the above modifiers may be used. e.g. shift + alt will append selected files together with an option menu.

CM_ICECacheDragDrop.xsiaddon. Tested in Softimage 2012 and 2011.5

Updated to version 1.01 – Fixes issue with frame padding
Updated to version 1.02 – Updated post Drag&Drop Selection behaviour

Posted in: ICE, Particles, Softimage by Ciaran Moloney 1 Comment

ICE – Arrow Null to vector

Here’s a very simple ICE compound that transforms a null object (best if set to display as an arrow) into a vector for use in an ICE computations. This is great for controlling particle emission or setting the orientation of a particle, with nice visual feedback.

Arrow Null To Vector.xsicompound

Posted in: ICE, Softimage by Ciaran Moloney No Comments ,

Copying ICE nodes with input connections

This is a plugin that attempts to ease the workflow of reconnecting ports when copying ICE nodes. The plugin will copy and paste the selected node and will also re-wire all the input ports that would otherwise be lost when using ctrl-c/ctrl-v. Just right-click on the node you want to copy and select the command from the menu.

Perhaps, this could be pretty handy when you need to get lots of data from a location, but couldn’t be arsed to drag’n’drop a new node, then fiddle around connecting wires between ports. Maybe it’ll save 30-seconds or so in your day?


Writing this plugin was a pretty good exercise in generating ICE trees procedurally and showed some big limitations. The plugin offers partial support for compound nodes that are registered in Softimage. Since the SDK does not offer any direct means of copy/past of ICE nodes in the UI (no such command is exposed) one method to copy a compound would be to recursively traverse down through all internal nodes and port connections, then to rebuild that structure as a clone of the original compound. Unfortunately, there are several cases where this fails as there are no proper hooks in the SDK. For example, there doesn’t appear to be a method to traverse reference ports and  no way to read the properties of compounds (color, author, version etc.). So, accurate recreation of the compound just isn’t possible that way.

Perhaps an alternative would be to generate an XML description of the custom compound through the built-in export command. This could then be imported as an entire representation of the node. This seems like the most viable method, but at the moment it can be really slow, especially on a network. Maybe one for the future.

So, I’ve decided to instead offer limited support of registered compounds. Things are likely to fail if the compound has been modified extensively or if it contains reference ports. In this case a big warning will appear and you should proceed with real caution. Don’t use this on compounds unless you’re sure you kow what you’re doing!

In summary:

  • The command will work take as input any selected nodes in all visible ICE trees. So make sure you only have selected what you need to copy!
  • Only registered compounds can be copied. That means compounds that are in the factory or workgroup locations. Since custom compounds cannot be entirely re-created procedurally, they have to be excluded.
  • Even registered compounds are not fully supported. Due to limitations of the ICE scripting SDK (or at least my knowledge of it!) not all parameters can be correctly copied between compounds. This particularly relates to data on reference ports, but there may be other cases.
  • If you’ve mucked around inside a registered compound, the plugin will issue a warning that the compound may not have been copied correctly. Since not all internal nodes can be regenerated though scripting, the default state of the registered compound is used as a template. This is the best-case at the moment, so use at your own risk!
  • The SDK doesn’t offer any control for where a new node will appear, so don’t be surprised if it decides to land somewhere way off screen!
Posted in: ICE, Softimage by Ciaran Moloney No Comments , ,

ICE: Fast volume emission using signed distance fields. And bunnies.

Softimage ICE is fast, no doubt. But, there are more than a few occasions when even ICE grinds to a halt. Dealing with stupid numbers of particles is usually not so much of an issue (as long as you have the memory). But, when all those particles have to interact with geometry, more often than not things aren’t so smooth.

One issue that users may have to deal with very regularly is emitting particles from a geometry volume. The built-in node does a fine job, making sure each particle is born nicely within the limits of the volume. But this accuracy comes at quite a cost. Emitting just a few hundred-thousand points from a polygon cube will leave you yawning. Push that number up into the millions and you’ll wonder if your computer will ever come back…

Fortunately, it’s possible to cut some corners. Literally.

Visualizing Bunny's SDF

One quick way to find out if any point in space is inside a volume is by the use of a signed distance field (SDF). You’ll find better definitions out there, but in this context and very simply put, the value at any point in space around an object (the field) is equal to the distance from this point to the closest point on the surface of our emitting geometry. The scalar value is then given a + or – sign to describe whether it is located outside or inside the object. By sampling a bunch of points around our geometry we can quickly decide if they’re inside the volume and if so they’re probably worth keeping.

This brings up the next great bottleneck of ICE – closest location searches. Locations are probably one of the most useful things in ICE, but finding the closest location on a mesh to any given particle is not fast. And if you have many million particles who need to find locations, things slow way down. Unfortunately, in order to generate that SDF, it’s necessary to search for the closest location on our emitter mesh. But we can be careful about how many particles do this search.

Reading ICE scalar attributes from the mesh to particles

In this example, I’m strictly limiting the geometry location lookups to the points of a regular voxel grid (based around the excellent voxel building algorithm of Guillaume Laforge, that’s part of his Open Source ICE Meshbuilder. Thanks for sharing!). Having found the closest surface locations to grid points, the voxels now represent our SDF around the geometry. Each point having an inside or outside designation. Owing to the regular structure of the voxels, it’s quite easy to linearly interpolate between the values stored on the cells, simply using known point positions of the voxel corners. Now all that remains is to cast enough samples into the field, find their interpolated SDF value and filter out those that are outside of the geometry. The remaining points are the emitted particles. Kinda brute force, but with some optimizations, it’s pretty quick after all.

Mesh normals to particles

Probably the coolest thing about this stuff is that taking advantage of ICE locations, not only can the SDF be interpolated across the voxel grid, but pretty much any attribute that was on the mesh. And at much less cost than doing per-particle location searches.

The speed and accuracy of this solution is mostly dependent on the resolution of the voxel grid. Bump that up too high and things will probably not be much better than before. If you need accuracy, then stick with the factory emitter (which even has some very cool caching features, so subsequent playbacks are nowhere near as slow). Clearly this is a compromise of speed over accuracy, but sometimes that’s ok. It’s often better to get things done a little rough, than not at all.

The below addon includes a simple example SDF volume emitter and voxel setup. It supports transfer of ICE attributes from the emitter geometry to the particles, but is optimized for normals, CAV and vertex properties.

SDF Emitter Addon for Softimage 2010

29.7.2010 – Updated to version 1.02.
22.3.2010 – Updated to version 1.01.

Got a chance to use this in production so I discovered and fixed a few small but important bugs in the command implementation. Also, made default voxel size 10% of emitter’s bounding box. This makes it easier to work with very large or very small objects. Remove previously installed addon before updating.

Example scenes

(Barely tested, so use at your own risk! You may need to restart Softimage after installing the addon)

Guillaume Laforge
Geometric Data Structures for Computer Graphics
Trilinear interpolation
Interpolation methods
The Stanford 3D Scanning Repository. Thanks for the bunny!

Posted in: ICE by Ciaran Moloney 6 Comments , , ,

Getting motion vectors from your SPH simulation to your mesh

Here are a couple of little Softimage ICE compounds that I’ve found to be very useful over the last couple of months, when dealing with meshes generated from particle simulations.

In particular, I’ve been working with the great SPH solver from Thiago Costa and Grant Kot, which when used in conjunction with a mesher, such as Pwrapper can make some awfully cool, splashy fluids. Unfortunatly, Pwrapper lacks the vital ability to render correct 3D motion blur, nor can 2D motion vectors be generated from its meshes. I’ve also heard that meshes produced by RealFlow can suffer from broken motion vectors.

So, a simple solution is to generate our motion vectors on the particles themselves and to transfer this data to the resultant mesh as a renderable CAV attribute. All of this can be done with a few ICE nodes and wrapped up into these compounds:

(Right-click, save as, or drag and drop into XSI)
CM_2D_Buffers.xsicompound (v 1.76)
Color Attribute To CAV.xsicompound (v1.1)

This compound generates the particle’s motion vectors by transforming them into the projection space of the input camera and calculating their instantaneous 2D velocity and rescaling into pixel space. Many thanks to Reinhard Claus, who some time ago made available the Screen info plugin for XSI. His methods were very helpful in resolving the peculiarities of XSI cameras.

Setting up the ICE tree for CM_2D_Buffers

Setting up the ICE tree for CM_2D_Buffers

CM_2D_Buffers can be applied to simulated or non-simulated (e.g. cached) particles, so set the simulation state accordingly in the PPG. This compound was designed for use with SPH simulations in mind, so SPH mode is enabled by default. Since SPH uses a different integration method than regular particles, we need to know the frame rate and SPH substeps from the simulation to get correct vectors. Otherwise, the setup is just like any motion vector shader e.g. those that come with XSI (as a free bonus of working with the camera projections, we can also get a particle depth map (do with it as you will). Remember, it’s helpful though not always necessary, to set the maximum displacement based on the maximum pixel motion display property.

ICE generated 2D vectors on SPH particles

ICE generated 2D vectors on SPH particles

Getting the vectors onto the mesh
Unfortunately, we can’t simply calculate the motion vectors for the points on the Pwrapper mesh. Since the mesh point order is constantly changing, it would not be valid to compare the position of any point index from one frame to the next.
The easiest workaround is to transfer the RGB motion vectors from the nearest particle(s) to the mesh, where the data can be written to a CAV map. If desired, the sampled color attribute can be smoothed, by increasing the number of particle sample points.
Now that we have a CAV map, the vectors can easily be brought into the render tree and written to a custom buffer come render time.

Setting up attribute transfer

Setting up attribute transfer

Generating a 2D motion blurred image

Generating a 2D motion blurred image

ICE SPH on Vimeo
RE:Vision Effects on motion vectors
3D projection – Wikipedia

Posted in: ICE by Ciaran Moloney No Comments , ,