| Àμâ |
Conversational MEL Part 1

www.NimbleStudiosInc.com
ÀÌ À̸ÞÀÏ ÁÖ¼Ò´Â ½ºÆÔ¸Ó·ÎºÎÅÍ º¸È£µË´Ï´Ù. º¸½Ã·Á¸é ÀÚ¹Ù½ºÅ©¸³Æ®¸¦ Ȱ¼ºÈ­ ÇϽʽÿä

이번 호부터 연재할 MEL 시리즈. 번째 글이다! 이번 글에서는 기본기를 찬찬히 연마하고 다음 글부터는 빨리 진행하도록 하겠다. 오늘 글을 읽은 후에는 MEL 커맨드가 무엇인지를 이해하고, 간단한 작업을 MEL 자동화하고 간단한 UI 만들어 있게 것이다.


What Is Mel?

MEL “Maya Embedded Language” 준말로서 “Maya 코어 라이브러리의 인터페이스 역할을 하는 스크립트 언어이다. 독자 여러분들이 과연 글을 계속 읽어야 할지 말아야 할지를 생각하게 정도로 지루한 정의이다. 그뿐 아니라 위의 정의는 아주 중요한 점을 놓치고 있다: MEL 여러분의 아트(art) 쉽게 레벨- 시킬 있는 도구이다.

 

Maya에서 하는 모든 Maya에서 있는 모든 것들이 MEL 구성된다. 메뉴, 체크박스, 슬라이더, 헤드- 디스플레이, 아웃라이너, 어트리뷰트 에디터, 등등 모든 것들이 MEL 만들어졌다. Maya에서 체크 박스를 체크하고, 슬라이더를 움직이고, 매니퓰레이터(manipulator) 조작할 때마다MEL 수행되고 있는 것이다.

 

이렇듯 MEL Maya 밀접한 관계를 이루고 있기 때문에 다음과 같은 일을 하는 데에 매우 유용한 툴이 된다:

  1. 반복적인 작업을 자동화해서 클릭수를 줄여준다 주일에 100시간 일하면서 하는 마우스 클릭 보다 많은 수의 클릭을 하는 스크립트를 만들 있다!
  2. 나만의 맞춤 UI 제작한다 일부 바보 같은 Maya UI 대해 평소에 불만이 많았다면 이제는 MEL 직접 UI 바꾸어 보자!
  3. 오늘날 컴퓨터의 뛰어난 성능을 이용하여 복잡한 수학 연산을 수행하게 하고 차세대 이펙트와 툴을 만든다!
  4. 기타 등등!

 

이렇게 쓰다 보니 앞서 던져 놓은 “What is MEL?” 이라는 질문의 답은 정작 같다. 자세한 사항은 뒤에서 차차 다루겠지만, 일단은 MEL 매우 유용하고 쉽다는 것만 알아두자. ( 글을 읽었을 즈음에 MEL 대한 두려움이 날아가 버렸기를 바란다.)


Command Line and Script Editor

“MEL 절대 반지의 화신이다식의 미사여구로 독자 여러분을 여기까지 읽게 만들었으니, 이제는 현실을 보여주어야 때이다: MEL 프로그래밍 언어이다. MEL 커맨드(command), 플래그(flag), 인자(argument), 루프(loop), 조건문(conditionals) 등등 무시무시한 (또는 지루한) 것들로 이루어져있다. MEL 사용하기 위해서는 커맨드를 Maya 보내야 한다.

 

하지만 들리는 것만큼 그리 어렵지 않다 진짜다. 지금 당장 보자. Maya 제일 아래쪽을 보면 커맨드 라인(Command Line) 커맨드 피드백(Command Feedback)이라고 불리는 부분이 있다:


 

Command Line and Status Feedback

 

Command Line 여러분이 간단한 MEL 넣는 인풋 필드(input field)이다. Command Feedback 최근에 수행된 MEL 커맨드에 대한 정보를 보여 주는 곳으로 문제 발생시에 빨갛게 변한다.

 

정도만 알면 시작할 있다 지금 당장 Command Line 아무 것이나 써보고 Enter 키를 과감하게 눌러주자

 

보았나? MEL 전혀 보지 않았다면 에러가 났을 가능성이 매우 크다 매우 똑똑한 독자라면 Command Line 아무 것이나라고 썼을 지도 모르겠다. 보통은 이런 결과가 나왔을 것이다:


Command Line Error

위와 비슷한 경우라면 Command Feedback 빨갛게 변하면서 다음처럼 에러가 있다고 알려주고 있을 것이다:


Error: line 1: Cannot find procedure "alsdjf".

앞에서 MEL 커맨드로 이루어져 있다고 말한 있다. (MEL 커맨드는 때때로 프로시져 (procedure) 라고 불리기도 한다. 엄격히 말하면 둘은 다른 것이지만 종종 혼용되어 쓰이곤 한다) MEL 커맨드는 특수 예약어로서 Maya에게 특정 액션을 하라는 뜻을 전달한다. 일상 언어에서의 명령어와 비슷하다고 보면 된다: “앉아”, “오늘 야근하세요” “ ” – 들은 모두 명령어로서 애완견, 직장 부하, 친구들에게 법한 말들이다.

 

우리는 위와 같은 명령어를 명령어에 맞는 특정한 반응을 기대한다. 직장 상사가 오늘 야근하세요라고 때에는 부하가 저녁 약속을 취소하고 야근할 거라고 기대한다. 애완견에게 앉아라고 하면서 강아지가 앉기를 기대하지 스타벅스에 가서 카푸치노를 오리라고 기대하진 않는다.

 

Maya에서도 마찬가지이다: MEL커맨드는 액션과 연관되어 있다. Command Line 특정 MEL 커맨드를 쓰면 Maya 커맨드에 맞는 액션을 한다.

 

하지만 모든 단어나 문자 조합이 액션과 연결되어 있는 것은 아니다 다른 말로 하면 사용 가능한 MEL 커맨드는 한정되어 있다. 타당치 않은 MEL 커맨드를 사용하면 위와 같은 에러가 생기게 된다. 실생활에서 실험해보자.  옆의 친구에게 “alsdfj!”라고 외쳐 보시라. 아마도 뭐야!” 라고 하며 당신을 이상하게 쳐다볼 것이다. ( 기사는 독자의 MEL 능력에 초점을 맞추며 인간 관계 등에 대해서는 좋은 참고서가 아닙니다)

 

이제 우리는 “alsdfj” 아무 것이나 바른 MEL 커맨드가 아니라고 배웠다. 그렇다면 바른 MEL 커맨드는 어떤 것이 있을까? MEL 관련된 다른 UI 스크립트 에디터(Script Editor) 에서 답을 찾아보자.

Launch the Script Editor
Script Editor Error

Maya 오른쪽 아래에 있는 버튼을 누르거나Window > General Editors > Script Editor 메뉴를 통해서Script Editor 연다.

 

Script Editor 열자 마자 MEL 정복을 향한 우리의 멋진 탐험 흔적이 엿보인다:

alsdjf;
// Error: line 1: Cannot find procedure "alsdjf". //

Command Line Command Feedback 있던 것과 같은 정보이다. 하지만 위에는 다른 메시지들이 보인다 전에 수행한 커맨드들의 로그이다. Script Editor 윗부분은 히스토리 (History Pane)이라고 하며 아래는 인풋 (Input Pane)이다.  

Script Editor Panes


Input Pane
크고 발전된 버전의 Command Line 이라고 있다 Input Pane에서는 여러 줄에 달하는 MEL 커맨드를 번에 있다. 여러 줄의 MEL 커맨드 쓰기 때문에 Input Pane에서 Enter 키는 바꿈 역할을 한다. 따라서 커맨드를 수행하기 위해서는 (또는 커맨드를 Maya 보내기 위해서는) Ctrl + Enter 키를 치거나 숫자판에 있는 Enter키를 사용해야 한다. 커맨드를 수행하면 Input Pane 있는 커맨드는 History Pane으로 올라가버리는데, Input Pane 잡아 두고 싶으면 커맨드를 수행하기 전에 마우스로 선택을 하면 된다.

 

사용자가 수행하는 MEL 커맨드와 외에 Maya 자동으로 수행하는 MEL 커맨드는 디폴트로 History Pane 올라간다. 때문에 History Pane Maya 하는 일들을 알아내기에 좋은 방법이다. 더욱 중요하게는 우리가 원하는 작업을 어떻게 MEL 구현하는 알아내기에 좋은 장소가 된다.

 

Maya 열었다면 History Pane 다지 많은 정보가 있지는 않을 것이다. 하지만 것만으로도 MEL 커맨드를 찾아낼 있다:


Script Editor Startup
 

file -f -new docServer -start MEL 커맨드이다.   정확하게 말하면 file docServer만이 커맨드이고 ‘-‘ 뒤에 따라 오는 것들은 커맨드 플래그’(command flag)라고 한다.  커맨드 플래그에 대해서는 나중에 다루겠다. 일단은 file -f -new; 마우스로 선택하여 복사 (Ctrl+C) 하고 Input Pane  붙여넣는다(Ctrl+V).

 

준비 되었는가? ... 커맨드를 실행하자! Ctrl+Enter 누르고 지켜보자! ...

 

... 다른 일이 없는 것처럼 보일 수도 있다. 하지만 우리는 방금 File Menu 열거나   바의New Scene Button버튼을 누르지 않고서 파일을 열었다. 다시 해보자 스피어(sphere) (cone) 등을 만들고서 file -f -new 해본다...

 

후후... 멋지지 않은가? 것은 단지 시작일 뿐이다. 우리의 친구 History Pane Input Pane 함께 탐험해 보자.


Grabbing Output and Reusing


가장
흔히 언급되는 MEL 능력 하나는 반복적인 워크플로우의 자동화 (automate repetitive workflows)” 이다 많은 튜토리얼과 문서에서 구절을 외친다 ( 튜토리얼도 예외가 아니다). 그렇다면 당연히 이런 의문이 것이다. “. MEL 사용해서 정확히 어떻게 반복적인 작업을 자동화 있다는 것일까?” 어떤 사람은 이렇게 답할 지도 모른다. “먼저 해당 워크플로우를 실행한 다음, MEL 써서 자동화 하세요”. 듣는 사람이 법한 답은 실은 정확한 편이다.

 

그럼 먼저 여러분 모두 자동화하고 싶어함에 틀림 없는 워크플로우부터 시작하겠다: 스피어(sphere) 만들기이다! – 운이 좋으면 스피어를 움직이고 크기를 조절할 시간이 있을 지도 모르겠다.

 

Create > Poly Primitives > Sphere 메뉴로 가서 스피어를 하나 만들어 준다. History Pane 새로이 줄이 생겼을 것이다: 
 
Create Sphere

polySphere -r 1 -sx 20 -sy 20 -ax 0 1 0 -tx 2 -ch 1;
// Result: pSphere1 polySphere1 //


첫번째
줄은 바른 MEL 커맨드이고 두번째 줄은 코멘트(comment, 주석)이다. 코멘트에 대해서는 다음 호에 설명하겠다. 오늘은 Maya 코멘트를 철저히 무시한다고만 기억해 두자. 수행하던지 말던지 아무런 차이가 없다. 앞서 했던 것처럼 줄을 Input Pane 복사하여 수행시키면 스피어가 생길 것이다. 스피어를 움직여 보고 크기도 조정해 보라.


History Pane 이러한 것이 나타날 것이다


Moved Sphere

필자의 경우 다음과 같은 줄이 생겼다:

move -r 0 0 -1.941666 ;
move -r 0 1.192061 0 ;
scale -r 0.540501 0.540501 0.540501 ;

라인마다 시작은 단어로 되어 있고 뒤를 이어 숫자나 다른 글자들이 나타난다. 줄을 시작하는 단어는 앞에서 보았듯이 MEL 커맨드이며 뒤를 잇는 글자와 숫자는 MEL 플래그(flag) 인자 (argument)이다.  이에 대해서는 조금 뒤에 설명하겠다.

 

move 시작하는 처음 줄은 스피어를 움직이는 MEL 커맨드이다. 마지막 줄의 scale 스피어를 축소 확대시키는 MEL 커맨드이다.

 

약간 과장을 보태서 이를 워크플로우라고 치고 다음 단계인 ‘MEL 사용해서 자동화하기 넘어가겠다.

 

전에 확인 차원에서 다섯 줄을 Input Pane 붙여 넣고 실행시켜 보자...

 

...모든 것이 제대로 되었다면 이제 스피어가 같은 크기를 가지고 같은 위치에 놓여 있을 것이다. 엄밀히 말하면 워크플로우를 자동화한 셈이다. 하지만 복사 붙여 넣기 작업은 섈프(shelf)같은 UI 있는 버튼과 비교하면 쿨하진 않다.
하하하!  여러분은 행운아이다. Maya 스피어 제작 이동에는 세계 제일의 툴이다. 뿐만 아니라 덤으로 shelf 버튼까지 제공한다.

 

Shelf 사용하기 위해서는 History Pane에서 전의 다섯 줄을 선택하고, 중간 마우스 버튼으로 이를 드래그하여 Shelf위에 하고 올려 놓는다. 


Drag And Drop

다음과 같이 생긴 버튼이 생길 것이다:

New Shelf Button

버튼을 클릭할 때마다 방금 선택한 MEL 커맨드들이 수행된다. 이러한 과정을 이용하면 MEL 직접 쓰지 않고도 Maya에서 하는 많은 작업을 손쉽게 캡쳐하고 저장하여 반복할 있다.

 

스켈레톤이나 prop 파일을 임포트할 History Pane 눈여겨 보시라   버튼으로 저장해 놓고 반복해서 만한 것이 있을지도 모른다

Mel Command Syntax


복사, 붙여넣기, 마우스 드래그, 클릭 등을 충분히 연습하였으면 다음 과정으로 넘어가자: MEL syntax (문법)이다.
 

앞에서 보았듯이 합법적인 MEL 커맨드는 한정되어 있으며, 잘못된 MEL 커맨드를 쓰면 Maya 에러를 낸다. 까다로운 Maya 외에도 여러 가지 룰을 만들어 놓았다. 첫번째 룰은 너무 간단해서 쉽게 잊어버리곤 한다:
 

모든 라인은 세미콜론 ‘;’으로 끝나야 한다.


MEL 커맨드를 하나만 수행할 경우에는 그다지 중요한 룰이 아니지만 하나 이상을 경우에는 피할 없는 법칙이다. 하나의MEL 커맨드가 끝나고 다음 MEL 시작한다는 것을 제대로 인식하기 위해서 필요한 법칙이다. History Pane 살펴보면 코멘트를 제외한 라인은 세미콜론으로 끝난다. 또한 줄에 MEL 커맨드 하나씩만 있는데, 이는 항상 그러한 것은 아니다. 가지 예외 상황을 제외하고는 공백, 줄바꿈, 탭은 모두 똑같이 whitespace 인식된다.
 

장에서 사용한move 커맨드들을 다음처럼 써도 같은 효과를 가진다:

move -r 0 0 -1.941666; move -r 0 1.192061 0;

이렇게 하여도 마찬가지이다.


move -r 0 0 -1.941666      
; move
-r 0                      1.192061 0 ;

예제 모두 세미콜론만 위치에 있으면 똑같이 작동할 것이다.


다음 룰은 MEL 커맨드 구조에 관한 것이다. 보통의 MEL 커맨드는 부분으로 나누어진다:


커맨드이름   

플래그 인자 (flags and Arguments)  

커맨드타겟


플래그는 ‘-‘ 뒤에 오는 문자나 단어를 말한다. 앞에서 나온 file 커맨드에서:

file -f -new;
 

-f -new모두 플래그이다. 플래그는 커맨드가 어떻게 작동해야 하는지에 대한 세부 사항을 나타낸다. 일상 언어와의 비교로 돌아가 보면, 애완견에게 앉아라고 하는 대신에 여기에 앉아라고 하는 식이다.

file커맨드는 여러 개의 동작을 있기 때문에 (저장, 열기, 임포트 ...), 위에서 -new플래그는 파일을 저장하거나 열지 말고 파일을 만들라고 지시하는 것이다.


모든 플래그는 간소(short)화된 형태와 (long) 형의 가지 형태를 가진다. 위의 ‘move’ 커맨드에서:

move -r 0 0 -1.941666;

-r -relative플래그의 간소화된 형태이다. 플래그는 커맨드 타겟의 현태 위치로부터의 이동 거리를 나타낸다. 이와 반대로 -a또는 -absolute플래그는 커맨드 타겟의 절대 위치를 지정한다.


move -r 0 0 -1.941666;



move -relative 0 0 -1.941666;

동일한 결과를 만든다.

 

플래그와 짝을 이루는 것은 인자(arguments)이다. 파일을 새로 만드는 데에는 한가지 방법 뿐이기 때문에 file커맨드의 -new플래그는 따로 인자를 필요로 하지 않는다. 하지만 polySphere 경우가 다르다:


polySphere -r 1 -sx 20 -sy 20 -ax 0 1 0 -tx 2 -ch 1;

플래그 마다 하나 이상의 숫자가 따라온다. 숫자들을 플래그 인자라고 하며, 커맨드의 동작에 대해서 자세한 사항을 지시한다. (지겹더라도) 일상언어 예로 다시 돌아가 보면, “여기 앉아라는 말은 실은 여기라는 장소에 앉아라는 뜻이다. 경우에 앉아 커맨드, “장소 플래그 여기 인자가 된다. 만약 앉아라는 MEL 커맨드가 있다면 이렇게 것이다:

앉아 장소 여기”;

 polySphere커맨드의 경우, ‘-sx -sy플래그는 x y 방향으로의 분할 (subdivisions, 서브디비젼) 수를 나타낸다 ( 플래그의 long form -subdivisionsX -subdivisionsY’). 플래그에 인자값 20 넘어가서 x y 방향으로 20부분으로 분할된 폴리 스피어가 생겼다.

 

커맨드는 보통 여러 개의 플래그를 받을 있으나 커맨드마다 받을 있는 플래그는 정해져 있다.

 

가지 짚고 넘어 가야 점은 커맨드를 이루는 요소 들은 whitespace 구분이 되어야 한다는 것이다: 

Whitespace

이것은 Maya 커맨드의 부분 부분들을 제대로 인식하기 위하여 필요한 장치이다. 만약 whitespace 지키지 않고 다음과 같이 썼다고 생각해 보자:

move -r 00-1.941666;

또는

move-r 00-1.941666;

또는

move -r0 0 -1.94 1666;

번째 예에서 Maya 플래그가 하나의 인자 값만을 받았다고 생각할 것이다. 번째 예에서는 커맨드 이름이move 아닌move-r라고 착각할 것이고, 마지막 예에서는-r0라는 플래그에0, -1.94, 1666 라는 인자 개가 들어왔다고 여길 것이다.

 

정리하면:

 

커맨드 이름(command name) 수행하고자 하는 액션 종류를 뜻한다.

플래그(Flags) 액션의 방향을 정한다.

플래그 인자(Flag arguments) 플래그가 정의하는 액션의 방향에 대한 세부 사항을 정의한다.

공백(Whitespace) 커맨드의 부분을 구별 짓는다.

세미콜론(Semicolons) 서로 다른 커맨드를 구별 짓는다.

 

이제 커맨드 타겟만 남았다. 커맨드 타겟은 가지 기능을 한다. 간단한 커맨드일 경우 커맨드 타겟은 플래그 인자와 비슷한 일을 한다: 커맨드가 하는 일에 대한 세부 사항을 제공한다. ‘movescale처럼 다른 오브젝트나 UI 변경하는 커맨드일 경우 커맨드 타겟은 커맨드에 의해 변경될 오브젝트나 UI 알려준다.

 

애완견 예를 확장해 보자. 애완 동물이 마리 있는 경우 강아지만 앉히고 싶다면 멍멍이 앉아라고 한다. 고양이는 하고 싶은 것을 하도록 내버려 두자.

 

마찬가지로 스피어를 움직이고 싶다면 다음과 같이 커맨드를 실행한다:


move -r 0 10 0 pSphere1;

커맨드는 pSphere1 현재 위치에서 y 방향으로 10만큼 이동하라는 뜻이다.

 

, 잠깐! 아까 했던move커맨드는 타겟이 없었는데? 맞다:

move -r 0 0 -1.941666 ;

타겟을 요하는 대부분의 커맨드는 타겟이 지정되지 않은 경우를 대비해서 계획을 세워 놓았다. ‘move커맨드의 경우에는 타겟이 제공되지 않으면 현재 선택된 오브젝트들을 타겟으로 삼는다.

 

아직도 많은 MEL 커맨드와 문법이 남아 있지만, 이는 잠시 접어 두도록 하자. 여러분은 이제 스피어를 벗어나서 유용한 작업을 준비가 되었다!

Example Walkthrough


지금까지 배운 것들을 종합하여 (새로운 것도 조금 보태서) 여러분 만의 “My Settings” 윈도우를 만들어보자.

My Settings Window

윈도우의 버튼을 누르면 Shelf 버튼과 마찬가지로 MEL 커맨드가 수행될 것이다. 하지만 이번에는 드래그--드랍이 아니라 실제로 MEL 써서 윈도우와 버튼을 만들어 보겠다.

 

자주 변경해야 하지만 메뉴의 메뉴 안에 숨어 있어서 불편한 Maya 셋팅들을 찾아내어 버튼화 함으로써 마우스 클릭 수를 줄이는 것이 윈도우의 목적이다.

 

작업의 핵심은 History Pane에서 찾아볼 있는 커맨드 들이다. 하지만 전에 먼저 알아야 UI 관련 커맨드 들을 살펴보자:

window
columnLayout
button
showWindow

UI 만드는 데에 아주 기초가 되는 커맨드들이다. UI 대해서는 언젠가 깊이 있게 다룰 기회가 있겠지만, 일단은 개의 커맨드를 간략하게나마 살펴보자.
 

window
columnLayout
button
showWindow

윈도우
(window) 이런 모양을 한다: 

Blank Window

여러분이 앞으로 제작할 대부분의 MEL UI 윈도우 안에 놓일 것이다. 윈도우는 다른 컴포넌트들이 위에 올라가는 바탕이라고 생각하면 것이다.

window
columnLayout
button
showWindow

윈도우 바로 위에 올라가는 레이어는 레이아웃(layout)이다. 레이아웃은 버튼, 필드, 체크박스 등을 배열한다 (버튼, 필드, 체크박스 등은 컨트롤(controls)이라고 불리운다). 레이아웃의 종류인 컬럼레이아웃 (columnLayout)’ 컨트롤들을 위에서 아래로 열로 정렬한다:

Column Layout


window
columnLayout
button
showWindow

 

버튼(button) MEL 컨트롤의 종류이다 텍스트 필드, 체크 박스, 옵션 메뉴 다른 컨트롤들과 마찬가지로 버튼은 사용자가 UI 조작할 있게 한다. 사용자가 버튼을 클릭하고, 체크박스를 체크하고, 옵션 메뉴에서 옵션을 선택하는 등을 때마다 컨트롤과 연계된 MEL 커맨드가 수행된다.

English Conversation Window

window
columnLayout
button
showWindow

마지막으로 showWindow커맨드가 있다. 윈도우를 만들면 보이지 않는 것이 디폴트 설정이기 때문에 showWindow커맨드를 사용하여 윈도우가 보이게 해야 한다.

 

이제 이론은 정도로 하고 기다리던 실습시간이다. 다음은 그림과 같은 윈도우와 버튼을 만드는 코드이다:


window -title "English Conversation";
columnLayout -adjustableColumn true;
button
    -label "Hello, how are you?";
   button
    -label "Fine, thank you. And you?";
   button
     -label "Good. Nice to meet you.";
showWindow;


각각의 플래그를 살펴보자:

window -title “English Conversation”;

-title플래그는 위도우의 제목을 지정한다. 위의 예에서 플래그 인자는“English Conversation” 인데 이에 맞추어 윈도우의 제목이 바뀐 것이 보인다.

 

본론에서 벗어난 이야기이지만 “English Conversation” 인자는 컴퓨터 프로그래밍 세계에서는 스트링(string) (하나 또는 이상의 글자라는 )이라고 한다. 글자들의 앞뒤로 이중 따옴표가 있는데, 따옴표가 없으면 Maya 단어를 개별적인 인자로 생각할 것이다. 따옴표가 있으면 “English Conversation” 하나의 인자가 되지만 따옴표가 없으면 English Conversation 개의 인자로 인식한다.

 

이제 다음 줄을 보자:


columnLayout -adjustableColumn true;

-adjustableColumn플래그는columnLayout 너비가 변경가능한지 여부를 알려준다(예를 들어 윈도우를 늘리거나 줄일 윈도우 상의columnLayout 같이 크기가 변할 것인가를 정한다). ‘true인자값은 라는 뜻으로 이제 columnLayout 윈도우에 맞추어 크기를 바꿀 것이다. 이번 예제에서 필요한 플래그는 아니지만 UI 예쁘게 하기 위하여 넣어 주었다.


button
-label "Hello, how are you?";

-label전에 줄을 하나 띄어 주었다 – Maya 줄바꿈을 공백과 동일시하기 때문에 이렇게 해도 커맨드 라인으로 인식힌다. ‘-label 윈도우의-title 비슷한 플래그로 버튼에 쓰여질 글을 지정한다. 경우에는“Hello, how are you?” 라는 버튼이 생길 것이다.

 

, 드디어 번째 UI 만들었다(쓸모는 없지만)! 이제 UI 기능들을 넣어 보자.

 

앞서 말했듯이 UI 목적은 자주 바꾸는 세팅들을 쉽게 접근하도록 하는 것이다. 독자마다 자주 바꾸는 세팅이 다르겠지만, 예제에서는 조인트의 디스플레이 사이즈를 0.5 1 바꾸는 작업과 렌더러를 하드웨어와 소프트웨어로 바꾸는 작업을 고려해보자. , 물론 스피어를 만들고 움직이는 것도 아주 아주 재미있지만 말이다.

 

번째로 일은 조인트 디스플레이 사이즈를 바꾸는 MEL 커맨드를 알아내는 일이다. 조인트를 만들고 사이즈를 바꾸면서Script Editor 관찰해보자.
 
Joints

마우스를 클릭한 조인트 디스플레이 세팅을 찾았다(조금 귀찮았다). 여기에 있다: Windows > Settings/Preferences > Preferences > Kinematics


Joint Size Widget

계획대로라면 조인트 사이즈를 1.0 바꾸면서 Script Editor에서 커맨드를 찾아서 버튼과 연결시켜 주어 다시는 메뉴를 뒤지지 않아도 되리라!
 

, 간다:


No Output

? 어떻게 것인지? 조인트 사이즈는 바뀌었지만 History Pane에는 아무것도 나오지 않은 이유는? Maya에서 하는 모든 작업이 MEL 통하기 때문에 Maya 매우 많은 커맨드를 수행시킨다. Script Editor 보여 주기엔 너무 많은 양이기 때문에 디폴트로 몇만 보이게 된다. 만약 현재 수행되는 모든 커맨드를 보고 싶으면 Script Editor Script 메뉴에서Echo All Commands 체크해 주면 된다. 이제 History Pane 많은 양의 커맨드가 디스플레이될 것이다.
주의: Attribute Editor 매우 많은 커맨드를 실행시키기 때문에 Echo All Commands 키기 전에 Attribute Editor 닫아 주는 것이 좋다. 또한 옵션을 키면 Maya 느려질 있기 때문에 특정 커맨드를 찾아볼 때에만Echo All Commands 사용하자.

 

이제 다시 보자 이번에는 조인트 사이즈를 0.5 바꾸어 본다. 

Output

마지막 커맨드인

jointDisplayScale 1;

조인트 사이즈를 1 바꾼다. 커맨드를 앞서 만든 버튼과 연결시켜 보자.

 

이제 버튼 커맨드의 플래그 중에서-command 살펴볼 차례이다. 플래그는 string 인자를 받아들이는데, 인자는 사용자가 버튼을 눌렀을 실행될 MEL 커맨드를 지정하게 된다.

 

버튼에 새로운 플래그를 지정하여 My Settings UI 다시 보면 다음과 같다:

window -title "My Settings";
columnLayout -adjustableColumn true;
   button
  -label "Joint Size 1"
     -command "jointDisplayScale 1;";
showWindow;


jointDisplayScale 이중 따옴표 안에 묶여 있는 것은 커맨드가  -command플래그의 string 인자로 넘어가야 하기 때문이다.

 

이제 다음 그림처럼 생긴 UI 만들어지고, “Joint Size 1” 버튼을 누르면 조인트 사이즈가 1 바뀔 것이다:

My Settings Window with 1 Button

조인트 사이즈를 0.5 바꾸는 버튼을 추가해 보기 바란다.

 

다음 단계는 렌더러를 Maya Hardware Maya Software 바꾸는 버튼이다. Echo All Commands 놓은 상태로Render View 윈도우를 열자( Render View Button 

 버튼을 누르거나 Window > Rendering Editors... > Render View 메뉴로 가면 된다). Script Editor 보면 아웃풋이 너무 많아서 보려면 스크롤해서 올라가야 정도일 것이다. 하지만 우리 목표와는 상관 없는 정보가 대부분이기 때문에 이를 없애 주도록 하자. 그러면 렌더러를 바꾸는 명령어가 무엇인지를 알아내기가 수월해질 것이다.

History Pane 깨끗이 지워주기 위해서는 Script Editor에서 Edit > Clear History 실행시켜 준다. Input Pane까지 지워 버리면 여기에 보관해 My Settings 윈도우 코드가 없어지니 주의하자.

 

이제Render View Options > Render Using > Maya Hardware 렌더러를 바꾸어준다. History Pane 이러한 아웃풋이 생긴다:

Renderer Output

조인트 디스플레이 사이즈를 바꾸었을 때처럼 깔끔한 아웃풋이 아니라 실망했을 지도 모르겠다. Maya에서 대부분의 작업은 숨겨진 추가 커맨드를 실행시키는데Echo All Commands 놓으면 이러한 추가 작업까지 모두 History Pane 나타난다. 때문에 우리가 실제로 필요로 하는 MEL 커맨드를 찾아내려면 약간의 노력이 필요하다. 위의 아웃풋에서 실제로 렌더러를 Maya Hardware 바꾸는 커맨드는 어떤 것일까? 렌더러를 Maya Software 바꾸어서 아웃풋을 비교해 보면 도움이 것이다. 또는 위에 나온 커맨드를 실행시켜 보면서 실제로 렌더러를 바꾸는 명령을 찾는 것도 좋은 방법이다.

 

... 찾아 보았나? 선택된 렌더러를 Maya Hardware 바꾸는 명령은 이것이다:

setCurrentRenderer mayaHardware;

이제 명령을 UI 넣어주고, 추가로 렌더러를 Maya Software 바꾸는 버튼도 넣어 보자. 최종 스크립트는 이렇게 된다:


window -title "My Settings";
columnLayout -adjustableColumn true;
  button
     -label "Joint Size 1"
     -command "jointDisplayScale 1;";
  button
     -label "Joint Size 0.5"
     -command "jointDisplayScale 0.5;";
  button
       -label "HW Render"
     -command "setCurrentRenderer mayaHardware;";
  button
   -label "SW Render"
       -command "setCurrentRenderer mayaSoftware;";
showWindow;


스크립트가 만든 우리의 멋진 툴은 이런 모양이다

 
My Settings Window With 4 Buttons

마이크로소프트 윈도우에는Solitaire 있고 핸드폰에는 테트리스가 있듯이 우리도 무언가 재미있는 기능을 넣어야 하겠다. 이제 다들 눈치채셨겠지만 스피어를 만들어서 움직이는 것이 필자가 가장 좋아하는 게임이다. UI 넣기 전에 먼저 스피어를 만들어서 움직여 보겠다:

polySphere;
move -r 0 0 -2 ;
move -r 0 1 0 ;

전과 비교해서 플래그를 없앴고 인자 값을 바꾸어서 스크립트를 깔끔하게 고쳤다. long form 플래그를 쓰거나 다른 인자 값을 쓰는 것은 여러분 마음이다.

 

이제 “Sphere”라는 버튼을 만들자:

window -title "My Settings";
columnLayout -adjustableColumn true;
button
     -label "Joint Size 1"
     -command "jointDisplayScale 1;";
   button
     -label "Joint Size 0.5"
     -command "jointDisplayScale 0.5;";
   button
     -label "HW Render"
     -command "setCurrentRenderer mayaHardware;";
   button
      -label "SW Render"
      -command "setCurrentRenderer mayaSoftware;";
   button
       -label "Sphere"
    -command "polySphere;
move -r 0 0 -2 ;
move -r 0 1 0 ; ";
showWindow;

실행시키자!

 

... 에러가 생겼다! 
 
Unterminated String Error

History Pane 보면 자세한 정보가 나와있다:


// Error:   -command "polySphere; //
// Error: Line 17.24: Unterminated string. //
// Error: move -r 0 1 0 ; "; //
// Error: Line 18.19: Unterminated string. //

앞서 “Maya 모든 whitespace(줄바꿈, 공백, ) 동일하게 취급한다라고 말한 있는데, 여기에는 예외가 있다. string 안에서는 줄바꿈에 주의해야 한다. Maya 이중따옴표 하나를 발견하면 이에 상응하는 다른 따옴표가 같은 안에 있을 것이라고 기대해버린다(줄바꿈이 나오기 전에 이중따옴표가 나오리라고 기대한다)

 

따라서 이를 피해가는 방법은 모든 커맨드를 같은 안에 넣어버리는 것이다:

"polySphere; move -r 0 0 -2; move -r 0 1 0 ;"

방법은 string 짧으면 괜찮지만 길어질수록 불편해진다. 다행히도  \(역슬래시) 끝에 경우 줄바꿈 신호가 무시된다는 규칙이 있다. 규칙에서 알아두어야 것은 \ 뒤에 줄바꿈 문자가 바로 따라와야 한다는 것이다. 공백 등이 줄바꿈과 \ 사이에 들어가면 제대로 인식되지 않는다.

 

규칙을 염두에 두고 스크립트를 다시 보면:


window -title "My Settings";
columnLayout -adjustableColumn true;
   button
     -label "Joint Size 1"
     -command "jointDisplayScale 1;";
  button
     -label "Joint Size 0.5"
     -command "jointDisplayScale 0.5;";
  button
     -label "HW Render"
      -command "setCurrentRenderer mayaHardware;";
  button
      -label "SW Render"
   -command "setCurrentRenderer mayaSoftware;";
  button
   -label "Sphere"
      -command "polySphere;move -r 0 0 -2; \
move -r 0 1 0 ; ";
showWindow;

다음은 우리의 영광스러운 UI이다: 
 
My Settings Window

마지막으로 지금까지 작성한 MEL코드를 선택해서 중간 마우스 버튼으로 Shelf 올려준다. 이제 윈도우를 언제든지 있게 되었다!

Conclusion

지금까지 다룬 내용을 정리해보면:

 

  1. 커맨드의 뜻과 플래그와 인자의 사용 방법
  2. MEL 쓰지 않고 History Pane에서 복사하여 워크플로우를 자동화하는 방법
  3. MEL 커맨드의 구조와 MEL 때의 가지 규칙
  4. 기본적인 UI 만드는 방법

 

여기까지 읽어주어서 정말 감사하다!

MEL 전혀 사용해보지 않았던 독자에게 글이 유용했으면 좋겠다. 글의 내용을 모두 알고 있던 독자라면 다음 글에서는 빠르게 진행하여 MEL 마법을 깊이 파고 테니 너무 실망하지 말기 바란다.

 

Maya 관련되어서 궁금한 점이 있으면 주저 말고 주소로 이메일을 보내 주시라: ÀÌ À̸ÞÀÏ ÁÖ¼Ò´Â ½ºÆÔ¸Ó·ÎºÎÅÍ º¸È£µË´Ï´Ù. º¸½Ã·Á¸é ÀÚ¹Ù½ºÅ©¸³Æ®¸¦ Ȱ¼ºÈ­ ÇϽʽÿä

¸¶Áö¸· ¼öÁ¤ ( Friday, 20 October 2006 )