JSHONG Shift Key V1.0




건물이 벽돌 하나하나씩 돌면서 생겨나면서 벽을 만들어가고 방을 만들고 계단이 생성이 되고...
그러면서 건물 외벽이 생겨나면서 생성되는 씬~ 일일이 오브젝트마다 키를 줘야 하는 완전 노가다 ㅠㅠ

이 노가다를 빨리 쉽게 만들고자 만든 프로그램이다.
사실 건물 생성 자체를 완전 자동으로 해 줄수는 없고, 이 프로그램의 컨셉아이디는 키를 하나씩 하나씩 순차적으로 밀어주는거다. 그러면 결국 한꺼번에 스케일 0에서 키 한번 주고 1에서 한번 주고 오브젝트 마다 키를 한프레임씩 밀어주면 결국 보이기에는 하나씩 생겨나는것 처럼 보일테니까.

그래서 일단 키를 두번은 set해줘야 한다. 시작점과 끝점.
그리고 오브젝트를 모두 선택하고 이 멜을 실행시키면 순차적으로 정한 프레임 수 만큼 주르르르륵 쉬프트를 해준다.
다만 사용상 주의 할 점은, 하나씩 키를 밀때 그 순서를 오브젝트 이름으로 하니깐 오브젝트 이름이 중요하다.
뒤에 001,002,003,... 요렇게 일련번호로 붙는 그 순서로 키를 밀어준다.
그래서 이 프로그램에다가 오브젝트 이름을 일괄적으로 변경해주는 기능도 추가 했다.
요 기능은 이미 누가 만들어 놓은것을 차용 했다. (함수를 슬쩍?)
그리고 한가지 팁은 maya에서 오브젝트를 쉬프트키를 누르고 하나씩 추가 할때 그 추가 하는 순서대로 메모리에 임시로 저장이 된다. 그래서 오브젝트를 셀렉트한 순서대로 파일명 변경시 오브젝트 일련번호가 순차적으로 붙게된다. 그래서 원하는 순서로 생겨나게 하고 싶을때 그 순서대로 오브젝트를 셀렉트하고 오브젝트 이름을 변경 한 다음, 시작과 끝의 애니메이션 키를 주고, 키 쉬프트를 하면 된다.
요러한 사용법은 숙지를 해야만 편하게 쓸 수 있다. 뭐 상업적으로 개발한게 아니라... 나 혼자 쓰려고 만든거라 더 편하고 안정적으로 수정할 필요성은 못 느낀다. 난 너무 잘 쓰고 있으니깐.. ^^;;;
아~~ 주의 해야 할 점은 키를 주고 애니메이션 그래프에서 키를 선택하고 쉬프트를 하게 될때 한번에 한가지 속성만 선택해야 한다.
왜냐면 아무생각 없이 s키로 키 셋을 주게 되면 대부분 translate, scale,rotate 모두 키가 들어가게 되는데 이 멜에서 순서대로 키를 밀때 한번에 한가지 속성만 처리를 하게 됨으로 해당 키가 들어간 모든 속성을 다 계산하게 된다. 즉 단순히 scale 0--->1로 키 준걸 그냥 생각 없이 쉬프트 하게 되면 X값으로 순차적으로 쉬프트 한 다음 Y값으로 순차적 쉬프트를 하고 그 다음 Z값 쉬프트를 하게 되서 결과적으로 예상치 못한 결과 값이 나오게 된다. 요것만 주의~!!






// shiftKey.mel v1.0 by Justin Jung.
//
global proc POP_homepage()
{
system("explorer www.jshong.com/"" target="_blank">http://www.jshong.com/");
}
global proc shiftKey()
{
window -t "JSH Shift Keyframes by JSH" -menuBar true;
menu -label "제작자";
menuItem -label "정순홍(digitalog@naver.com)" -c POP_homepage;
menu -label "도움말" -helpMenu true;
menuItem -label "www.jshong.com" -c POP_homepage;
columnLayout;
text -l "◆애니메이션 키 순차적으로 쉬프트하기" -align "center";
separator - height 20 - width 250 -style "out";
setParent ..;
string $tabs = `tabLayout -innerMarginWidth 5 -innerMarginHeight 5`;
string $tab1 = `columnLayout`;
text "Key Shift (Time or Value)";
floatFieldGrp -v1 0 -en 1 -nf 1 -l "Time" timeOffset;
floatFieldGrp -v1 0 -en 1 -nf 1 -l "Value" valueOffset;
rowLayout -numberOfColumns 3
-columnWidth3 70 70 70
-columnAttach 1 "both" 0
-columnAttach 2 "both" 0
-columnAttach 3 "both" 0;
button -w 50 -l "Shift Time"
-c "shiftKeyOffset(`floatFieldGrp -q -v1 timeOffset`,0,1)";
button -w 50 -l "Shift Val"
-c "shiftKeyOffset(0,`floatFieldGrp -q -v1 valueOffset`,2)";
button -w 50 -l "Shift Both"
-c "shiftKeyOffset(`floatFieldGrp -q -v1 timeOffset`,`floatFieldGrp -q -v1 valueOffset`,0)";
setParent ..;
setParent ..;
string $tab2 = `columnLayout`;
text "오브젝트들의 이름 일괄 변환하기";
text -l "===>오브젝트를 차례로 선택 후";
text -l "===>새이름을 입력, 실행해주세요.\n";
rowLayout -numberOfColumns 3
-columnWidth3 70 70 70
-columnAttach 1 "both" 0
-columnAttach 2 "both" 0
-columnAttach 3 "both" 0;
text -l "새이름" -align "center";
string $newNameField = `textField -w 300 -text "ObjectName" newNameField`;
button -l "이름바꾸기" -c multiRename;
setParent ..;
tabLayout -edit
-tabLabel $tab1 "키밀기" -tabLabel $tab2 "이름바꾸기"
$tabs;
showWindow;
}
/**********************키 밀어주기 함수 ***********************************************************/
global proc shiftKeyOffset(float $shiftValT, float $shiftValV, int $mode)
{
string $channel[] = sort (`keyframe -q -n`);
int $numChannels = size($channel);
float $newPosT;
float $newPosV;
int $keyIndex[];
if ($mode == 0)
for ($count=0; $count<$numChannels; $count++)
{
$keyIndex = `keyframe -sl -q -iv $channel[$count]`;
for ($keyCount=0; $keyCount<(size($keyIndex)); $keyCount++)
{
$newPosT = $shiftValT + ($count * $shiftValT);
$newPosV = $shiftValV + ($count * $shiftValV);
keyframe -e -in $keyIndex[$keyCount] -option over -r -tc $newPosT $channel[$count];
keyframe -e -in $keyIndex[$keyCount] -r -vc $newPosV $channel[$count];
}
}
if ($mode == 1)
for ($count=0; $count<$numChannels; $count++)
{
$keyIndex = `keyframe -sl -q -iv $channel[$count]`;
for ($keyCount=0; $keyCount<(size($keyIndex)); $keyCount++)
{
$newPosT = $shiftValT + ($count * $shiftValT);
keyframe -e -in $keyIndex[$keyCount] -option over -r -tc $newPosT $channel[$count];
}
}
if ($mode == 2)
for ($count=0; $count<$numChannels; $count++)
{
$keyIndex = `keyframe -sl -q -iv $channel[$count]`;
for ($keyCount=0; $keyCount<(size($keyIndex)); $keyCount++)
{
$newPosV = $shiftValV + ($count * $shiftValV);
keyframe -e -in $keyIndex[$keyCount] -r -vc $newPosV $channel[$count];
}
}
}
/**********************키 밀어주기 함수 ***********************************************************/
/********************** 오브젝트 이름 일괄 변환 함수 ***********************************************************/
global proc string multiRename() {
string $userSelection[];
int $counter = 0;
$userSelection =`ls -sl`;
string $newName=(`textField -q -tx newNameField`);
if(size($userSelection) == 0) {
confirmDialog -title "Error" -message "There are no objects selected!" -button "OK" -defaultButton "OK";
}
else if(`textField -q -tx newNameField` == "") {
confirmDialog -title "Error" -message "You must type in a new Name!" -button "OK" -defaultButton "OK";
textField -edit -tx "NEWNAME" newNameField;
}
else {
for($counter = 0; $counterselect($userSelection[$counter]);
int $CountNumber = $counter+1;
string $back_number;
if ($CountNumber>=0&&$CountNumber<10 nbsp="" p="">{ $back_number = stringArrayToString({ "000", $CountNumber }, ""); }
else if ($CountNumber>=10&&$CountNumber<100 p="">{ $back_number = stringArrayToString({ "00", $CountNumber }, ""); }
else if ($CountNumber>=100&&$CountNumber<1000 p="">{ $back_number = stringArrayToString({ "0", $CountNumber }, ""); }
else if ($CountNumber>=1000&&$CountNumber<10000 p="">{ $back_number = stringArrayToString({ "", $CountNumber }, ""); }
rename -is ($newName+$back_number);
}
}
for($counter = 0; $counterint $CountNumber = $counter+1;
string $back_number;
if ($CountNumber>=0&&$CountNumber<10 nbsp="" p="">{ $back_number = stringArrayToString({ "000", $CountNumber }, ""); }
else if ($CountNumber>=10&&$CountNumber<100 p="">{ $back_number = stringArrayToString({ "00", $CountNumber }, ""); }
else if ($CountNumber>=100&&$CountNumber<1000 p="">{ $back_number = stringArrayToString({ "0", $CountNumber }, ""); }
else if ($CountNumber>=1000&&$CountNumber<10000 p="">{ $back_number = stringArrayToString({ "", $CountNumber }, ""); }
select -add ($newName+$back_number);
}
return $newName;
}
/********************** 오브젝트 이름 일괄 변환 함수 ***********************************************************/
shiftKey();