Taking my previous idea a step further I made a little UI and an easily expandable script to create any those curves positioned on the object. I added a transform node that mirrors the object selected so a parent constraint can be added from the controller with no offset. To use this run the code, select the object or joint, click the controller type, and whammoo controller ready to constrain without offset.
Show Code
global proc cak_cntsUI()
{
int $dev = 1;
if ($dev && `window -exists "cntsUI_win"`)
{
deleteUI -window "cntsUI_win";
}
if (!`window -exists "cntsUI_win"`)
{
window -title "ControlUI"
-resizeToFitChildren true
-width 100
"cntsUI_win";
columnLayout -adjustableColumn true "cnts_Column";
text "Click Button to spawn controler at selection with \nsame translation rotation as selected.\n If nothing is selected it will spawn at origin.";
separator;
gridLayout -numberOfRowsColumns 1 5
-cellWidthHeight 70 50
"cnts_Grid";
button -label "Translate"
-command ("cak_crtls(1)") -parent "cnts_Grid" "trans_btn";
button -label "Translate\nRotate"
-command ("cak_crtls(2)") -parent "cnts_Grid" "TransRot_btn";
button -label "Nintendo"
-command ("cak_crtls(3)") -parent "cnts_Grid" "nintendo_btn";
button -label "Half\nRotate\nZ"
-command ("cak_crtls(4)") -parent "cnts_Grid" "hRotZ_btn";
button -label "Rotate\nZ"
-command ("cak_crtls(5)") -parent "cnts_Grid" "RotZ_btn";
button -label "Half\nRotate\nX"
-command ("cak_crtls(6)") -parent "cnts_Grid" "hRotX_btn";
button -label "Rotate\nX"
-command ("cak_crtls(7)") -parent "cnts_Grid" "RotX_btn";
button -label "Half\nRotate\nY"
-command ("cak_crtls(8)") -parent "cnts_Grid" "hRotY_btn";
button -label "Rotate\nY"
-command ("cak_crtls(9)") -parent "cnts_Grid" "RotY_btn";
button -label "Pole"
-command ("cak_crtls(10)") -parent "cnts_Grid" "pole_btn";
//add new controls above this line
setParent..;
}
showWindow "cntsUI_win";
}
cak_cntsUI();
proc cak_crtls(int $choice)
{
string $selLocAlign[] = `ls -sl`;
string $name ="";
string $ident = "";
string $shape = "";
switch($choice)
{
case 1:
$shape = "-d 1 -ep -1 0 -1 -ep -1 0 -5 -ep -2 0 -5 -ep 0 0 -8 -ep 2 0 -5 -ep 1 0 -5 -ep 1 0 -1 -ep 5 0 -1 -ep 5 0 -2 -ep 8 0 0 -ep 5 0 2 -ep 5 0 1 -ep 1 0 1 -ep 1 0 5 -ep 2 0 5 -ep 0 0 8 -ep -2 0 5 -ep -1 0 5 -ep -1 0 1 -ep -5 0 1 -ep -5 0 2 -ep -8 0 0 -ep -5 0 -2 -ep -5 0 -1 -ep -1 0 -1";
$ident = "trans";
break;
case 2:
$shape = "-d 3 -ep -3.869373271 -6.123233991e-017 0.9999999993 -ep -2.828427125 -1.731912112e-016 2.828427125 -ep -0.9999999993 -2.369307796e-016 3.869373271 -ep -0.9999999993 -2.369307796e-016 3.869373271 -ep -0.9999999993 -2.369307796e-016 3.869373271 -ep -1 0 5 -ep -1 0 5 -ep -1 0 5 -ep -2 0 5 -ep -2 0 5 -ep -2 0 5 -ep 0 0 8 -ep 0 0 8 -ep 0 0 8 -ep 2 0 5 -ep 2 0 5 -ep 2 0 5 -ep 1 0 5 -ep 1 0 5 -ep 1 0 5 -ep 1 0 3.86937328 -ep 1 0 3.86937328 -ep 1 0 3.86937328 -ep 2.828427125 -1.731912112e-016 2.828427125 -ep 3.869373271 -6.123233991e-017 0.9999999993 -ep 3.869373271 -6.123233991e-017 0.9999999993 -ep 3.869373271 -6.123233991e-017 0.9999999993 -ep 5 0 1 -ep 5 0 1 -ep 5 0 1 -ep 5 0 2 -ep 5 0 2 -ep 5 0 2 -ep 8 0 0 -ep 8 0 0 -ep 8 0 0 -ep 5 0 -2 -ep 5 0 -2 -ep 5 0 -2 -ep 5 0 -1 -ep 5 0 -1 -ep 5 0 -1 -ep 3.869373272 0 -1 -ep 3.869373272 0 -1 -ep 3.869373272 0 -1 -ep 2.828427125 1.731912112e-016 -2.828427125 -ep 0.9999999993 2.369307796e-016 -3.869373271 -ep 0.9999999993 2.369307796e-016 -3.869373271 -ep 0.9999999993 2.369307796e-016 -3.869373271 -ep 1 0 -5 -ep 1 0 -5 -ep 1 0 -5 -ep 2 0 -5 -ep 2 0 -5 -ep 2 0 -5 -ep 0 0 -8 -ep 0 0 -8 -ep 0 0 -8 -ep -2 0 -5 -ep -2 0 -5 -ep -2 0 -5 -ep -1 0 -5 -ep -1 0 -5 -ep -1 0 -5 -ep -1 0 -3.869373271 -ep -1 0 -3.869373271 -ep -1 0 -3.869373271 -ep -2.828427125 1.731912112e-016 -2.828427125 -ep -3.869373271 6.123233991e-017 -0.9999999993 -ep -3.869373271 6.123233991e-017 -0.9999999993 -ep -3.869373271 6.123233991e-017 -0.9999999993 -ep -5 0 -1 -ep -5 0 -1 -ep -5 0 -1 -ep -5 0 -2 -ep -5 0 -2 -ep -5 0 -2 -ep -8 0 0 -ep -8 0 0 -ep -8 0 0 -ep -5 0 2 -ep -5 0 2 -ep -5 0 2 -ep -5 0 1 -ep -5 0 1 -ep -5 0 1 -ep -3.869373271 -6.123233991e-017 0.9999999993";
$ident = "transRot";
break;
case 3:
$shape = "-d 1 -ep -3.86937328 0 1 -ep -1 0 1 -ep -1 0 1 -ep -1 0 1 -ep -1 0 3.86937328 -ep -1 0 3.86937328 -ep -1 0 3.86937328 -ep -3.774758284e-015 -2.449293598e-016 4 -ep 0.9999999993 -2.369307796e-016 3.869373271 -ep 0.9999999993 -2.369307796e-016 3.869373271 -ep 0.9999999993 -2.369307796e-016 3.869373271 -ep 1 0 1 -ep 1 0 1 -ep 1 0 1 -ep 3.86937328 0 1 -ep 3.86937328 0 1 -ep 3.86937328 0 1 -ep 4 -3.512896219e-031 5.828670879e-015 -ep 3.869373271 6.123233991e-017 -0.9999999993 -ep 3.869373271 6.123233991e-017 -0.9999999993 -ep 3.869373271 6.123233991e-017 -0.9999999993 -ep 1 0 -1 -ep 1 0 -1 -ep 1 0 -1 -ep 1 0 -3.869373272 -ep 1 0 -3.869373272 -ep 1 0 -3.869373272 -ep -3.219646771e-015 2.449293598e-016 -4 -ep -0.9999999999 2.369307796e-016 -3.869373271 -ep -0.9999999999 2.369307796e-016 -3.869373271 -ep -0.9999999999 2.369307796e-016 -3.869373271 -ep -1 0 -1 -ep -1 0 -1 -ep -1 0 -1 -ep -3.86937328 0 -1 -ep -3.86937328 0 -1 -ep -3.86937328 0 -1 -ep -4 5.854827031e-032 -8.881784197e-016 -ep -3.86937328 0 1";
$ident = "nin";
break;
case 4:
$shape = "-d 3 -ep 4 -1.567223571e-008 2.520287719e-024 -ep 2.828427125 -2.828427125 4.548457722e-016 -ep -1.221245327e-015 -4 6.432490599e-016 -ep -2.828427125 -2.828427125 4.548457722e-016 -ep -4 1.054711873e-015 -1.72563323e-031 -ep -4 1.054711873e-015 -1.72563323e-031 -ep -4 1.054711873e-015 -1.72563323e-031 -ep -4.518123667 0 0 -ep -4.518123667 0 0 -ep -4.518123667 0 0 -ep -3.959180814 0.5589428529 -1.241102449e-016 -ep -3.959180814 0.5589428529 -1.241102449e-016 -ep -3.959180814 0.5589428529 -1.241102449e-016 -ep -3.518123667 1 -2.220446049e-016 -ep -3.518123667 1 -2.220446049e-016 -ep -3.518123667 1 -2.220446049e-016 -ep -2.96519223 0.447068563 -9.926916245e-017 -ep -2.96519223 0.447068563 -9.926916245e-017 -ep -2.96519223 0.447068563 -9.926916245e-017 -ep -2.518123667 0 0 -ep -2.518123667 0 0 -ep -2.518123667 0 0 -ep -2.999999999 0 0 -ep -2.999999999 0 0 -ep -2.999999999 0 0 -ep -2.121320344 -2.121320344 3.411343292e-016 -ep -8.881784197e-016 -3 4.824367949e-016 -ep 2.121320344 -2.121320344 3.411343292e-016 -ep 3 -1.498801083e-015 2.43437545e-031 -ep 3 -1.498801083e-015 2.43437545e-031 -ep 3 -1.498801083e-015 2.43437545e-031 -ep 4 -1.567223571e-008 2.520287719e-024";
$ident = "hRotZ";
break;
case 5:
$shape = "-d 3 -ep -2.957326541 1.33226763e-015 -2.465190329e-031 -ep -2.078646885 -2.121320344 3.411343292e-016 -ep 0.04267345858 -3 4.824367949e-016 -ep 2.163993802 -2.121320344 3.411343292e-016 -ep 3.042673459 -1.054711873e-015 1.479114197e-031 -ep 2.163993802 2.121320344 -3.411343292e-016 -ep 0.04267345858 3 -4.824367949e-016 -ep -2.078646885 2.121320344 -3.411343292e-016 -ep -2.517095075 1.559768533 -2.508299106e-016 -ep -2.517095075 1.559768533 -2.508299106e-016 -ep -2.517095075 1.559768533 -2.508299106e-016 -ep -3.239604137 2.282277595 -5.06767427e-016 -ep -3.239604137 2.282277595 -5.06767427e-016 -ep -3.239604137 2.282277595 -5.06767427e-016 -ep -2.785753666 2.828427125 -4.548457722e-016 -ep 0.04267345858 4 -6.432490599e-016 -ep 2.871100583 2.828427125 -4.548457722e-016 -ep 4.042673459 -1.443289932e-015 1.972152263e-031 -ep 2.871100583 -2.828427125 4.548457722e-016 -ep 0.04267345858 -4 6.432490599e-016 -ep -2.785753666 -2.828427125 4.548457722e-016 -ep -3.957326541 1.498801083e-015 -2.958228395e-031 -ep -3.957326541 1.498801083e-015 -2.958228395e-031 -ep -3.957326541 1.498801083e-015 -2.958228395e-031 -ep -4.475450209 4.440892099e-016 -9.860761315e-032 -ep -4.475450209 4.440892099e-016 -9.860761315e-032 -ep -4.475450209 4.440892099e-016 -9.860761315e-032 -ep -3.916507356 0.5589428529 -1.241102449e-016 -ep -3.916507356 0.5589428529 -1.241102449e-016 -ep -3.916507356 0.5589428529 -1.241102449e-016 -ep -3.475450209 1 -2.220446049e-016 -ep -3.475450209 1 -2.220446049e-016 -ep -3.475450209 1 -2.220446049e-016 -ep -2.922518772 0.447068563 -9.926916245e-017 -ep -2.922518772 0.447068563 -9.926916245e-017 -ep -2.922518772 0.447068563 -9.926916245e-017 -ep -2.475450209 4.440892099e-016 -9.860761315e-032 -ep -2.475450209 4.440892099e-016 -9.860761315e-032 -ep -2.475450209 4.440892099e-016 -9.860761315e-032 -ep -2.957326541 1.33226763e-015 -2.465190329e-031";
$ident = "RotZ";
break;
case 6:
$shape = "-d 3 -ep 0 4 1.567223571e-008 -ep 0 2.828427125 2.828427125 -ep 0 -1.221245327e-015 4 -ep 0 -2.828427125 2.828427125 -ep 0 -4 -1.054711873e-015 -ep 0 -4 -1.054711873e-015 -ep 0 -4 -1.054711873e-015 -ep 0 -4.518123667 0 -ep 0 -4.518123667 0 -ep 0 -4.518123667 0 -ep 0 -3.959180814 -0.5589428529 -ep 0 -3.959180814 -0.5589428529 -ep 0 -3.959180814 -0.5589428529 -ep 0 -3.518123667 -1 -ep 0 -3.518123667 -1 -ep 0 -3.518123667 -1 -ep 0 -2.96519223 -0.447068563 -ep 0 -2.96519223 -0.447068563 -ep 0 -2.96519223 -0.447068563 -ep 0 -2.518123667 0 -ep 0 -2.518123667 0 -ep 0 -2.518123667 0 -ep 0 -2.999999999 0 -ep 0 -2.999999999 0 -ep 0 -2.999999999 0 -ep 0 -2.121320344 2.121320344 -ep 0 -8.881784197e-016 3 -ep 0 2.121320344 2.121320344 -ep 0 3 1.498801083e-015 -ep 0 3 1.498801083e-015 -ep 0 3 1.498801083e-015 -ep 0 4 1.567223571e-008";
$ident = "hRotX";
break;
case 7:
$shape = "-d 3 -ep -8.881784197e-016 -2.957326541 -1.33226763e-015 -ep -7.401486831e-016 -2.078646885 2.121320344 -ep -2.465190329e-032 0.04267345858 3 -ep 7.401486831e-016 2.163993802 2.121320344 -ep 7.401486831e-016 3.042673459 1.054711873e-015 -ep 1.480297366e-016 2.163993802 -2.121320344 -ep -1.927872545e-016 0.04267345858 -3 -ep -8.609285703e-016 -2.078646885 -2.121320344 -ep -8.881784197e-016 -2.517095075 -1.559768533 -ep -8.881784197e-016 -2.517095075 -1.559768533 -ep -8.881784197e-016 -2.517095075 -1.559768533 -ep -8.881784197e-016 -3.239604137 -2.282277595 -ep -8.881784197e-016 -3.239604137 -2.282277595 -ep -8.881784197e-016 -3.239604137 -2.282277595 -ep -8.714635813e-016 -2.785753666 -2.828427125 -ep -1.994355747e-016 0.04267345858 -4 -ep 1.480297366e-016 2.871100583 -2.828427125 -ep 7.401486831e-016 4.042673459 1.443289932e-015 -ep 7.401486831e-016 2.871100583 2.828427125 -ep 2.465190329e-032 0.04267345858 4 -ep -7.401486831e-016 -2.785753666 2.828427125 -ep -8.881784197e-016 -3.957326541 -1.498801083e-015 -ep -8.881784197e-016 -3.957326541 -1.498801083e-015 -ep -8.881784197e-016 -3.957326541 -1.498801083e-015 -ep -8.881784197e-016 -4.475450209 -4.440892099e-016 -ep -8.881784197e-016 -4.475450209 -4.440892099e-016 -ep -8.881784197e-016 -4.475450209 -4.440892099e-016 -ep -8.881784197e-016 -3.916507356 -0.5589428529 -ep -8.881784197e-016 -3.916507356 -0.5589428529 -ep -8.881784197e-016 -3.916507356 -0.5589428529 -ep -8.881784197e-016 -3.475450209 -1 -ep -8.881784197e-016 -3.475450209 -1 -ep -8.881784197e-016 -3.475450209 -1 -ep -8.881784197e-016 -2.922518772 -0.447068563 -ep -8.881784197e-016 -2.922518772 -0.447068563 -ep -8.881784197e-016 -2.922518772 -0.447068563 -ep -8.881784197e-016 -2.475450209 -4.440892099e-016 -ep -8.881784197e-016 -2.475450209 -4.440892099e-016 -ep -8.881784197e-016 -2.475450209 -4.440892099e-016 -ep -8.881784197e-016 -2.957326541 -1.33226763e-015";
$ident = "RotX";
break;
case 8:
$shape = "-d 3 -ep 4 -9.596476685e-025 1.567223571e-008 -ep 2.828427125 -1.731912112e-016 2.828427125 -ep -3.330669074e-016 -2.449293598e-016 4 -ep -2.828427125 -1.731912112e-016 2.828427125 -ep -4 6.162975822e-032 -1.054711873e-015 -ep -4 6.162975822e-032 -1.054711873e-015 -ep -4 6.162975822e-032 -1.054711873e-015 -ep -4.518123667 0 0 -ep -4.518123667 0 0 -ep -4.518123667 0 0 -ep -3.959180814 0 -0.5589428529 -ep -3.959180814 0 -0.5589428529 -ep -3.959180814 0 -0.5589428529 -ep -3.518123667 0 -1 -ep -3.518123667 0 -1 -ep -3.518123667 0 -1 -ep -2.96519223 0 -0.447068563 -ep -2.96519223 0 -0.447068563 -ep -2.96519223 0 -0.447068563 -ep -2.518123667 0 0 -ep -2.518123667 0 0 -ep -2.518123667 0 0 -ep -2.999999999 0 0 -ep -2.999999999 0 0 -ep -2.999999999 0 0 -ep -2.121320344 -1.298934084e-016 2.121320344 -ep -2.386979503e-015 -1.836970199e-016 3 -ep 2.121320344 -1.298934084e-016 2.121320344 -ep 3 -8.936314942e-032 1.498801083e-015 -ep 3 -8.936314942e-032 1.498801083e-015 -ep 3 -8.936314942e-032 1.498801083e-015 -ep 4 -9.596476685e-025 1.567223571e-008";
$ident = "hRotY";
break;
case 9:
$shape = "-d 3 -ep -2.957326541 7.395570986e-032 -1.33226763e-015 -ep -2.078646885 -1.298934084e-016 2.121320344 -ep 0.04267345858 -1.836970199e-016 3 -ep 2.163993802 -1.298934084e-016 2.121320344 -ep 3.042673459 -6.471124613e-032 1.054711873e-015 -ep 2.163993802 1.298934084e-016 -2.121320344 -ep 0.04267345858 1.836970199e-016 -3 -ep -2.078646885 1.298934084e-016 -2.121320344 -ep -2.517095075 9.550827707e-017 -1.559768533 -ep -2.517095075 9.550827707e-017 -1.559768533 -ep -2.517095075 9.550827707e-017 -1.559768533 -ep -3.239604137 2.465190329e-032 -2.282277595 -ep -3.239604137 2.465190329e-032 -2.282277595 -ep -3.239604137 2.465190329e-032 -2.282277595 -ep -2.785753666 1.731912112e-016 -2.828427125 -ep 0.04267345858 2.449293598e-016 -4 -ep 2.871100583 1.731912112e-016 -2.828427125 -ep 4.042673459 -9.860761315e-032 1.443289932e-015 -ep 2.871100583 -1.731912112e-016 2.828427125 -ep 0.04267345858 -2.449293598e-016 4 -ep -2.785753666 -1.731912112e-016 2.828427125 -ep -3.957326541 8.628166151e-032 -1.498801083e-015 -ep -3.957326541 8.628166151e-032 -1.498801083e-015 -ep -3.957326541 8.628166151e-032 -1.498801083e-015 -ep -4.475450209 2.465190329e-032 -4.440892099e-016 -ep -4.475450209 2.465190329e-032 -4.440892099e-016 -ep -4.475450209 2.465190329e-032 -4.440892099e-016 -ep -3.916507356 2.465190329e-032 -0.5589428529 -ep -3.916507356 2.465190329e-032 -0.5589428529 -ep -3.916507356 2.465190329e-032 -0.5589428529 -ep -3.475450209 2.465190329e-032 -1 -ep -3.475450209 2.465190329e-032 -1 -ep -3.475450209 2.465190329e-032 -1 -ep -2.922518772 2.465190329e-032 -0.447068563 -ep -2.922518772 2.465190329e-032 -0.447068563 -ep -2.922518772 2.465190329e-032 -0.447068563 -ep -2.475450209 2.465190329e-032 -4.440892099e-016 -ep -2.475450209 2.465190329e-032 -4.440892099e-016 -ep -2.475450209 2.465190329e-032 -4.440892099e-016 -ep -2.957326541 7.395570986e-032 -1.33226763e-015";
$ident = "RotY";
break;
case 10:
$shape = "-d 1 -ep 1.311341578e-007 -1 -1 -ep 0 1 0 -ep -1 -1 -8.742277657e-008 -ep -4.371138829e-008 -1 1 -ep 0 1 0 -ep 1 -1 0 -ep 1.311341578e-007 -1 -1 -ep -4.371138829e-008 -1 1 -ep 1 -1 0 -ep -1 -1 -8.742277657e-008 -ep 1.311341578e-007 -1 -1";
$ident = "pole";
break;
//add new cases above this line
}
if(`objExists $selLocAlign[0]`)
{
for ($allNodes in $selLocAlign)
{
$name = ("anim_" + $selLocAlign[0]+ "_" + $ident + "_ctrl");
string $lc = `eval curve $shape -name $name`;
string $trans = `createNode "transform" -p $selLocAlign[0] -n ("Anim_" +$selLocAlign[0] + "_neutral")`;
parent -w $trans;
parent -r $name $trans;
setAttr ($lc + ".overrideEnabled") 1;
setAttr ($lc + ".overrideColor") 17;
}
select -r $selLocAlign[0];
}
else
{
$name = ("anim_" + $ident + "_ctrl");
string $orgctl = `eval curve $shape -name $name`;
setAttr ($orgctl + ".overrideEnabled") 1;
setAttr ($orgctl + ".overrideColor") 17;
select -r $orgctl;
}
};
You can add more controls by adding a new case in this format to the cak_crtls procedure:
case casenumber:
$shape = "curve command flags"
$ident = "controlname";
break;
The case number is the next number.
In the $shape field you add in every flag that follows the “curve” command to create the desired shape
The $ident field is the shapes name.
Then to add it to the ui you add this to the cak_cntsUI procedure:
button -label "controlname"
-command ("cak_crtls(casenumber)") -parent "cnts_Grid" "controlname_btn";
Hope you enjoy this script.
