This topic describes how 3ds Max constructs the node transformation matrix for the point rotation scale (PRS) controller.
The PRS controller uses sub-controllers to create the final transformation. The PRS controller is passed a matrix to its Control::GetValue() method. This matrix belongs to the parent of the node. If the node has no parent, the matrix starts out as the identity matrix. Control::GetValue() is first called on the position controller, then the rotation controller, then the scale controller.
First the position controller pre-multiplies its position. If the matrix passed is the identity, this is equivalent to setting the bottom row (the translation row) of the matrix. Next, Control::GetValue() is called on the rotation controller and the matrix passed includes the position controller information. The rotation is pre-multiplied in. Next, Control::GetValue() is called on the scale controller and the matrix passed includes the position and rotation controller information. The scale is pre-multiplied in.
The position is not affected by rotation or scale, but the rotation is affected by the position, and the scale is affected by the position and rotation. If the transformations were not applied in this way, the scaling would be skewed by the rotation.
Note that some position controllers can actually apply more than just position to the matrix. For example, the Path Controller when the Follow switch is active applies some rotation to have the node remain tangent to the path it is following. Thus when the rotation controllers receives the matrix in Control::GetValue(), the matrix already has some rotation applied.
The matrix passed to Control::GetValue(), after the position, rotation and scale transformation have updated it, becomes the node transformation matrix that 3ds Max uses to position, rotate and scale nodes in the scene.