Read the full post>>
Thursday, June 25, 2015
The end of the blog…
Read the full post>>
Posted by Ola Madsen at 11:41 AM 1 comments
Labels: Blog related
Friday, July 11, 2014
Example using the shockwave deformer
Here’s
a quick example of deforming a water surface instead of a wall, as described in
the tutorial.
Read the full post>>
Posted by Ola Madsen at 6:35 PM 1 comments
Labels: ICE, Softimage XSI
Build your own Shockwave deformer using ICE
self.Amplitude (1)
self.SmallWaveRadius (11)
self.SmallWaveAmp (1)
self.SmallWaveLenght (4)
self.LargeWaveRadius (12)
self.LargeWaveAmp (2)
self.LargeWaveLenght (8)
self.Speed (0)
self.Distance (0)
self.Duration (40)
Rather than using the object’s actual centre point, you’ll use a separate null object and calculate the distance between each point of the geometry and the null. This enables you to reposition the null wherever you want the shockwave to start and the ICE tree will automatically take care of the rest. Get a Get Data node and enter Self.PointPosition as the Reference. Get another Get Data node and enter Impact_Center.kine.global.pos as the Reference. Get a Get Distance Between node and connect the self.PointPosition to its First input and the Impact_Center to the Second. Connect the Result output to the self.Distance input of the Set Data node.
While the Sin node will indeed give you a sine wave, it will be a static wave. In order to create an animated wave you need to change the value you feed into it over time, which is why you created the Speed attribute. Get a Get Data node and enter self.Speed as the Reference. Get another Get Data node and enter self.Distance as the Reference. Get a Subtract node and subtract the self.Distance from the self.Speed. The result of the subtraction will assign an incrementing value to each point over time and based on its distance from the centre. The value will however continue to increase to infinity, which will result in a continuous sine wave. An easy way to fix this is by clamping the output to 0. Get a Clamp node and connect the Result of the Subtraction to the Value input. Open the Clamp PPG and set the Limit 1 to 0 and the Limit 2 to a really high negative number, such as -1000000.
The next step is to add control for the frequency (the number of waves). Get a Get Data node and enter self.SmallWaveLenght as the Reference. Get a Divide by Scalar node and connect the WaveLenght to the Value input. Open the PPG and set the Divide By to 360 and convert the output to Softimage units instead of degrees. Get another Divide by Scalar and connect the Clamp node to the Value input and Divide by Scalar to its Divided By input. Get a Sin node and connect the result of the division to its Value input.
In addition to the frequency you also want to control the amplitude of the wave. Or the amplitude based on the waves distance to the center to be more precise. Get 3 Get Data nodes and enter self.Distance, self.Speed and self.SmallWaveRadius as their references. Get a Subtract node and subtract the self.Speed from the self.Distance. Get a Divide by Scalar and divide the result of the subtraction by the value output of the self.SmallWaveRadius. Get a Calmp node, set the Limit 1 to 0, Limit 2 to 1 and connect the result of the division to the Value input. The output of the Clamp node will output a decreasing value rather than increasing. To fix this, get a Subtract node, open the PPG and enter 1 as the First value. Connect the result of the Clamp node to the Second input. Since you’re gradually subtracting less from 1 for every frame, the output from the subtraction will obviously get closer to 1 over time. Get a Get Data node and enter self.SmallWaveAmp as the Reference. Get a Multiply by Scalar node and connect the WaveAmp to the Value input and the result from the Subtract node to the Factor. To bring the first wave together you just need to multiply the sine wave with the amplitude, so get another Multiply by Scalar node. Connect the Result of Sin node to the Value input and Result from the previous Multiply by Scalar node to its Factor input.
To add the two sets of waves together, get an Add node and connect the Result from the Multiply by Scalar from the small wave to Value1 and the Result from the large wave to Value2.
Get 2 Get Data nodes and enter self.Speed and self.Duration as their References. Get a Divide by Scalar and connect the self.Speed to the Value input and the self.Duration to the Divide By. Get an FCurve and connect the Result of the Division to its input. Open the FCurve PPG and add a keyframe with a value of 1 approximately at frame 0.2. Change the value of the keyframe at frame 1 to 0. This will scale the effect of the wave from 0 to 1 and back to 0 over its lifespan (which is defined by the duration attribute). Get a Multiply by Scalar and connect the Result of the Add node to the Value and the FCurve the Factor.
The last step is to add a multiplication to scale the overall amplitude of the wave. Get a Get Data node and enter self.Amplitude as the Reference. Get a Multiply by Scalar and connect the Result from the previous multiplication to the Value and the self.Amplitude to the Factor.
The final step is to actually deform the geometry. Get a Get Data node and enter self.PointPosition as the Reference. This will return the X, Y and Z position for each of the points of the geometry. However, you’re only interested in changing the Y position (since the disc lies flat on the ground) so you need to separate the vectors. Get a 3D Vector to Scalar node and connect the self.PointPosition to its input. Get a Scalar to 3D Vector node and connect the X and Z output of the 3D Vector to Scalar to its corresponding inputs. Connect the Result output from the Multiply by Scalar node to the Y input of the Scalar to 3D Vector. Get a Set Data node and enter self.PointPosition as the Reference and connect the Scalar to 3D Vector to its input. Complete the ICE Tree by connect the Set Data node to the New (Port1)… input of the ICE Tree node.
Read the full post>>
Posted by Ola Madsen at 4:11 PM 0 comments
Labels: ICE, Softimage XSI, Tutorial
Monday, June 9, 2014
Future of the blog and completely unrelated cloud R&D
Read the full post>>
Posted by Ola Madsen at 2:21 PM 3 comments
Labels: ICE, Simulation
Monday, July 29, 2013
Automatic weightmaps for the left and right side of a head using ICE
Get a Get Array Maximum and a Get Array Minimum node and connect the X output of 3D Vector to Scalar node to their respective Array input. Get a Linear Interpolate node and connect the Array Minimum to the First input and the Array Maximum to the Second input. The weights in the weightmap ranges from 0 to 1 so you need to rescale the current values which spans from -3.230 to 3.230 (their global x positions) to fit this range. Get a Rescale node and connect the Linear Interpolation node to its input. While you could enter the current minimum and maximum positions manually as the Source Start and End, your ICE Tree would only work on this specific model which really isn’t that useful. However, you already know the position of all the points so you can automatically get the highest and lowest number and plug that into the Rescale node. To do so, get a Get Maximum in Set and a Get Minimum in Set node and connect the X output of the 3D Vector to Scalar node to their respective Value inputs. Then connect the Maximum in Set to the Source End of the Rescale node and the Minimum in Set to the Source Start.
The FCurve node does not only enables you to create a smooth transition between the left and right weightmap, it also defines where each side start and ends. If your head is asymmetrical, simply nudge the keyframes to the left or right to aligned them with the geometry.
Get an FCurve node and connect the output of the Rescale node to its In input. Open the Fcurve PPG and select the Key at the left. Right-click on the Key and from the menu, choose Key Properties. Set the Frame value to 0.49. Click the Next Key button and change the Frame value to 0.51. This will create a smooth transition between the points of the left (with a value of 0) and right side (with a value of 1) of the head. Get a Set Data node, enter self.MyWeights as the reference and connect the output of the FCurve to its input. Then connect the Set Data node to the Port1 of the ICETree.
Get a Get Data node and enter self.MyWeights as the reference. Get a Set Data node, open its PPG and click the Explore button. Expand the tree in the explorer Head > Polygon Mesh > Clusters > WeightMap Cls > Weight_Map_Left and choose weights. Close the PPG and connect the Get self.MyWeights node the weights input of the Set Data node. Connect the Set Data node to the New (Port2)… input of the ICETree. To assign the weights for the right side weight map, all you have to do is to reverse the values. Get a Rescale node and connect the output of the self.MyWeights node to its Value input. Open the PPG and change the Target Start to 1 and Target End to 0. Get a Set Data node and repute the previous step but select the Weights for the Weight_Map_Right. Connect the Set Data node to New (Port3)… of the ICETree.
Quick tip
Whenever modifying or assign weights to weightmaps using ICE, you should always use a custom “buffer attribute” to do all your calculations. Then get the custom attribute and set the actual weights of the weightmap at the bottom of your ICETree.
Once you’re happy with the weightmaps it’s a good idea to freeze the geometry to avoid accidentally changing the weights. Please note that this will delete your ICE Tree so you might want to save the scene under a separate name for future reference.
Read the full post>>
Posted by Ola Madsen at 10:21 AM 0 comments
Labels: ICE, Softimage XSI, Tutorial
Friday, April 12, 2013
Creating HDR environment maps from a 3D scene
The project files used in this tutorial can be found here: https://dl.dropboxusercontent.com/u/3834689/CaffeineAbuse/HDR_ProjectFiles.zip

Exclude the Chrome ball
With the chrome ball still selected, press [F3] to open a mini browser and click on the Visibility icon to open the PPG. Uncheck the Shadow Caster and Shadow Receiver checkboxes. While this will exclude it from casting and receiving shadows it still affects the final gathering in the scene. To avoid this, uncheck the Caster and Visible in Sampling attributes in the Final Gathering section of the PPG.
Generate the environment map
With the ball still selected, from the Get > Property menu choose Render Map. In the Format section of the PPG, uncheck the Square checkbox and set the resolution to 1024 x 512. Click the New button next to the UV title and select Spherical to create a texture projection. Since you’re generating an HDR image you obviously need to use an image format supporting it. Change the output format to OpenEXR. By default reflection are disabled from the render map generation and while this is something you normally want it does counteract the sole purpose the chrome ball. In the Disable Surface Properties section, make sure uncheck the Reflection checkbox. Click the Regenerate Maps… button and you’re done.
Read the full post>>
Posted by Ola Madsen at 10:46 AM 3 comments
Labels: Rendering, Softimage XSI, Tutorial
Sunday, January 20, 2013
Creating strands between two different objects
Once completed the following steps you’ve effectively generated strands between the objects, though they won’t show up in a rendered image as you haven’t defined any size or shape yet. To do this simply get a Set Data node, right click on the Value Port of the node and choose Add Port After two times so you have three values. Open the PPG, enter self.Size as Reference and set the size to 0.1 or so. Enter self.Shape as Reference1 and choose Cylinder. To loft the shape along the strand rather than using individual shapes you’ll need to add one last attribute. Enter self.StrandDeform as Reference2, press enter and check the self.StrandDeform checkbox. Finally connect the Execute output of the Set Data node to the Port2 of the ICETree node.
The project files used in this tutorial can be found at: http://dl.dropbox.com/u/3834689/CaffeineAbuse/Strands_between_points.zip
Create the strands
While you’ve just defined the end position for the strands you can’t feed this information directly into Build Array node because the point positions derive from different component types (points vs. vertices). To fix this, get a Switch Context node and connect Multiply Vector by Matrix node to its Value input. Then connect the Result of the Switch Context to the End Value of the Build Array node. Get a Set Data node, enter self.StrandPosition as the Reference and connect the Result of the Build Array node to the input. Connect the Execute output of the Set Data node to the On Creation1 input of the Add Point node.
Read the full post>>
Posted by Ola Madsen at 11:06 PM 5 comments
Labels: ICE, Softimage XSI, Tutorial
Thursday, December 6, 2012
Using an animated map to define particle goals in Softimage
Select the Goal_Object and press [Alt] + [9] to open an ICE Tree. From the Create menu choose ICE Tree. Get a Get Data node, open its PPG and enter Self.NodeLocation as the reference. Get another Get Data node and enter Texture_Map as the reference. Connect the Value output of the Get Self.NodeLocation to the Source input. Get a Color to Brightness node and connect the value of the Get Texture_Map node to its Color input. Get a Set Data node and enter Self.GoalTextureMap as the reference and connect the Brightness output of the Color to Brightness node to the input. Connect the Set Data node to Port1 of the ICE Tree.
Read the full post>>
Posted by Ola Madsen at 10:58 PM 1 comments
Labels: ICE, Softimage XSI, Tutorial
Wednesday, November 7, 2012
Wall of lights - How to set up a wall of animated light bulbs
![]() |
| The perhaps most intuitive way to create different patterns for the lights switching on and off is by using a texture map, which in turn controls the lights based on the lightness of the images. |
Start by opening the scene Light_Wall.scn from this issues CD. There are several ways you can animate the lights switching on and off, but the perhaps most intuitive is by using an image sequence. Select the Wall object and from the Get > Property > Texture Map menu choose Texture Map. In the Clip section of the PPG, click the New button and choose New From File. In the Browser, select the LightSwitch.pic sequence from the Pictures folder and click OK. Select the Texture_Projection in the UV Property section and then close the PPG.
From the Get > Primitive > Point Cloud menu choose Empty and press [Alt] + [9] to open an ICE Tree. From the Create menu choose ICE Tree. Press [8] to open an Explorer and drag and drop the Wall object into the ICE Tree. Get a Get Data node and connect the Out Name output of the Wall node to its In Name input. Open its Property Page (PPG) and enter PolygonPosition as the reference. This will get the centre of each of the polygons of the wall object, but as the object itself is rotated you’ll also need to add the global rotation. This is done by multiplying the polygons position with the objects global matrix. Get a Get Data node and enter kine.global as the reference and connect the Name output of the Get Wall node to the In Name input. Then get a Multiply Vector by Matrix node and connect the Value output of the Get PolygonPosition node to the Vector input and Value output of the kine.global to the Matrix input. Get an Add Point node and connect the Result output of the Multiply Vector by Matrix to the Positions1 input. Connect the Add output of the Add Point node to the Port1 of the ICE tree. Get a Set Data node, enter Self.Size as the reference and then enter 1 as the Size. Connect the Execute output of the Set Data node to the Port2 input of the ICE Tree.
Get a Get Closets Location node and connect the Value output of the Get Wall node to its Geometry input. The location you want to get is the location closest to each point so get a Get Data node, enter Self.PointPosition as the reference and connect it to the Position input of the Get Closest Location node. Then connect the Value output of the Wall node to the Geometry input. Get a Get Data node, enter Texture_Map as the reference and connect the Location output of the Get Closest Location to its Source input. Get a Color to Brightness node and connect the Color output of the Get_Texture to its Color input.
Get an Instance Shape node and open its PPG. Click on the Explore button and select the Light_ Bulbs group. Change the Hierarchy Mode to Object and Children. The Index value controls which object/hierarchy to be used. If the lightness value of the texture map is less than 0.5, the light should be off and the light bulb hierarchy with Index 0 should be used. If the lightness is higher than 0.5 the light should be switched on and the hierarchy with the added point light (index 1) should be used instead. Get a Round node and connect the Brightness output of Color to Brightness to its Value input. Then connect the Integer output of the Round node to the Index input of the Instance Shape. Connect the Shape output of the Instance Shape to the New(Value) input of the Set Data node. Open the PPG and enter Self.Shape as Reference1.
While the points are in the right locations they are facing the wrong direction. To fix this, you can get the orientation of each of the polygons and then use that data to set the orientation of the points. Get a Get Data node and enter PolygonRefFrame as the reference. Get a Matrix to SRT node and connect the Value output of the PolygonRefFrame to the Matrix input. Connect the Rotation output of the Matrix to SRT to the New(Value) input of the Set Data node. Open the PPG and enter Self.Orientation as Reference2.
![]() |
| Using actual light sources will cost you when it’s time to render and in most scenarios you won’t be able to tell the difference from using a really bright material on the object instead. |
Quick tip
To add color to the lights you can add a second texture map using a different image sequence. Use the same approach as for the first map, but connect the Value output of the Texture_Map directly to a Self.Color input on the Set Data node. Then add a Color_Attribute node (with the Attribute set to Color) to the light’s Render Tree and connect it to the color input of the soft_light shader.
Read the full post>>
Posted by Ola Madsen at 1:28 PM 3 comments
Labels: ICE, Softimage XSI, Tutorial
Thursday, August 16, 2012
Rigging an accordion lamp
Quick tip
Read the full post>>
Posted by Ola Madsen at 9:07 AM 0 comments
Labels: Rigging, Softimage XSI, Tutorial
Friday, March 23, 2012
Using render channels in Softimage
The typical use of render channels is to render the scenes components,
such as ambience/diffuse, reflection or motion vectors into individual
images. As most of these components are calculated individually by
Mental Ray anyway they're not going to affect the time needed to render
the image. In addition, channels can be used to render partial or
multiple render trees, adding ambient occlusion, outputting mattes or
any other type of information within a single pass. In this case
however, you won't get them for free.
The project files used in this tutorial can be found at: http://dl.dropbox.com/u/3834689/CaffeineAbuse/Render_Channels.zip
Open the scene Render_Channels.scn from this issues CD. Select the Jigsaw_Piece_01 object and press [7] to open a Render Tree. Get a Store Color in Channel node and open its PPG. The Store Color in Channel can be inserted anywhere in your render tree to store a specific part of the tree to custom render channel. But it can also be used to store information that is not part of the actual material. In the Render Channel section of the PPG, expand the drop down menu and choose the AmbOcc Channel. Get an Ambient Occlusion node and connect it to the Input of the Store Color in Channel node.
02 Store the information
Get another Store Color in Channel node. Open the PPG and click the Add button and enter RGB_Matte as the Render Channel Name and click OK. Set the Input color to pure red. Get a Color4_Passthrough node and connect the Blinn node to its Input. Connect the Result output of the Color4_Passthrough node to the Surface Input of the Material node. The passtrough node acts as a hub and allows you to store as many channels as you like. Open its PPG and click the Add button twice to add 2 channels. Close the PPG and connect each of the Store Color in Channel node to the Channels > Item inputs.
03 Render the Channels
Repeat the procedure for the other Jigsaw pieces, but set the Color of the RGB_Matte channel to pure blue for the second piece, pure green for the third and pure black for the forth. Close the Render Tree. From the Render > Render menu, choose Render Manager... In the Render Channels Output section, click the Add button. Select the AmbOcc channel in the Render Channel drop down menu and click OK. Click the Add button again, select the RGB_Matte channel and click OK. Your pass is now ready for rendering, so click the Render button and choose Render Current Frame.
Quick tip
It's important to note that if you need to re-render one of the channels, you will need to re-render the entire pass which may take considerable longer than if you where using separate passes. So contemplate which is the most beneficial in any given scenario.
Read the full post>>
Posted by Ola Madsen at 6:20 PM 3 comments
Labels: Rendering, Softimage XSI, Tutorial
Friday, February 24, 2012
Shape blending in ICE using an image sequence
Open the scene Blend_Shape_Using_TextureMap.scn. Select the Can object and from the Get > Property > Texture Map menu choose Texture Map. In the Clip section of the PPG, click the New button and choose New From file from the popup menu. Select the Gradient_Mask.jpg sequence and click OK to load the images. Select the Texture_Projection in the UV Property.
With the Can still selected, press [Alt]+[9] to open an ICE Tree view. From the Create menu choose ICE Tree. Get a Get Data node, open its PPG and enter Self.PointPosition as the Reference. Get another Get Data node, open its PPG and click the Explore button. Expand the Can > Polygon Mesh > Clusters > Can_ShapeKey > Can_ShapeKey branch of the tree and select the positions element. What you want to do is interpolate or blend between the objects current point position and the positions of the shape key. Get a Linear Interpolate node and connect the Value output of Get Self.PointPosition node to its First input.
The shape key does not store the actual point position of the shape, but the points' change in position in relation to the initial mesh. To get the actual positions you need to add the shape to the current point position. Get an Add note and connect the Self.PointPosition to the Value1 input of the Add node and the Get Can.cls.Can_ShapeKey.Can_ShapeKey.positions to the Value2 input. Connect the Result of the Add node to the Second input of the Linear Interpolate node. Get a Set Data node and enter Self.PointPosition as the Reference in the PPG. Connect the Result output of the Linear Interpolate node to the Self.PointPosition input of the Set Data node. Connect the Set Data node to the Port1 input of the ICETree node.
The blend value of the Liner Interpolation node controls how much influence each of 2 input values will have. A value of 0 means the second value of the Linear Interpolation node will have 0 affect which results in the first value having full affect. With the blend value set to 1, the opposite is true and the second input will have full affect and the first input 0. Instead of setting the blend value for the entire mesh at once, you can set it per point based on the RGB value of an image sequence. Get a Get Point Texture Map Color node and a Color to Brightness node. The Color to Brightness node converts the RGB value of the image to a scalar value which in can then be used to control the blending of the Linear Interpolation. Connect the Value output of the Get Point Texture Map Color node to the Color input of the Color to Brightness node. Connect the Brightness output of the Color to Brightness node to the Blend input of the Linear Interpolate node.
The project files used in this tutorial can be found at: http://dl.dropbox.com/u/3834689/CaffeineAbuse/ShapeBlendingWithICE.zip
While you typically want to set the blend value between zero and one, you can use values above 1 to amplify the affect or negative values to inverse it.
Quick tip
If you want to blend between more than 2 shapes you can use the Blend node instead. Note that the blend node will output the weighted sum of all the inputs, so if you increase the weight of one input you'll need to equally decrease the weight of the other inputs to avoid double transformation.
Read the full post>>
Posted by Ola Madsen at 6:10 PM 0 comments
Labels: ICE, Softimage XSI, Tutorial
Friday, January 27, 2012
Turbulize the position of a locator with ICE kinematics
The project files used in this tutorial can be found at:http://dl.dropbox.com/u/3834689/CaffeineAbuse/ICE_Kinematic_Turbulence.zip
Read the full post>>
Posted by Ola Madsen at 5:47 PM 1 comments
Labels: ICE, Softimage XSI, Tutorial




























