FrontPage GettingUnderTheHood

1. HUH? USING WHATIS AND HELP

maya_242_1.jpg
[JPG image (37.54 KB)]

MEL 스크립팅을 시즉하게 되었을 때, 당신은 많은 의문이 생길것이다. 그리고 끊임없이 소프트웨어 메뉴얼을 참조할 것이다. 유저를 이해를 돕기 위한 특별히 고안된 MEL command가 있다. 첫째, command whatIs는 MEL-related 된 것들을 말한다. 만약 마야가 변수인지 아닌지 인식할 수 있는 command 가 있다면 혹은 MEL 스크립트가 내적인 메모리가 존재한다면 그것이 무엇인지 당신에게 확인시킬 수 있다. 우리가 인지할 수 있는 command를 가지고 시작해보자:sphere. Script Editor에 있는 sphere라는 command를 입력합으로써 우리는 NURBS sphere를 생성할 수 있다. 그러낙 만약 우리가 sphere가 있었는지 이게 뭔지 모른다면? 어떻게 우리가 빠르게 그리고 쉽게 알 수 있을 까? 우리는 간단히 마야에게 물어 볼 수 있다. "whatIs shere;" 마야는 기쁘게 우리에게 대답해준다. "a command" 자 이제 우리는 command를 판단할 수 있다. 우리는 help command를 사용함으로써 더 많은 정보를 얻을 수도 있다. "help sphere" 이라고 입력하기만하면된다. 그러면 마야는 sphere command의 사용방법에 관한 기록을 가지고 있는 commandline flgs와 syntax를 포함하여 우리에게 모든 정보를 말해준다. 주목하자, help command는 commands를 다루고 MEL 키워드 if나 while같은 것은 다루지 않는다. 아무튼 whatIs 그리고 help는 뭔가를 이해하고자할 때엔 여전히 유용하다.


2. variables and eval this, eval that

variavble은 간단히 말하면 스크립트가 돌아가고 있는 동안 데이터가 있는 장소이다. 그곳에는 너가 동적으로 너가 원하는 것을 넣을 저장소가 거의 없다. 그래서 어떻게 한 장소에서 variable로 너의 데이터를 얻을 수 있는가? 첫번째로 한가지 간단한 사실을 알 필요가 있다. 너는 데이터가 variable로 "반환"되는 과정을 측정함으로써 데이터를 "얻는다". 데이터가 어떠한 것인가는 중요하지 않다. variable이 전체의 포인트이다. 그것은 너가 원하는 것을 꽤 많이 포함할 수 있다. 그러나 너는 variable의 데이터 타입을 알 필요가 있다.그것을 알고 나면 너는 그것의 완전한 잠재력을 사용할 수 있다. polycube command를 예를 들어 사용해보자.polycube command는 폴리곤 큐브를 만들고 array로 되어있는 노드를 반환한다.만약 그 명령이 특별한 타입의 데이터를 반환한다면 다음과 같이 variable에 넣을 수 있음을 의미한다. string $arrayVariable[] = eval("polyCube"); 아니면 string $arrayVariable[] = 'polyCube'; 두개의 예처럼, 만약 $arraVariable의 내용을 프린트 하고 싶다면 큐브 노드가 생성한 array,pCube1 polyCube1를 얻을 수 있다.
maya_243_1.jpg
[JPG image (118.11 KB)]


3. acting conditionally

condition은 일련의 전제조건에 기반해서 결정하는 방법이다. 조건문은 사실 혹은 거짓의 테스트를 통해서 어떤 일이 일어나는 것이나 다른 일이 대신 일어나는 것을 지속시킬 수 있다. 조건문을 쓰는 것에는 약간의 차이가 있지만 그러나 가장 일반적인 방법은 if, else, else if 등의 keyword를 사용하는 것이다. 다른 방법으로는 case 조건문으로 switch를 쓰는 것이다. 마지막으로 애매하지만 가장 짧게 표현가능한 ?,: 연산자를 사용하는 것이다. 조건문을 작성시 가장 기억해야 할 것이 있다. 조건문은 사실과 거짓을 테스트 하는 것이다. 이것은 조건에 넣는 것은 0또는 1로 측정 되어야 하는 것이다. 그리고 만약 1(사실)로 판정된다면 그리고 조건이 긍정으로 테스트 되면 따라서 코드의 일부분은 실행되어야 한다.
maya_244_1.jpg
[JPG image (225.58 KB)]


4. THE SHEER EXCITE MENT OF ARRAY VARIABLES

maya_245_1.jpg
[JPG image (85.68 KB)]

저장하는데 큰 재료의 목록이 필요한가? 그 때 배열은 당신에게 적절한 것이다. 배열은 MEL에서 동적인 성장 자료 구조이다; 당신은 많은 다른 자료타입의 배열들을 가질수 있다.-정수형, 실수형, 문자열, 그리고 벡터. 유감스럽게도, 당신은 매트릭스들의 배열은 가질수 없지만, 그것은 아마 괜찮을 것이다. 배열 사용은 아주 간단하고 매우 유용하다. 당신이 문자열 자료의 알려지지 않은 총계 스크립트를 뭔가의 보호트랙 명령 안의 리스트 안에 쓰는게 필요로 한다고 하자. 모든것을 저장하기 위해 배열을 쓰는것은 좋다. 당신은 배열을 사용해서 간단하게 리스트의 각각의 요소에 자료 할당하는 것을 시작 할 수 있다; 예로 :

string $array[];
$array0 = "one";
$array1 = "two";
$array2 = "three";

당신은 배열에 'size' 명령어를 써서 동적인 새로운 값 추가를 할 수 있고 배열 찾기로 사용하기 현재의 1 작은 크기를 쓸 수 있다, 이렇게:

$array 'size $array'-1 = "four";

MEL의 배열에 대해 기억하는데 한가지 중요한 점은 그것들은 오직 값을 지닌 자료형이다.-그것은 만약 당신이 MEL 절차에 배열을 보낸다면, 절차는 당신이 보낸 배열의 만족하는 똑바로 수정 가능성을 갖는다. 이것은 Maya는 메모리 안의 배열의 완전한 사본을 만드는 걸 가지지 않고 단지 하나의 절차로부터 또다른 것까지 자료를 보내는 것이다. 마지막으로, 당신은 모든 당신의 배열의 내용을 "clear"명령어를 사용해 지울 수 있다. 메모리로 부터 배열을 완전히 파괴하는것이다, 간단한 타입:

clear($array);

5. DOING THE LOOP

maya_246_1.jpg
[JPG image (138.92 KB)]

loop란 무엇인가? 이것은 춤추는게 아니다, 그것은 당신이 끝낼 때 아마도 하나로 느낄 것이다! loop는 자료목록이나 자료목록을 만들기를 반복하는데 대단히 유용한 방법이다. loop는 보통 배열의 내용을 처리하는데 쓰거나 배열만드는 명령 속의 명령어의 set에 되풀이하여 실행하는데 쓰는 방법이다. 때때로이긴 하지만, 그것은 명령어다발 실행하는데 유용한하고 되돌려준 자료까지 확실한 조건은 멈추라고 우리에게 말해주는 것을 만나는 것이다. 그들은 MEL에서 loop를 쓸 때 두개의 다른 키워드가 있다. for와 while이다. for loop의 간단한 예이다:

int $intArray[]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

for( $elem in $intArray )
{
print ( "Array Element " + $elem + "\n");
}

그리고 while을 사용한 예이다.

int $intArray[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10 };
int $i = 0;
while( $i <= 5)
{
print ($intArray$i + "is less than 5...\n");
$i++;
}


6. WRITING CUSTOM PROCEDURES

maya_247_1.jpg
[JPG image (38.82 KB)]

모든 작업자들의 작업환경에 일반적인 MEL이 단지 충분하지 않을 경우, 사용자 지정 논리가
필요할 때 해당 MEL을 박스의 오른쪽 상자에서 제공하지는 않습니다. 필요할 때는,
사용자 지정 프로세스를 작성하는 모든 요구에 응답할 수는 있습니다. MEL에서 프로세스를
작성하는 때 직접적인 인수 정의가 가능하고, 당신의 논리의 블록을 만들며, 다른 변수에
저장된 스크립트 내에서 사용할 수 있는 데이터로 계산된 값을 변환하게 됩니다.
일반적으로 충분한 다용도 형태로 작성될 경우, 때로는 사용자 프로세스가 심지어
지속적으로 자신이나 다른 사람들에게 다시 사용 될 수 있습니다. 그래서, 사용자
프로세스를 만들어보겠습니다.

global proc string example Procedure ( string $arg )
{
//
// any custom logic goes here :
string $variable = "The string I passed in is : " +$arg;
return ( $variable );
}

먼저, global는 마야에서 당신이 선언할 마야 전역 함수의 나머지 사용해야 할 것이
무엇인지를 말해줍니다. 다음, proc는 마야에서 다음 프로세스를 선언하게 해줍니다.
그 다음, string은 마야에서 기본적으로 이 절차를 일부 데이터를 반환하고 데이터
형식을 문자열로 정의하는 것을 말해 줍니다. 다음은 프로세스의 이름으로, 당신이
좋아하는 어떤 것이 되든 가능하며, 프로세스를 실행하기 위한 인풋을 이 무엇인지
괄호 안에 인수를 넣어주어야 합니다. 마지막으로, 대괄호 안의, 범위 연산자로 알려진,
원하는 어떤 논리라도 삽입이 가능합니다. 사용자 지정 논리를 작성할 때, 해야 할 것은
Return 문을 사용하여 응답 반환 하는 것입니다. 반환할 데이터 형식과 같은 함수의 시작
부분에 선언된 형식이 있는지 확인하시기 바랍니다. 당신은 사용자 프로세스가 포함된
먼저 만들었던 사용자 지정 프로세스를 또다른 스크립트에서 사용할 수 있으며 그때
이와 같은 방법을 따를 것입니다.


7. OOPS: WARNING, ERROR, AND CATCH

maya_248_1.jpg
[JPG image (41.19 KB)]

때때로 오류를 계획하는 것은 실제 스크립트에서 작성되는 수많은 스크립트 작성과정의
일부분일 뿐입니다. 오류를 일으키는 경우 처리되는 추가 코드는 오류를 처리하도록
알려진 프로세스입니다. 정말 나쁜일이 일어나기 전에 당신의 코드에 발생되는 오류를
스스로 알기위한 정말 간단한 방법은 MEL 명령의 오류를 사용해서 알 수 있습니다.
오류가 난 명령은 즉시 당신의 스크립트로부터 빠져나올 것이며 스크립트 에디터
아웃풋에 빨간색 오류 매세지를 보여줄 것입니다. 아마도 오류명령을 사용하는 가장
일반적인 방법은 오류가 발생했을 때 입력되는 부분을 창조하는 것입니다 :

If ( $badCondition == true ){
error "An error has occurred. Sorry, but something went wrong.";
}

만약에 오류가 아닌 상황이 발생했을 경우에는, 거기에 대해 여전히 잠재적인 문제가
발생할 수도 있기에, 그때는 경고 명령을 사용해 보시기 바랍니다. 경고명령은 사용자에게
컬러 메시지를 화면 아래쪽에 인쇄하는 부분에서는 오류 명령과 비슷하지만, 경고명령은
치명적 스크립트 종료를 야기시키지는 않습니다. 대신, 경고명령은 계속해서 그것을
호출한 후 나머지 스크립트를 실행하게 됩니다. 우리는 일반적으로 계속해서 케치
명령이 무엇인지에 대해서는, 마야를 선호하거나 오류를 좋아하지는 않습니다.
당신의 코드 어디에서나 당신이 진짜 오류가 아닌 오류를 만나게 되는 곳에서는
캐치 명령을 사용하기에 적합합니다. 이것의 좋은 예는 당신의 씬에서 모든 카메라가
삭제되는 것이지만, 마지막 의 기본 카메라를 삭제할 수 없기 때문에 마야는 당신에게
오류를 주게 되는 것입니다. 당신은 그것에 대해 추가적인 임시의 논리를 추가할 수 있고,
또한 캐치명령과 함께 삭제 명령을 간단히 래핑 할 수 있습니다:

//
// FORCE DELETE ALL CAMERAS IN TEE SCENE. ->
//
string $cameras[] = 'Is -type camera’
for ($cam in $cameras)
{
camera -e -sc false $cam ;
}
catch('delete $cameras');

그리고, 만약 당신이 오류 스크립트 밖을 나오길 원한다면, 에러 명령을 사용하시기
바랍니다; 만약 오류가 있다는 것을 알았다면, 그리고 스크립트를 계속 실행하기를
원한다면, 그때 케치 명령을 사용하시기 바랍니다.


8. USING CREATENODE, NODETYPE, AND LS

maya_249_1.jpg
[JPG image (96.83 KB)]

마야의 유용성은 노드로된 구성이 그 대표격이다. 모든 노드타입을 확인하고 싶다면, 간단하게 command에 다음을 입력하면 된다.
print 'ls -nodeTypes';
매우긴 목록이 생기는 것을 확인할 수 있다. 특정노드를 생성하고 싶다면, command를 통해서 createNode를 통해 원하는 노드를 생성하면 된다.
createNode plusMinusAverage;
위의 명령어는 plusMinusAverage라는 하나의 수학적인 유틸리티노드를 생성한다. 생성되는 노드타입들은 모두 이런식으로 기본값으로 초기화 시켜 생성할 수 있다. 이런식의 노드생성은 간편하게 노드를 만들고 싶을때 매우 유용하다. 또한, 어떤경우에는 이미 생성된 노드를 찾고 싶을 경우도 있을 것이다. 이것또한 nodeType후에 찾고자하는 노드의 이름을 적음으로써 검색할 수 있다. Create menu를 통해서 NURBS구를 생성했다고 가정하고 NURBS shape node를 찾으려 한다면, 다음과 같이 명령어를 입력하면된다.
nodeType nurbsSphereShape1;
//Result: nurbsSurface//
nurbsSphereShape1은 만들었던 구의 shape node이름이다. 위 명령어의 결과는 노드타입을 문장으로 알려주는 것이다. 항상 노드는 그에 상응하는 타입을 가졌다는 것을 기억하고 있어야 한다.


9. ADDING, GETTING, SETTING, AND CONNECTING ATTRIBUTES

maya_250_1.jpg
[JPG image (98.9 KB)]

마야의 Attribute는 한 노드에서 다른 노드로의 데이터교환으로 인해 믿기지 않을 정도로 유용하다. MEL은 getting, setting, connecting을 통해 attribute를 조정할 수 있는 수많은 방법을 보여주고 있다. Attribute를 생성하기 위해서 addAttr라는 MEL 명령어를 사용하면된다. 먼저 attribute값을 추가할 오브젝트를 선택한후 다음과 같이 입력한다.
addAttr -ln myCustomAttribute -at double;
새롭게 생성된 Attribute를 keyable값을 true로 만들어주려면(Channel Box에 나타나 key값을 설정해 줄 수 있다.), 다음과 같이 입력한다.
setAttr -e keyable true .myCustomAttribute;
또한 setAttr을 통해 Attribute값을 설정해 줄 수도 있다.
setAttr ,myCustomAttribute 2.25;
만약 attribute값을 얻어야 한다면 getAttr이라는 명령어를 사용하면 된다.
getAttr .myCustomAttribute;
마지막으로, 새로만든 attribute값을 다른 값과 연결시키고자 한다면 connectAttr명령어를 사용하면 된다.
connectAttr .myCustomAttribute .translateY;
이제 translateY속성값과 연결된 attribute가 완성되었다.

10. Array Attribute or Attribute Array?

maya_251_1.jpg
[JPG image (96 KB)]

당신은 문자의 목록을 저장하는 노드에 문자 속성의 배열을 쉽게 만들 수 있다고 생각할지도 모른다. 초보자와 경험있는 MEL 스크립터 양쪽 다 문자 배열 속성이 필요하다는 것을 찾아 낼 것이다. MEL addAttr 문서를 읽고 난 후, 둘 다 stringArray 데이터 타입의 속성을 추가하기 위해 다음과 같은 명령을 시도 할 것이다:

addAttr -ln stringArrayAttribute -dataType stringArray;

필연적으로, 그들은 에러에 감염 될 것인데 그 이유는 속성은 다양한 데이터 타입이라 당신이 하고 싶은대로 쉽게 만들어지지 않아서 여기에서는 멜에서 쉽게 얻고 설정할 수 있는 간단한 문자의 배열을 만드는 것을 목적으로 한다.

모든 속성은 그 속성에 관계가 없이 한 줄의 addAttr 명령을 사용하여 배열로 쉽게 만들어질 수 있다! 이것은 마야가 속성의 데이터 타입에 따른 구분을 만들고 다양한 요소를 속성 배열로 만드는 능력이 있다는 것이다. 마야에는 속성을 "multi" 방식으로 불러오는 옵션이 있으며 이것을 통해 다양한 속성을 가진 배열로 확장될 수 있다. 속성을 multi로 만든 후, 이 속성을 보통의 배열 색인 연산자 - 예를 들면 0, 1, 2... - 를 사용하여 조회할 수 있다. setAttr을 이용해 multi 속성을 만들고 자동적으로 속성을 배열로 확장하는 방법은 다음과 같다:

addAttr -ln myMultiString -dataType "string" -multi;
setAttr -type "string" .myMultiString0 "WOW!";
setAttr -type "string" .myMultiString1 "HERE IS";
setAttr -type "string" .myMultiString2 "AN EXPANDING";
setAttr -type "string" .myMultiString3 "ARRAY ATTR";

이것은 doubles, ints 등의 어떠한 속성으로 설정하더라도 동작한다. 처음 시도한 것이 동작하지 않은 이유는 속성의 데이터 타입이 stringArray일 경우 개개를 따로따로 분리된 요소로 저장하지 않고 한 속성에 전체 배열을 저장하기 때문이다. 마야는 이 문자 배열 속성 데이터 타입을 "복잡한" 데이터로 여기기 때문이다. 그리고 아직 MEL에는 이것에 getAttr을 사용하여 가져올 수 있는 방법이 없다.

11. Object Display Juggling

maya_252_1.jpg
[JPG image (77.87 KB)]

작업을 하는 도중 마야의 모델링 창은 신 파일을 작업하는데 더 쉽게 하기 위해 자주 오브젝트를 보여주거나 끄는것을 설정할 필요가 있다. 이것은 어느 모델 패널에서도 볼 수 있는 맨위에 있는 show 메뉴에서 할 수 있다. 당신은 집중해서 한 작업을 할 때 특정한 오브젝트들만을 보여주게 선택할 것이다. (예를 들면 넙스 표면, 폴리곤, 로케이터만) 그래서 당신은 매번 패널 레이아웃을 바꿀 때 마다 이 설정을 반복해야 한다는 것에 의문을 가지지 않는다. 이 간단한 스크립트를 통해 모델 패널마나 반복적으로 show 메뉴를 통해 설정된 오브젝트만을 표시하게 설정하는 것을 피할 수 있다.

string $wfPanel - 'getPanel -wf';
modelEditor -alo 0 -e -ns 1 -sds 1 -pml -lt 1 -ca 1 $swPanel;

첫번째 줄은 현재 포커스가 맞춰진 패널을 받아오고 두번째 줄은 패널에 표시하고 싶은 오브젝트를 알려준다. 이 명령은 그것에 넙스 표면, 폴리곤, subdiv 표면, 라이트와 카메라를 보여주게 할 것이다. modelEditor 명령에 다른 옵션을 사용하여 보여주고 싶은 오브젝트를 특정지을 수 있다. 다음과 같은 명령을 사용해 사용할 수 있는 옵션을 볼 수 있다:

help modelEditor;

이것을 더욱 빨리 실행하고 싶으면 Marking Menu에 등록을 해두면 간단한 움직임 만으로 디스플레이를 설정할 수 있다.


12. IMAGE ON, OFF

maya_253_1.jpg
[JPG image (321.83 KB)]

production에서 shots의 작업중에는 종종 당신의 background plate에 작업물을 matching 시키는 것도 포함한다. 이 background plate는 대개 Camera image plane의 형태로 이용할 수 있게 만들어진다. image plane을 가지고 하는 꼭 필요한 작업동안에, 당신이 이용할 수 있는 메모리와 기계의 구성에 따라 극적으로 재생속도가 느려지는 경향이 있다. 당신은 어떤 주어진 하나의 image plane이 아니라, secen안에 다양한 image plane을 가지고 있다. 이 image plane1의 경우처럼, 여기에서의 script를 당신의 shelf 안에 놓고 toggles 만으로 Image Plane을 켰다 껐다 할 수 있다.
int $tg1 = {'getAttr imagePlane1.type' == 0) ? 1:0; setAttr imagePlane1.type $tg1;
이것은 사실상 "Image File"에서 "Texture"로 Image Plane의 display type을 바꿔주는 것으로서, modeling windows에서 display를 toggle하는 가장 빠른 방법이다.

13. BIRDS OF A FEATHER CAN BE PROCESSED TOGETHER

MEL은 다른 프로그래밍 언어와 같이 looping constructs를 제공하고, 다른 스크립팅 언어와 같이 다음의 쓸모있는 statement의 형태를 제공한다.
for($object in $object)
이것은 어떤 특징을 공유하는 많은 objects의 act를 쉽게 만든다. 예를들어, 현재 선택된 오브젝트들과 그것들의 primary visibillity off의 목록을 통한 반복을 위해서 당신은 다음의 코드정보를 사용할 수 있다.
string $obj, $objs[] = '1s-s1';
for($obj in $objs)
if('objExists($obg + ".primaryNisibillity")')
setAttr ($obj + ".primaryVisibillity")0;
원하는 attribute를 가지는 오브젝트를 만들기 위해서 첫번째로 체크한 방법에 주목하라. 그것없이 오브젝트를 접한 code는 실패한다.( 또다른 error-checking이 다가오는데, :Oops : Warning, Error, And Catch의 chpater에서 catch commane 사용을 설명한다.) 또다른 예로는 reference group을 지우기전에 명령어를 통해 reference group으로 부터 non-referenced 한 오브젝트들을 꺼낼 수 있다. 이것은 다음으로 할 수 있다. referenced hierarchy를 선택한다. hierarchy에서 모든 오브젝트들의 선택을 위해 -hi를 선택한다. 다음의 코드를 실행한다.
string $obj;
for($obj in '1s = s1')
if(!'refernce -q -inr $obj')
delete $obj;
구조내에서 명령어가 끼워넣어진 방법을 주목하라, 더 간단한 코드에서의 결과이다. 또한 reference 명령어는 당신에게 필요한 정보와 함께 의문을 제공한다.

다른 기술은 명령하기 위한 것에 objects의 그룹을 filter out하기 위한 ls command를 사용하는 것이다. 당신의 scene에 모든 RenderMan과 관계된 subdivision nodes를 제거하는 것을 결정했었다는 것을 제외하고 당신이 RenderMan을 사용하는 것은 제안한다. 당신은 먼저 이 것의 node type이 mtorSubdivnode라는 것을 결정하기 위한 이 nodes중 어느 하나에 nodeType command를 사용 할 수 있다. 그때 당신은 이 code 토막으로 그들을 모두 지울 수 있다.

select -r 'ls -type mtorSubdivNode';
delete;

여기 ls command는 scene안에 모든 "mtorSubdivnodes"를 동질화 하기 위한 -type option으로 사용되어 지고 삭제의 selection list를 만드는 select command에 차례차례 call에 싸여져있다. 당신이 할 수 있었던 ls call에 -sl option을 추가 함으로써, 예를 들면, 현재 선택된 이 type의 nodes에 검색을 좁혀라. ls 문서화를 통해 보고 당신은 당신이 원하는 결과들을 생산하기 위한 mixed된 많은 유용한 options를 찾을 것이다. 이 ls의 복합된 사용과 select commands는 scene file의 내용들을 분석하고 수행하기 위한 강력한 mechanism을 제공한다.
maya_255_1.jpg
[JPG image (552.46 KB)]


14. EXECUTEFOREACHOBJECT AND SELECTEDNODES

마지막 tip에 몇몇의 예들은 모든 선택된 nodes가 언급 되는 것괴 그에 몇몇의 명령이 수행되어 지는 것이 시행되었다. 이 것을 하는 code가 비록 어떤 복잡한 방법에 의한 것이 아닐지라도 MEL은 도울 2개의 편리한 방법들을 제공한다. 처음은 간단히 적절하게 모든 선택된 nodes를 포함한 배열을 되돌리는 selectedNodes command이다. 두번째는 당신이 명령하기 위한 것에 objects의 배열과 그것들 각각에 수항하기 위한 명령을 명확히 하는 것을 돕는 executeForEachObject command이다. 명령은 Script Editor window에 진보적인 feedback을 제공한다. "defLat"이라고 불리는 lattice에 의해 deformed된 몇몇의 geometry를 가지고 있다면 당신은 이것에 추가적인 geometry를 추가하길 원할 것이다. 당신이 처음으로 추가하기 위한 geometry를 선택하는 것을 고려하면 여기에 당신이 어떻게 이것을 성취할 지도 모르는 것이 있다.

string $cmd = "lattice -e -g %s defLat";
string $itemList[] = selectedNodes();
string $results[] = executeForEachObject ($itemList, $cmd);

command definition에 %s는 list 안에 items로 executeForEachObject procedure에 의해 교체되어 질 것이다.
maya_256_1.jpg
[JPG image (514.27 KB)]


15. HEY, BREAK IT UP!

마야에서 절차나 계획대로 할 때, 당신은 종종 자주 사용하는 별도의 요소들의 목록으로 데이터의 단일 문자열을 변환해야한다. 이는 tokenize 명령어로 쉽게 할 수 있다. 이 명령어는 원본 문자열을 분리해 모아서 문자열 배열로 저장한다. 이는 비트 깨진 수를 반환한다. 자, 예를 들어, 당신은 MAYA_SCRIPT PATH 환경 변수에 정의된 모든 경로의 리스트를 얻어 각 경로의 모든 파일을 인쇄하고 싶다. 처음으로 당신은 다음처럼 경로를 검색해야한다.
string $path, $paths[] ;
int $numPaths = tokenize(getenv "MAYA_SCRIPT_PATH", ":", $paths) ;
getenv 명령어를 사용해 유닉스 기반에서는 “:”문자로 윈도우 기반에서는 “;”문자로 구분되는 단일 문자열로 환경 변수의 내용을 반환할 수 있다. tokenize를 사용해 모든 경로를 분리해서 다음과 같은 code block에 접속할 수 있다.
String $file, $files[];
print("searching...\n");
for($path in $paths)
{
print($path + "\n");
$files = getFileList -folder ($path + "/");
for($file in $files)
print("" + $file + "\n");
}
print("done!\n");
getFileList는 지정된 디렉터리에 있는 파일의 목록을 반환하는 또 다른 편리한 명령이다. 여기서 주의할 점은 “/”로 끝나야 한다는 것이다. 또한 프린트 명령문 형식을 확인해야 한다. 이것들은 Script Editor 창에서 정리된 리스트를 생성한다.
maya_257_1.jpg
[JPG image (367 KB)]


16. FBM IN THE AM FOR A RENDER IN THE PM

maya_258_1.jpg
[JPG image (340.3 KB)]

마야의 noise 기능은 여러 상황에 유용하지만, Fractional Brownian Motion(FBM)에서 좀 더 복잡한 패턴을 제공하고 구현할 수 있는 추가 단계로 이동한다. noise 기능은 증가 감소되는 주파수와 함께 시간에 지정된 번호로 겹쳐있다. 주파수 배율(frequency multiplier)은 일반적으로 Lacunarity라고 하고, 일반적으로 2로 설정되고, 이 두 개의 두배 주파수고 레이어의 숫자가 옥타브다.(이는 물론, 음악적 참고로 각 옥타브는 주파수나 음조가 배로 된다.) 각 패스의 진도는 일반적으로 Gain이라는 변수의 의해 반으로 낮춘다. 당신은 FBM의 식의 수치로 정의할 수 있는 기본 주파수와 진도로 시작한다.
float $mag = 2.0;
float $freq = 0.1;
float $lacunarity = 2.0;
float $gain = 0.5;
int $i, $octaves = 10;
float $sum = 0.0;
for ($i=0; $i<$octaves; $i++)
{
$sum += $mag * noise(time * $freq);
$freq *= $lacunarity;
$mag *= $gain;
}
fbmLoc.translateY = $sum;
여기 나는 fbmLoc라는 로케이터를 만들었고, translateY 설정에 FBM결과를 매핑했다. FBM expressiondml 복잡함을 보려면, locator를 선택하고, Graph Editor를 열어 View>Show Results를 체크해라. 다른 진도와 주파수 값을 시도해라. 노이즈 기능의 옵션에서 이상적인 값을 얻을 때 까지. 결과가 일반적으로 보는 난류로 보이도록. 여기 라인을 수정했다.
$sum += $mag * abs(noise(time * $freq));

17. How far aprat are they?

maya_259_1.jpg
[JPG image (519.73 KB)]

두개의 물체를 거리를 바탕으로 조정하면상당히 편리하다. 두개가 서로 다가오면, 그들의 비율이나 쉐이딩 같은 작업을 해놓은 attribute의 값을 바꿀 필요가 있을 것이다. 이 거리를 계산할 빠른 expression이 있다.

//2 오브젝트의 위치를 뽑아낸다.
vector $pos1v = 'xform -q -ws -t object1';
vector $pos2v = 'xform -q -ws -t object2';
//두 물체의 거리를 계산한다.
float $dist = mag($pos2v - $pos1v);
//그 결과로 작업한다.
print($dist + "\n");

Xform 명령어는 각자의 물체에 World space(WS)안의 translate values(-t)로 움직이게 쓰인다. 이 결과들은 버전6안의 새로운 편안한 기능인 mag 명령과 함께 사용하기 위한 벡터들로 바로 저장된다. mag는 vector의 크기 값을 돌려주고 이 안에서는 두 물체의 벡터 값에 해당된다. 물체의 x,y,z 구성성분안의 차이점의 사각형을 더함으로써 수동적으로 구할 수 있다. 그러나 앞의 기능을 사용하는 것이 좋다. 다른 units 와 같은vector-based commands를 사용할 수 있다. 이 불 파티클과 같은 정보들을 사용할수 있다.

18. Yum ENUM

maya_260_1.jpg
[JPG image (159.7 KB)]

enum attribute의 값을 취합하는 것은 오직 의미있는 문장을 치는데 모든시간을 보낸 뒤에야 선택된 물체의 index를 넘겨주기만 한다. 이제 attribute의 option menu는 new -asString flag를 씀으로써 정해지는 string을 받을 수 있다. charClaothing 노드를 위해서, 각각의 clothing descriptor enum attribute는 다른 index로 정해진다. shoes attribute의 새로운 flag를 쓰는 것은 예를 들어 string sneakers,3번과 반대되는 값을 돌려주는 것과 같다. 여기 훌륭한 명령어가 있다.!

string $shoeType = 'getAttr -asString "charClothing.shoes"' ;


19. Clean up those dirty nodes

maya_260_2.jpg
[JPG image (115.66 KB)]

생각했던대로 업데이트가 되지 않은채로 scene file이 저장된 상황을 격어 본적이 있을 것이다. dgdirty -a 명령어를 쓰면 쓸데 없는 node들을 지우고 scene을 업데이트 할 수 있다. 이것은 모든 것이 제대로 정렬 되어 있는 것 확인할때 지정된 노드를 불러올 때 쓰인다. 마야 안의 모든 노드는 intput과 같은 데이타 어떤 연산을 실행하고 그리고 output과 같은 결과를 제공해 준다. 새로운 데이터가 node의 input에 들어감으로써, 그 노드는 마야에 의해서 더럽혀 지고, 그것의 output를 업데이트하여 다시 재 연산이 들어 간다. 이러한 방법으로, 전체 scene graph는 깨끗해진다. 이 dgdirty 명령어는 사용자가 수동적으로 마야의 좋지않은 정보를 업데이트하게 하고 -a 옵션은 더러운 모든 노드를 지정하여 Maya로 하여금 모든 것을 다시 계산하게 만든다.


20. Expeand your horizons and your filter

특정타입의 오브젝트들이 현재 선택되어졌는지 이해하기위해서 filterExpand command가 절대 필요하다. ilterExpand command는 오브젝트들을 구별하고 마스크를 통해 리스트 선택 위에서 구성한다. 예를들어 만약 당신이 어떤 넙스 커브들이 선택되었는지 알기를 원하고 어떤 작동이전에 유저에게 경고해주기를 원한다면 당신은 지금 말할 CV mask command를 사용해야한다.
filleterExpand -sm 98;
이는 빽빽하게 선택된 CVs의 리스트들을 복귀시키거나 생략하거나 포멧한다. 만약 당신이 각각의 아이템으로써 결과가 분리되기를 원한다면 previous call에 expand flag를 덧붙이면된다.
이는 fillterExpadn -ex true -sm 28; 이다
이 command는 빽빽한 리스트들을 "flatten"이라 불리는 옵션으로 각각의 아이템들로 복귀시킨다.
maya_261_1.jpg
[JPG image (61.48 KB)]


21. to backtick or not to backtick

스타일에 관한 물음들이다. MEL commands는 수행값을 복원하기위해 backtick(') command로 인해 의해 inline이 실행되어진다.
string $objs[] = 'ls -sl' ;
if (!'size $objs') print {"nothing selected!|n");
추가로 MEL commands는 괄호안에 parameter list를 가지는 command가 따라와 더 친근한 프로그래밍스타일 실행되어진다. 이 구문을 사용하면 이전 line이 된다.
if (!size($objs)) print ("nothing selected!|n");
-esque 스타일 프로그래밍의 이점은 commnad embeding의 multiple levels를 생성할 수 있다는 것이다.예를 들어 이전문장을 한라인에 다시쓸 수있다.
if (!size('ls -sl)) print("nothing selected!|n");
or even:
if(!size(ls("-sl")) print("nothing selected!|n");
하지만 이렇게 하면 에러가날 수 있다.
if(!'size'ls- sl'') print("nothing selected!|n");
as will:
if(!'size ls("-sl")') print("nothing selected!|n");
괄호스타일의 프로그래밍을 사용할때는 따옴표안에 간단히 command parameter options를 배치해야한다. 그리고 콤마로 각각의 parameter를 분리시켜야한다.그래서 모든 선택된 카메라 리스트를 위해 문장에서는 command는 이렇게 사용한다.
ls("-sl", "-ca")
maya_262_1.jpg
[JPG image (63.83 KB)]


22. lost&found

버전 6.0이 되면서 Is 명령어는 한번에 모든 네임스페이스를 검색한다.현재의 네임스페이스에 없는 오브젝트를 못찾는 좌절은 반복되는 -r 플래그에 의해 없어진다. 이 플래그는 토글키로서 따라서 "1"을 그 뒤에 붙여서 사용한다. 여기 네게의 큐브로 예가 있는데, 각각 다른 네임스페이스로 되어 있다. 이제 당신은 그것들의 네임스페이스가 가려져 있어도 그것들을 확인해서 Federation 공간을 줄일 수 있다.
maya_263_1.jpg
[JPG image (335.5 KB)]


23. tracking your customers

maya_264_1.jpg
[JPG image (166.88 KB)]

만약 당신이 절차로 어떠한 툴을 기록하고 있다면 그리고 그것을 일지로 남겨두고 싶다면 MEL을 사용해서 사용자를 추적할 수 있다. 다음에 나오는 unix기반의 짧은 코드는 (윈도우는 안된다) 가급적 너의 과정 시작부분에 놓고, 매번 파일을 만들 때 이 과정을 실행하고 유져의 파일네임을 확인하는 방법을 택한다. myToolLogs란 이름의 디렉토리를 unix기반의 시스템에서 사용시 당신은 너만의 디렉토리를 만들 수 있고 $logDirName변수로 특별하게 쓸 수 있다. 디렉토리를 사용하기로 확정 한 후에는 나는 사용자가 툴을 사용하는 시간과 날짜와 사용자의 이름을 합침으로서 log 파일의 이름으로 구성한다. 파일이름은 .log 확장자와 함께 쓰인다. 당신은 독특한 파일이름이 있는 한 어떠한 파일이름도 만들 수 있고 기존에 있는 파일을 바꿀 수 없다. 파일은 unix 명령어에 의해서만 디스크에 만들어진다. 그리고 그것은 마야의 MEL명령어에 의해서 실행된다. 만약 너가 이 시스템 명령어에 익숙하지 않다면 너는 알아야 한다. 이것은 마야로 하여금 명령을 실행해서 시스템을 작동시키고 결과를 가져오는 명령을 실행하기 때문에 매우 유용하다. getenv는 os 상호작용과 환경변수의 값을 가져오는 다른 손쉬운 방법이다.여기에 사용자의 로그인 이름이 있다. log 파일을 사용시 생기는 잠재적인 에러를 피하기 위해서는,시스템 명령은 catchQuiet 키워드에 의해 둘려 쌓여 있다. 이 키워드는 에러에도 불구하고 스크립트가 진행을 계속하게끔 한다. 만약 당신이 이 툴을 자주 쓰기로 계획한다면 너 자신 스스로 log들로부터 제외되어야 한다. 이것은 아래에 나오는 이전의 코드를 보호함으로써 쉽게 수행되어진다.

24. ARE YOU SURE YOU WANT TO DO THAT?!

취소하기 불가능하거나 어려운 작업을 수행하는 멜 프로세스를 개발할 때, 사용자가 작업을 확인할 기회를 주는 것이 좋습니다.
이 선택 명령은 confirmDialog라고 불리며, 편집 가능한 텍스트 메시지 팝업 창이 사용자에게 생성되고, 뿐만 아니라 ok와 cancel
버튼을 지명할 수도 있습니다. 다음 명령의 결과를 체크하고 그에 따라 진행합니다. 디스크의 모든 컴파일된 쉐이더를 삭제하는
버튼을 인터페이스에서 확인하고( 우리가 RenderMan으로 오래된 쉐이더를 사용했기 때문에), 신중하게 기회를 사용자에게 다시
부여합니다, 예를들어, 그 또는 그녀가 실수로 단추를 누르게 됩니다. 여기 그것에 해당하는 코드입니다.

string $confirm = 'confirmDialog -title " CONFIRM"
-message ("About to delete all compiled shaders on disk! Proceed? " ) -button
"Delete" -button " Cancel " -default Button "Cancel" -cancelButton " Cancel" ' ;
if($confirm =: " Delete")
{
print ("deleting..." ) ;
}

짧고 의미있는 메시지는 사용자를 위해 설정되고, 버튼은 Delete와 Cancel로 이름 지어지며, 확인중인 작업을 위해 적절하게 합니다.
사용자가 생각 없고 조급한 키 입력을 할 경우 기본단추 또한 안전을 위해 취소 단추로 설정되어집니다. 우리는 쓸 때 없는 실수에서
사용자를 보호하기 위해 거기에 대한 의심을 개발할 수 있도록 불편함을 개선할 것입니다. 버튼을 클릭한 후, confirmDialog 명령으로
되돌리고 만약 사용자 작업을 승인한다면 Delete 줄에 반대되게 비교되어집니다. 만약 그렇지 않다면, 아무 일도 없이 이동할 것입니다.
당신은 비슷한 팝업창의 메커니즘을 통해 사용자가 생각하는 만큼의 일부 입력을 얻을 수 있을 것입니다. 더 이상, MEL은 promptDialog
명령으로 덮여져 있지 않을 것입니다. 마야 사용 설명서를 확인하시기 바랍니다.
maya_267_1.jpg
[JPG image (29.53 KB)]


25. SWITCHING ON YOUR BUD, THE HUD

maya_268_1.jpg
[JPG image (33.13 KB)]

화려한 Heads Up Displays(HUDs)을 이용한 전투 비행 시뮬레이션을 기억하고 있습니까? 글쎄, MAYA는 그것들을 얻었고, 당신은 이미
그것들 중 일부에 익숙하며, 모델링 창의 아래 중간과 표시 설정하거나 전환할 수 있는 왼쪽 아래 모서리에 나타나는 축 사이에
카메라 이름과 같은, Heads Up Display 서브 메뉴가 있습니다. 괜찮은 것은 중요한 정보가 구성되어 직접 HUD를 정의하고 MEL 명령을
설정하거나 전환할 수 있습니다. headsUpDisplay 명령은 화면에 문자열을 제공하는 설정의 핵심이고, 뿐만 아니라 문자열 데이터와
텍스트를 표시할 창의 영역을 분류 할 수 있습니다. 다음은 모델링 창 상단 중앙에 현재 장면의 파일 전체 경로를 표시하게 하는 예입니다.

headsUpDisplay - section 2 -block 2 -blackSize "medium"
- label " File Counts :"
- label font Size "large "
- command "file -q - sn"
fileNameHUD;

HUD를 표시할 화면 공간에 섹션 및 블록 매개 변수는 명령을 지시하게 되고, MAYA HUDs로 미리 배정되어진 약간의 슬롯들과 충돌이
발생했을 때 일부 실험이 필요하게 됩니다. HUDs 위치지정에 대한 많고 자세한 MAYA 문서로 가면 당신은 확실히 그것들을 통해 읽을
수 있을 것입니다. 레이블과 그것의 사이즈를 설정하고 화면에 문자열을 반환하는 명령을 정의할 수 있습니다. 여기에 파일 명령은
직접 호출 되어지지만, 당신이 종종 당신 자신의 화면에 어떤 데이터를 수집하거나 포맷하기 원하는 전역 프로세스를 작성하기를
원하지 않을 것이다. 마지막으로 의미있는 이름은 나중에 참조할 HUD를 할당하게 됩니다. HUD를 제거하고, 명령을 따를 수 있으며,
HUD의 이름을 줄 수 있습니다.

headsUpDisPlay - remove "fileName HUD) ";

명령 주위 매개변수에 HUD를 유지하고 표시 유형을 전환할 수도 있습니다.

26. KEEPING YOUR VARIABLES HANDY

maya_269_1.jpg
[JPG image (171.2 KB)]

만약 하나의 마야세션이나 씬파일을 벗어나서 변수와 그 값을 유지할 필요가 있다면 , OptionVar의 preferences를 이용해 저장할 수 있다. 마야는 File menu에서 현재파일이나 프로젝트를 저장할때도 편리하게 이 매커니즘을 쓴다. 이 명령은 scalar나 int, float, string의 배열도 가능하다. 배열에 추가하거나 지우는 방식으로 이미존재하는 변수를 제거하고, 현제의 모든 옵션값을 목록화 시킬수 있다. 만약 부서에 따라 다른작업을 수행하는 도구를 작성할때에는 다음 코드를 사용하면 된다.
string $dept;
if{]optionVar -exists "userDept"}
&dept='optionVar -q "userDept"';
if{$dept=="fx"}
print("You're in the FX department!"};
변수의 존재여부를 확인하고, 몇가지 행동양식을 위해 다음을 불러와 사용하면 된다.
optionVar -stringValue "userDept" "fx";

27. SCOPING OUT THE SCRIPT EDITOR

maya_270_1.jpg
[JPG image (166.26 KB)]

만약 Script Editor 창에서 수많은 빠른 스크립트개발이 끝났다면, "Invalid redeclaration of variable" 문제의 발생에 대해서 의심할 필요가 없다. 이 모든것을 피하기 위한 좋은 기술은 {}를 사용하여 토막내는 것이다. 이건 기본적으로, 코드를 실행한 후에 만들어진 변수의 타입을 변경할 수 있도록 코드의 묶음을 정의하는 것이다. 변수를 선언할때 자주 발생하는 실수는 다음과 같이 문자열 배열변수가 필요할때 문자열변수를 만드는 것이다.
string $objs ='ls -sl';
마야는 string[]형태의 데이터를 string형태로 변환시킬수 없어 혼동할 것이다. 문장은 다음과 같이 바뀌여야 한다.
string $objs[]= 'ls -sl';
마야는 이제 변수 재선언에 관련해서 혼동할 것이다. 다음과 같이 문장을 묶자.
{
string $objs[] = 'ls -sl';
}
이제 즐겁게 다시 선언하자!
}

28. When in doubt, see what the node's about

마야의 종속 그래프 노드의 자세한 정보를 얻는 매우 좋은 방법은 온라인 문서의 node reference 항목에서 찾아보는 것이다. 이것은 노드의 퀄리티에 대한 몇 개의 속성을 찾고자 하지만 마야의 어떤 에디터에서도 찾을 수 없을 때 매우 편리하다. 내가 reference에서 필요한 것을 찾은 것 만이 아니라, 이 것은 키를 지정할 수 없고 인터페이스에서 숨겨져 있다는 것이었다. 좋은 예로 NURBS의 surface normals를 보자면, 나는 인터페이스에서 이 길이를 조절하는 어떠한 방법도 찾지 못하였다. 이에 비해 Polygon normals에서는 길거나 중간이거나 짧게 보여줄 수 있지만 GUI상에서는 마음대로 사이즈를 조절할 수 없었다. polygon normals가 최소한 3가지 다른 크기로 보인다는 것을 고려하고 node reference를 펼쳐보자 nurbsSurface node가 내가 원하는 역할을 하는 것을 알 수 있었다. "normal"이라고 검색을 하고 찾다보니 normalsDisplayScale, 줄여서 ndf 라는 속성을 찾았다. 스크립트 에디터 창에서 연습해보고 이것이 내가 찾던 그것이라는 것을 알아서 간단한 GUI로 만들어 사용자들이 선택된 오브젝트의 노멀의 값을 특정할 수 있게 만들었다. 그 후 mesh node page로 가서 normalSize, 줄여서 ns 라는 속성을 찾았는데 이는 polygon에 대해 같은 역할을 한다. 문서 초기화면 왼쪽 하단에 있는 developer's resources folder에 있는 "nodes and attributes" 링크를 누르면 node reference를 찾을 수 있다.
maya_271_1.jpg
[JPG image (277.98 KB)]


29. Golly g, we're matching

maya_272_1.jpg
[JPG image (173.33 KB)]

아직 준비가 되지 않았다면, gmatch 명령을 MEL toolbox에 추가해둬라. 이것은 특정 패턴으로 이름 지어진 오브젝트를 판단하는데 매우 좋은 방법이다. 이것은 ls 명령과 함께 같은 이름이 붙은 오브젝트의 그룹에 대해 무엇을 실행 할 때 매우 좋다. 예를 들어 자동차 광고를 만든다고 생각하자. 이럴 때 신에는 여러 대의 차가 있고 이름을 "vehicle_####"의 패턴에 ####은 인식 넘버인 형식으로 만들어 져 있을 것이다. 거기에 신에는 도로, 주유소 같은 수많은 배경 물체가 다른 형식의 이름으로 있을 것이다. 만일 차량에 대해서만 어느 작업을 실행하고 싶을 경우에는, 다음과 같은 간단한 코드로 실행할 수 있다:

string $ns;
for($ns ln 'namespaceInfo -lon')
if (gmatch($ns, "vehicle_????"))
print($ns)

이 예제로 간단하게 차의 이름을 출력할 수 있고, 쉽게 이름을 알 수 있다는 것을 알 수 있다. namespaceInfo 명령에 -lon 옵션을 주면 신에 있는 모든 이름을 반환한다. 그리고 gmatch 명령은 이를 걸러주는 역할을 한다. gmatch 명령은 대부분의 공통된 표현을 직접 받아들이고 찾으면 참을 그렇지 않으면 거짓을 반환한다. gmatch는 유닉스의 grep 명령과 비슷하다.



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2012-05-08 14:46:15
Processing time 0.4025 sec