XM Magdalena 3D print, GGeorgy (3D)
LC #42 Pipers Alley

View Full Version : Rigging: Resetting Transformations or Using Empty Groups for Controllers

06-30-2010, 07:56 AM
Even though that I have rigging in Maya for a long time, I have not been able to get a clear answer for this particular question.

As a personal preference, I always use Null objects to set my controller object's transformation attributes to zero.

But most of the time, I have also seen some riggers that just put their controllers where they want and go to the menu and select "Reset Transformations".

I know that using a empty group works finer than the other one. But that is exactly What I want to learn?

Why do we use empty groups? What is the main benefit of this method?

I hope I have been able to as clear as possible about my request?

I'll be waiting for your great replies.

Best Regards;


06-30-2010, 11:01 AM
When you reset the transformation of a transform node, its local rotation axes reset to its parent object. So controlling the rotation axis of the object when zeroing out its channel, we use empty group.

06-30-2010, 12:38 PM
Ok, thank you so much but I can not use Maya because I am in office right now.

When I get home, I will take a look at the process again and try to explain What I have been trying to achive.

I watched a video tutorial which has been made by Digital Tutors. The instructor always use "Reset Transformatins" command the controller object.

So it is a prove that He does not know how to rig and gives the animator a corrupted rigging system.

I am so confused about that.

Anyway, do not get anger with me! I am so carious about that.

Help me


06-30-2010, 01:40 PM
I will not get anger with you. Don't worry. :wavey:

I wouldn't say that DT tutorials spread incorrect information. They are doing great job as far as I can see. I haven't seen the tutorial you mentioned though.

Actually the whole point of freezing the controller is that we want it to have a default position where it is placed so that we can transform it to its default position by zeroing out its channels. Right? Say that we created a nurbs curve controller to control a joint. We placed the controller and after some paranting operations to put the controller in the right hierarchy, we see that the controller's channel is dirty now. If we freeze the transformation now, the local axes of the controller resets to its parent object, and the axes of the controller and the joint don't match anymore. Preventing this, we should create empty group whose local rotation axes are exactly same with the controller. And place the empty group where the controller is supposed to be, and parent the controller to the empty group. And now the controller is automatically zeroed out. Because it is now in the center of the parent object, which is empty group.

You can also freeze the transformation of the controller if dirty, as long as its parent is an empty group with its local axes are the same.

06-30-2010, 01:47 PM
Thank you so much body!

I can say that You explained as best as it could be. Now I have a clear solution to Why we should use empty Null objects.

You were greate.

By the way, Is there any script that automates this process. ( you know select the controller, shift select the joint and there you have it. )

Best Regards;


07-03-2010, 10:31 PM
The main reason using empty groups are really for the fk controllers as they are controlled by rotation. For example: You create an arm controller and parent constrain it to the joint, delete the constraint so you now have it lined up with the joints rotation axis. When you freeze this you'll set it back to the origin axis and though the shape is aligned correctly, the axis are not! As you want to control the joint with the controller, you could orient constrain it with "maintain offset", but the axis for the controller will still be aligned to the origin axis and when animating, it's a very bad representation of the joint's axis. But, by putting a group with the same orientation as the joint, putting the controller inside the group and freeze it, we can zero out the controller and let it constrain the joint itself with the same orientation axis so the representation is exact.

Another thing you want to look into is also orientation order, which is very important and are mainly based on which orientation you use in your joint hierarchy. Consistency!

Besides using empty groups for this purposes, empty groups are used in space switching setups etc. Wherever they can aid you and you can find a purpose for them.

07-03-2010, 10:44 PM
Thank you so much body, I got the idea. That was so clear and I want to thank all of you guys.

I have been searching for the script and looks like I'll be searching for it. Cause I have no been able to find anything so far. ( The script that automates the process of this type of controller. )

Best Regards;


07-04-2010, 12:46 AM
I have something that I use for fk controllers. You choose a nurbs curve and shift select the joints, then run the command and it renames everything and puts each element in a parent hierarchy.
If you only want the groups to be oriented and named corresponding to each joint it could be alot simpler.

string $sel[] = `ls -sl`;

for($each in $sel)
$group = `group -em -n ($each+"_ctrlGrp")`;
delete `parentConstraint $each $group`;

07-05-2010, 02:03 PM
I have been searching for the script and looks like I'll be searching for it. Cause I have no been able to find anything so far. ( The script that automates the process of this type of controller. )

I can share my snippet with you, no problem:

proc rp_FreezeTransformations(string $LRA, string $POS, string $ROT, string $Prefix)
string $sel[] = `ls -dag -tr -sl`;
for($nodes in $sel)
float $pos[] = `xform -q -ws -t $nodes`;
float $rot[] = `xform -q -ws -ro $nodes`;

string $Grp = `group -em -n ($nodes + $Prefix)`;
if($LRA == "LRA")
setAttr ($Grp + ".displayLocalAxis") 1;

if($POS == "pos")
setAttr ($Grp + ".translate") $pos[0] $pos[1] $pos[2];

if($ROT == "rot")
setAttr ($Grp + ".rotate") $rot[0] $rot[1] $rot[2];

string $nodeParent[] = `listRelatives -parent $nodes`;
parent $Grp $nodeParent[0];
} // end if

parent $nodes $Grp;

print ($nodes + " is child Of " + $Grp + " under parent node " + $nodeParent[0]);
} // end for

} // end proc

rp_FreezeTransformations("LRA", "pos", "rot","_ctrlGRP")

hope that helps.

07-05-2010, 02:24 PM
polimeno polimeno polimeno..

I do not know how to thank you !!

You are great.. You also have allowed me to spend much more time on thi rigging process than scripting.

Thang you so much.

You are so kind. This script will be the most valuable button on my shelf in Maya..

Best Regards;


CGTalk Moderation
07-05-2010, 02:24 PM
This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.