마야 스크립트에 관해서 올리는 첫 글이네요. 마야 스크립트 관련해서 공부하려니까 파이썬은 해본 적도 없고, 또 정보는 진짜 한국어로 된 건 전멸했다시피 해서.. 많이 애를 먹었습니다. 3Dsmax도 스크립트 관련 자료가 많은 건 아닌데 누군가 써놓은 글을 인용하자면 "마야 스크립트 관련 자료는 는 국내에서는 씨가 말랐다."는 표현이 너무나 와닿을 정도로 자료가 없는 것 같습니다..그럼에도 불구하고!! 마야를 하기로 했으니.. 스크립트 관련포스팅을 해보려고 합니다.
파이썬기초야 뭐 검색해도 좋은 블로그들이 너무 많고, 마야자체만 공부하려고 해도 마찬가지로 유튜브나 블로그에 워낙 좋은 글들이 많으니 저는 제가 상대적으로 찾기 힘들었던 예제를 보여드리면서 "스크립팅을 배워서 어떻게 활용하는가?"에 대한 의문에 조금 더 도움이 되는 자료를 보여드리려고 합니다.
일단 스크립트를 활용하는 목적은 프로젝트마다 천차만별이고, 리깅에서도 하이어라키 구조 설정할 때는 물론, 수도 없이 많은 것 같습니다. 사실 마야 스크립트를 어떻게 활용하는지에 대해서 좀 일관된 답변을 못 들었던 게 많이 답답했는데. 예전에 포토샵으로 이것저것 설정하면서 자동화할 때도 일관적으로 뭐 설명할 게 없던 기억이 나서 좀 이해가 갔습니다. 사이즈를 일괄적으로 하고 자르고 수직 맞추고.. 이런 것들을 자동화하는 게 있는데 이런 건 프로젝트 상황마다 너무나 달라질 수 있으니까요. 그래서 결론적으로 파이썬으로 마야스크립트를 다뤄서 작업하면 뭐가 좋냐?라고 했을 때 반복적이거나, 혹은 반복적이면서 랜덤 한 작업을 할 때 매우 유용하다.라고 정리는 일단 가능할 것 같습니다. 물론 자동화 했지만 다듬는 작업은 대부분 들어가기 마련이구요.(즉 어찌되었든 디자이너는 꼭 필요하다는 이야기..!)
아래 예시정도만 보여드리면, 주위에서 마야를 사용하시는 아티스트분들은 "그런 거 뭐 하러 코드로 일일이 쓰냐.. 손으로 하는 게 더 빠르고 더 이쁜데"라고 반응하는 경우가 왕왕 있습니다.
하지만 아래 작업물을 손으로 하려면 어떨까요? 이렇게 100개를 만들라고 한다면요? 랜덤 하게요
예를 들어 이런 작업을 한다면 마야로는 작업시간이 획기적으로 단축되게 됩니다. 코드설계에 따라서는 해당 프로세스, "오브젝트 생성 - 메쉬 설정 - 선택 - 머터리얼 변경 - 오브젝트 이름변경" 이 모든 과정을 스크립트 입력으로 처리할 수 있습니다.
import maya.cmds as cmds
import random
def assign_material_to_random_faces(obj_name, material_name):
# 선택한 메쉬의 모든 면을 가져옵니다.
all_faces = cmds.ls(obj_name + '.f[*]', fl=True)
# 전체 면 중에서 3분의 1을 랜덤하게 선택합니다.
num_faces_to_select = len(all_faces) // 3
selected_faces = random.sample(all_faces, num_faces_to_select)
# 새 머터리얼을 지정합니다. 여기서는 이미 있는 머터리얼을 사용한다고 가정합니다.
shading_grp = cmds.listConnections(material_name, type='shadingEngine')[0]
cmds.select(selected_faces)
cmds.hyperShade(assign=shading_grp)
# 사용법
# assign_material_to_random_faces("내오브젝트이름", "할당하고자하는머터리얼이름")
복사해서 붙여 넣기 하셔서 직접 테스트 해보시는 걸 추천드립니다. 파이썬을 얼추 아시는 분들을 위해 코드 설명을 짤막하게 하고 글 마무리 하도록 할게요
- 1. 함수 정의하기
def assign_material_to_random_faces(obj_name, material_name):
:오브젝트와, 머터리얼 각각의 이름을 인자로 받습니다.
- 2. 모든 메쉬 받아오기
all_faces = cmds.ls(obj_name + '.f[*]', fl=True)
all_faces라는 변수를 선언합니다. cmd.ls는 마야에서 객체나 컴포넌트를 나열하는 데 사용되는 API입니다. f [*]으로 메쉬 전체를 선택하고, fl=True를 통해 전체경로를 나타내게 됩니다.
-3. 랜덤으로 메쉬 선택하기
num_faces_to_select = len(all_faces) // 3
selected_faces = random.sample(all_faces, num_faces_to_select)
num_face_to_select에 all_faces의 3분의 1만큼의 메쉬크기를 입력하고,
파이썬 내장 랜덤함수를 활용해 랜덤값을 입력합니다.
참고로 랜덤으로 칠하고 싶은 영역을 조절하고 싶다면 3을 다른 일반 변수로 다뤄서 파라미터에 넣고 활용할 수 있겠죠.
-4. 쉐이딩 그룹 저장
shading_grp = cmds.listConnections(material_name, type='shadingEngine')[0]
참고로 마야의 모든 객체와 연산은 노드로 표현되고 노드로 동작합니다. cmds.listConnections는 주어진 노드에 연결된 다른 노드를 나열하는 데 사용되는 API입니다. 예제에서는 머터리얼의 쉐이딩그룹만을 검색하기 위 'type='shadingEngine'을 사용했고요.
-5. 할당하기
cmds.select(selected_faces)
cmds.hyperShade(assign=shading_grp)
cmds.select를 이용해 주어진 면들을 선택하고, cmds.hperShade를 이용해 쉐이딩 그룹에 저장된 머터리얼을 할당합니다.