본문 바로가기
Technical Art/Maya

마야 파이썬 스크립팅 예제: 1/3의 면을 랜덤선택하여 머터리얼 바꾸기

by mati-as 2023. 10. 9.
반응형

서론

마야 스크립트에 관해서 올리는 첫 글이네요. 마야 스크립트 관련해서 공부하려니까 파이썬은 해본 적도 없고, 또 정보는 진짜 한국어로 된 건 전멸했다시피 해서.. 많이 애를 먹었습니다. 3Dsmax도 스크립트 관련 자료가 많은 건 아닌데 누군가 써놓은 글을 인용하자면 "마야 스크립트 관련 자료는 는 국내에서는 씨가 말랐다."는 표현이 너무나 와닿을 정도로 자료가 없는 것 같습니다..그럼에도 불구하고!! 마야를 하기로 했으니.. 스크립트 관련포스팅을 해보려고 합니다.

 

파이썬기초야 뭐 검색해도 좋은 블로그들이 너무 많고, 마야자체만 공부하려고 해도 마찬가지로 유튜브나 블로그에 워낙 좋은 글들이 많으니 저는 제가 상대적으로 찾기 힘들었던 예제를 보여드리면서 "스크립팅을 배워서 어떻게 활용하는가?"에 대한 의문에 조금 더 도움이 되는 자료를 보여드리려고 합니다. 

마야를 위해서 파이썬 스크립트를 배워서 어디다 쓰지?

일단 스크립트를 활용하는 목적은 프로젝트마다 천차만별입니다.예를들어 리깅에서도 하이어라키 구조 설정할 때는 물론, 머터리얼 자동대입, 파일 익스포트 관련 등 수도 없이 많은 것 같습니다. 사실 이전에도 마야 스크립트를 어떻게 활용하는지에 대해서 좀 일관된 답변을 못 들었던 게 많이 답답하고 엄청 어려운것 만 같은 막막힘이 들었는데. 예전에 포토샵으로 이것저것 설정하면서 자동화할 때도 누군가 "자동화는 어떤식으로 하냐?" 라고 물어보면 일괄적으로 뭐 설명할 게 없던 기억이 나서 마야도 어느정도 비슷하구나 하고 이해가 갔습니다. 예를들어 포토샵에서 사이즈를 일괄적으로 하고 자르고 수직 맞추고.. 이런 것들을 자동화하는 게 있는데 자동화 하는 건 프로젝트 상황마다 너무나 달라질 수 있고 꼭 자동화가 다 된다는 보장도 없거든요. 그래서 결론적으로 말해서, "파이썬으로 마야스크립트를 다뤄서 작업하면 뭐가 좋냐?" 라고 했을 때, 저는 "반복적이거나, 혹은 반복적이면서 랜덤 한 작업을 할 때 매우 유용하다."라고 말씀 드릴 것 같습니다. 물론 자동화 했지만 다듬는 작업은 대부분 들어가기 마련이구요.(즉 어찌되었든 디자이너는 꼭 필요하다는 이야기..!)

예제 : 3분의 1의 Surface를 선택한 다음 해당 부분만 머티리얼 바꾸기

근데 나는 마야 능숙해서.. 손으로 하는 게 더 빠를 것 같은데? 

사실 위  예시정도만 보여드리면, 주위에서 마야를 사용하시는 아티스트분들은 "그런 거 뭐 하러 코드로 일일이 쓰냐.. 손으로 메쉬선택해서 머터리얼 지정하고 작업 하는 게 더 빠르고 더 이쁜데"라고 반응하는 경우가 왕왕 있습니다. 이해갑니다.. 저도 포토샵 다룰때 자동화에 대한 엄청난 거부감이 있었습니다. 

 

하지만 아래처럼 서피스가 많은 아래 작업물을 손으로 하려면 어떨까요? 이렇게 100개를 만들라고 한다면요? 랜덤 하게요

즉 만약에 여러분들이 이런 작업을 한다면 마야로는 작업시간이 획기적으로 단축되게 됩니다. 코드설계에 따라서는 해당 프로세스, "오브젝트 생성 - 메쉬 설정 - 선택 - 머터리얼 변경 - 오브젝트 이름변경" 이 모든 과정을 스크립트 입력으로 손으로 직접하는 것 보다 훨씬 간단하게 처리할 수 있습니다. 

소스코드 (Python)

아래는 파이썬으로 작성된 코드입니다. 그냥 복사해서 붙여 넣기하고 직접 마야 열고 스크립트에 넣어보며 테스트를 해보시는 걸 추천드립니다. 파이썬을 얼추 아시는 분들을 위해 코드 설명을 짤막하게 하고 글 마무리 하도록 할게요.

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("내오브젝트이름", "할당하고자하는머터리얼이름")

코드 설명(Python)

- 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를 이용해 쉐이딩 그룹에 저장된 머터리얼을 할당합니다. 

 

반응형