You may not be aware that in XSI scaling is handled differently than in other 3D software packages or perhaps you have encountered situations where scaling a hierarchy did not quite give you the results you were expecting.
In this article I’m going to crack open the mysteries surrounding Softimage scaling. You might find this useful if you are exporting rigs out of XSI or trying to integrate XSI into an existing pipeline. At the very least you might be able to use this knowledge to impress the newbies at work.
There are two types of transformation schemes that XSI supports: Softimage scaling (also affectionately known as SI scaling) and classical scaling (which is a term we invented to refer to the way everyone else handles scaling).
SI scaling was invented at Softimage and it was designed to avoid shearing. Shearing happens when an object is scaled in a direction that does not line up with one of its local axes. One characteristic of shearing is that the object’s local axes may no longer be perpendicular. Shearing can also affect your mesh normals in undesirable ways.
So, if shearing is generally undesirable then why don’t we see other software taking a similar approach? Well for starters classical scaling more closely matches the matrix-stack transformation model used by the graphics hardware and it is simpler to implement and understand. Another reason is that even though shearing can occur with classical scaling it is fairly easy to avoid in practice.
In fact, under many circumstances SI scaling and classical scaling may yield the exact same results which is one reason why SI scaling is not more well known. In fact, the only situation where SI scaling differs from classical scaling is when you apply different scale factors to one or more axes on a 3D object with children *and* the local axes of the children do not line up with the parent’s local axes. If you stick to uniform scaling or the parent and children’s local axes line up or you only apply non uniform scaling to 3D objects without children then the math works out the same.
Time to get down and dirty with the implementation details of SI scaling. I’m going to try and keep this discussion simple even though transformations in XSI are anything but simple. The local transform is chock full of buttons and sliders that let you modify scale orientation, pivots, constraints, neutral poses and a bunch of other stuff I’m too lazy to look up. So, I’m just going to gloss over all that stuff and pretend that our transformation is made up of a scale, a rotation and a translation. After all those are the main parameters animators deal with and they are the only ones that show up in the transform panel. (so I do have some justification for my simplification) You can think of all the other parameters as optional accessories that hang off the main transform.
The first thing to note is that in both schemes the local transform is defined exactly the same. SI scaling only kicks in when 3D objects are parented in a hierarchy. In both schemes our local matrix is just formed by converting our scaling, rotation and translations to matrices (using the standard 4×4 matrix formulas) and multiplying all three matrices together.
M = M x M x M local scale rot trans
Now, here is where classical scaling really shines. To get a global matrix for a 3D object A which is parented under another 3D object B we simply multiply together the local matrix and the parent’s global matrix.
A = A x B global local global
Nice and simple. If B has a parent C we expand this formula again. (Note: if an object doesn”t have any parents then the global matrix is the same as the local matrix)
A A x B x C x and so on... global = local local local
SI scaling takes a different approach by constraining the scale factors to always happen around an object’s local axes. Therefore, shearing cannot occur by definition. So, what this means is that, when dealing with a hierarchy, all the scaling matrices are combined together first followed by all the rotation matrices and finally all the global translations.
One other thing to note is that SI scaling is not a simple matrix product (like classical scaling) since it requires us to handle translations in a slightly different manner. In SI scaling a global matrix is formed as follows.
A = A x B x A x B x AB global scale scale rot rot trans
You can see how the in SI scaling the scale/rotation/translation components are combined separately. The only strange thing in this equation is the AB translation matrix and this is formed by taking the translation component of the following matrix product. (which is just a fancy way of getting the translation in parent space by transforming it by the parent’s local matrix)
AB = 4th row of matrix | A x B | trans | trans local |
And if we add another node to the hierarchy we get the following.
A = A x B x C x A x B x C x ABC global scale scale scale rot rot rot trans ABC = 4th row of matrix | AB x C | trans | trans local |
Whew! That was a lot of trouble to avoid shearing. 
Most users won’t need to concern themselves with SI scaling versus classical scaling especially if they are doing everything in XSI and just outputting rendered frames. However, I would still like to give you a practical example of where you might want to use classical scaling instead of SI scaling. In the example below I have created a brick wall by translating and rotating individual (identical) bricks and parenting them under a null. Now, if I want to squish the entire wall by scaling the (null) parent I will get very different results depending on whether I am using SI or classical scaling. In this situation classical scaling is more useful since we do not want the bricks to scale along their local axes. (which point in different directions)
The good news is that, in XSI, you can mix and match SI scaling and classical scaling to fit your needs. Perhaps you are more comfortable with classical scaling because you cut your teeth on a different 3D software package.
First, if you want to make classical scaling the default in XSI, there is a preference to activate classical scaling globally under File > Preferences > General > Use Classical Scaling for Newly Created Objects.
If however you just want to use classical scaling on a few objects you simply need to 1) select all the objects in your hierarchy 2) hit Ctrl+K to inspect their local transforms and 3) turn off “Hierarchical (Softimage) Scaling” parameter. (which is found under the “Scaling” tab)
If you are interested in learning more about SI scaling and transforms you might also want to also check out Michael Isner’s website where he explores SI scaling from a technical animator/TD perspective. He even has some nifty JScript sample code for dealing with SI scaling that you can incorporate into your own scripts.
 In XSI there is actually a way to shear local transforms by using the scale orientation parameter which changes the axes about which scaling occurs. Oh the irony!