| | Àμâ | |
|
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와 밀접한 관계를 이루고 있기 때문에 다음과 같은 일을 하는 데에 매우 유용한 툴이 된다:
이렇게 쓰다 보니 앞서 던져 놓은 “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은 여러분이 간단한 MEL을 써 넣는 인풋 필드(input field)이다. Command Feedback은 최근에 수행된 MEL 커맨드에 대한 정보를 보여 주는 곳으로 문제 발생시에 빨갛게 변한다.
이 정도만 알면 시작할 수 있다 – 지금 당장 Command Line에 아무 것이나 써보고 Enter 키를 과감하게 눌러주자…
… 해 보았나? MEL을 전혀 해 보지 않았다면 에러가 났을 가능성이 매우 크다 – 매우 똑똑한 독자라면 Command Line에 “아무 것이나”라고 썼을 지도 모르겠다. 보통은 이런 결과가 나왔을 것이다: ![]() 위와 비슷한 경우라면 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) 에서 그 답을 찾아보자. ![]() ![]() 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)이다. ![]()
사용자가 수행하는 MEL 커맨드와 그 외에 Maya가 자동으로 수행하는 MEL 커맨드는 디폴트로 History Pane에 올라간다. 때문에 History Pane은 Maya가 하는 일들을 알아내기에 좋은 방법이다. 더욱 중요하게는 우리가 원하는 작업을 어떻게 MEL로 구현하는 지 알아내기에 좋은 장소가 된다.
Maya를 막 열었다면 History Pane에 그 다지 많은 정보가 있지는 않을 것이다. 하지만 이 것만으로도 MEL 커맨드를 한 두 개 찾아낼 수 있다: ![]() ‘file -f -new‘ 와 ‘docServer -start’ 둘 다 MEL 커맨드이다. 좀 더 정확하게 말하면 ‘file’ 과 ‘docServer’ 만이 커맨드이고 ‘-‘ 뒤에 따라 오는 것들은 ‘커맨드 플래그’(command flag)라고 한다. 커맨드 플래그에 대해서는 나중에 다루겠다. 일단은 ‘file -f -new;’ 를 마우스로 선택하여 복사 (Ctrl+C) 하고 Input Pane에 붙여넣는다(Ctrl+V).
준비 되었는가? ... 커맨드를 실행하자! Ctrl+Enter 를 누르고 지켜보자! ... ... 별 다른 일이 없는 것처럼 보일 수도 있다. 하지만 우리는 방금 File Menu를 열거나 툴 바의
후후... 멋지지 않은가? 이 것은 단지 시작일 뿐이다. 우리의 친구 History Pane과 Input Pane과 함께 좀 더 탐험해 보자.
Grabbing Output and Reusing
그럼 먼저 여러분 모두 자동화하고 싶어함에 틀림 없는 워크플로우부터 시작하겠다: 스피어(sphere) 만들기이다! – 운이 좋으면 스피어를 움직이고 크기를 조절할 시간이 있을 지도 모르겠다. Create > Poly Primitives > Sphere 메뉴로 가서 스피어를 하나 만들어 준다. History Pane 에 새로이 두 줄이 생겼을 것이다: ![]() polySphere -r 1 -sx 20 -sy 20 -ax 0 1 0 -tx 2 -ch 1; // Result: pSphere1 polySphere1 //
![]() 필자의 경우 다음과 같은 세 줄이 생겼다: 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에 있는 버튼과 비교하면 쿨하진 않다.
Shelf를 사용하기 위해서는 History Pane에서 전의 그 다섯 줄을 선택하고, 중간 마우스 버튼으로 이를 드래그하여 Shelf위에 ‘톡’ 하고 올려 놓는다. ![]() 다음과 같이 생긴 새 버튼이 생길 것이다: ![]() 이 버튼을 클릭할 때마다 방금 선택한 MEL 커맨드들이 수행된다. 이러한 과정을 이용하면 MEL을 직접 쓰지 않고도 Maya에서 하는 많은 작업을 손쉽게 캡쳐하고 저장하여 반복할 수 있다. 스켈레톤이나 prop 파일을 임포트할 때 History Pane을 눈여겨 보시라 – 버튼으로 저장해 놓고 반복해서 쓸 만한 것이 있을지도 모른다 Mel Command Syntax
복사, 붙여넣기, 마우스 드래그, 클릭 등을 충분히 연습하였으면 다음 과정으로 넘어가자: MEL syntax (문법)이다. 앞에서 보았듯이 합법적인 MEL 커맨드는 한정되어 있으며, 잘못된 MEL 커맨드를 쓰면 Maya는 에러를 낸다. 까다로운 Maya는 이 외에도 여러 가지 룰을 만들어 놓았다. 그 첫번째 룰은 너무 간단해서 쉽게 잊어버리곤 한다: 모든 라인은 세미콜론 ‘;’으로 끝나야 한다.
앞 장에서 사용한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로 구분이 되어야 한다는 것이다: ![]() 이것은 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) 는 서로 다른 커맨드를 구별 짓는다.
이제 커맨드 타겟만 남았다. 커맨드 타겟은 몇 가지 기능을 한다. 간단한 커맨드일 경우 커맨드 타겟은 플래그 인자와 비슷한 일을 한다: 커맨드가 하는 일에 대한 세부 사항을 제공한다. ‘move’와‘scale’처럼 다른 오브젝트나 UI를 변경하는 커맨드일 경우 커맨드 타겟은 커맨드에 의해 변경될 오브젝트나 UI를 알려준다.
애완견 예를 확장해 보자. 애완 동물이 두 마리 있는 경우 강아지만 앉히고 싶다면 “멍멍이 앉아” 라고 한다. 고양이는 하고 싶은 것을 하도록 내버려 두자.
마찬가지로 스피어를 움직이고 싶다면 다음과 같이 커맨드를 실행한다: move -r 0 10 0 pSphere1; 이 커맨드는 pSphere1 를 현재 위치에서 y 방향으로 10만큼 이동하라는 뜻이다. 앗, 잠깐! 아까 했던‘move’ 커맨드는 타겟이 없었는데? 맞다: move -r 0 0 -1.941666 ; 타겟을 요하는 대부분의 커맨드는 타겟이 지정되지 않은 경우를 대비해서 계획을 세워 놓았다. ‘move’ 커맨드의 경우에는 타겟이 제공되지 않으면 현재 선택된 오브젝트들을 타겟으로 삼는다.
아직도 수 많은 MEL 커맨드와 문법이 남아 있지만, 이는 잠시 접어 두도록 하자. 여러분은 이제 스피어를 벗어나서 좀 더 유용한 작업을 해 볼 준비가 되었다! Example Walkthrough 지금까지 배운 것들을 종합하여 (새로운 것도 조금 보태서) 여러분 만의 “My Settings” 윈도우를 만들어보자. ![]() 이 윈도우의 버튼을 누르면 Shelf 버튼과 마찬가지로 MEL 커맨드가 수행될 것이다. 하지만 이번에는 드래그-앤-드랍이 아니라 실제로 MEL 을 써서 윈도우와 버튼을 만들어 보겠다.
자주 변경해야 하지만 메뉴의 메뉴 안에 숨어 있어서 불편한 Maya 셋팅들을 찾아내어 버튼화 함으로써 마우스 클릭 수를 줄이는 것이 이 윈도우의 목적이다. 이 작업의 핵심은 History Pane에서 찾아볼 수 있는 커맨드 들이다. 하지만 그 전에 먼저 알아야 할 UI 관련 커맨드 들을 몇 개 살펴보자: window columnLayout button showWindow UI를 만드는 데에 아주 기초가 되는 커맨드들이다. UI에 대해서는 언젠가 깊이 있게 다룰 기회가 있겠지만, 일단은 이 네 개의 커맨드를 간략하게나마 살펴보자. window columnLayout button showWindow 윈도우(window)는 이런 모양을 한다: ![]() 여러분이 앞으로 제작할 대부분의 MEL UI 는 윈도우 안에 놓일 것이다. 윈도우는 다른 컴포넌트들이 위에 올라가는 바탕이라고 생각하면 될 것이다. window columnLayout button showWindow 윈도우 바로 위에 올라가는 레이어는 레이아웃(layout)이다. 레이아웃은 버튼, 필드, 체크박스 등을 배열한다 (버튼, 필드, 체크박스 등은 컨트롤(controls)이라고 불리운다). 레이아웃의 한 종류인 ‘컬럼레이아웃 (columnLayout)’은 컨트롤들을 위에서 아래로 한 열로 정렬한다: ![]() window columnLayout button showWindow 버튼(button)도 MEL 컨트롤의 한 종류이다 – 텍스트 필드, 체크 박스, 옵션 메뉴 등 다른 컨트롤들과 마찬가지로 버튼은 사용자가 UI를 조작할 수 있게 한다. 사용자가 버튼을 클릭하고, 체크박스를 체크하고, 옵션 메뉴에서 옵션을 선택하는 등을 할 때마다 각 컨트롤과 연계된 MEL 커맨드가 수행된다. ![]() 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를 관찰해보자. ![]() 마우스를 몇 번 클릭한 후 조인트 디스플레이 세팅을 찾았다(조금 귀찮았다). 여기에 있다: Windows > Settings/Preferences > Preferences > Kinematics ![]() 계획대로라면 조인트 사이즈를 1.0로 바꾸면서 Script Editor에서 커맨드를 찾아서 버튼과 연결시켜 주어 다시는 메뉴를 뒤지지 않아도 되리라! 자, 간다: ![]() 에? 어떻게 된 것인지? 조인트 사이즈는 바뀌었지만 History Pane에는 아무것도 나오지 않은 이유는? Maya에서 하는 모든 작업이 MEL을 통하기 때문에 Maya는 매우 많은 커맨드를 수행시킨다. Script Editor에 다 보여 주기엔 너무 많은 양이기 때문에 디폴트로 몇 몇만 보이게 된다. 만약 현재 수행되는 모든 커맨드를 보고 싶으면 Script Editor의 Script 메뉴에서Echo All Commands를 체크해 주면 된다. 이제 History Pane에 많은 양의 커맨드가 디스플레이될 것이다. 이제 다시 해 보자 – 이번에는 조인트 사이즈를 0.5로 바꾸어 본다. ![]() 마지막 커맨드인 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로 바뀔 것이다: ![]() 조인트 사이즈를 0.5로 바꾸는 버튼을 추가해 보기 바란다. 다음 단계는 렌더러를 Maya Hardware 와 Maya Software로 바꾸는 버튼이다. Echo All Commands를 켜 놓은 상태로Render View 윈도우를 열자( 버튼을 누르거나 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에 이러한 아웃풋이 생긴다: ![]() 조인트 디스플레이 사이즈를 바꾸었을 때처럼 깔끔한 아웃풋이 아니라 실망했을 지도 모르겠다. 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; 이 스크립트가 만든 우리의 멋진 툴은 이런 모양이다: ![]() 마이크로소프트 윈도우에는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; 실행시키자! ... 에러가 생겼다! ![]() 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이다: ![]() 마지막으로 지금까지 작성한 MEL코드를 선택해서 중간 마우스 버튼으로 Shelf에 올려준다. 이제 이 윈도우를 언제든지 열 수 있게 되었다! Conclusion 지금까지 다룬 내용을 정리해보면:
여기까지 긴 글 읽어주어서 정말 감사하다! MEL을 전혀 사용해보지 않았던 독자에게 이 글이 유용했으면 좋겠다. 이 글의 내용을 모두 알고 있던 독자라면 다음 번 글에서는 좀 더 빠르게 진행하여 MEL의 마법을 깊이 파고 들 테니 너무 실망하지 말기 바란다.
Maya에 관련되어서 궁금한 점이 있으면 주저 말고 이 주소로 이메일을 보내 주시라: ÀÌ À̸ÞÀÏ ÁÖ¼Ò´Â ½ºÆÔ¸Ó·ÎºÎÅÍ º¸È£µË´Ï´Ù. º¸½Ã·Á¸é ÀÚ¹Ù½ºÅ©¸³Æ®¸¦ Ȱ¼ºÈ ÇϽʽÿä |
|
| ¸¶Áö¸· ¼öÁ¤ ( Friday, 20 October 2006 ) |






















