posted by cimple 2015. 11. 25. 20:29

File > Settings... > Project:  > Project Interpreter > 톱니바퀴 > More... > Show paths for the selected interpreter > Add path



posted by cimple 2015. 11. 24. 20:59

모션 리타겟팅을 캐릭터에 수행하다 보면, 리깅된 Joint version 만 있는 캐릭터가 필요할 경우가 있다.


조인트-컨트롤러간 독립성이 잘 갖추어진 리깅이라면 그냥 컨트롤러만 지워주면 되겠지만, 그렇지 않은 경우는 이런 Joint version 만 있는 캐릭터를 만들기가 좀 까다로운 편이다.


이 것을 위해서는 크게 2단계의 과정을 거쳐야 하는데,



1. Rigging 된 모델에서, 스키닝과 관련된 조인트 리스트를 뽑아내기


2. 해당 조인트/메쉬를 export 한 뒤, 원본 모델에서 Skin Weight Map 을 export 하여 새로운 모델에 적용



이 과정을 거치면 Joint version 만 있는 캐릭터를 손쉽게 만들 수 있다.


각각의 과정을 설명하면,



1. Rigging 된 모델에서 스키닝과 관련된 조인트 리스트 뽑아내기


이를 위해서, 간단한 스크립트가 필요하다. 



import maya.cmds as mc
meshList  = mc.ls(sl=True)  

def getSkinJointListFromMeshList(meshList):
  skinJntList = []
  skinJntSet = set([])
  for mesh in meshList :
    skinJntList.append(mc.skinCluster(mesh, q=True, wi=True))
  for skinJnt in skinJntList :
    skinJntSet = skinJntSet|set(skinJnt)
  return list(skinJntSet)

skinJntList = getSkinJointListFromMeshList(meshList)

for skinJnt in skinJntList :
  pos = mc.xform(skinJnt, q=True, t=True, ws=True)
  mc.select(cl=True)
  nJnt = mc.joint(n=skinJnt+'_new')
  mc.xform(nJnt, t=pos, ws=True)

설명하면, 

1. mesh 들을 선택한다. 캐릭터가 메쉬 하나로 이루어진 경우도 있지만 여러 개의 mesh 로 이루어진 경우도 있다. 

2. 이 mesh 들을 선택하고 getSkinJointListFromMeshList 함수를 실행시키면, 스키닝되어 있는 모든 조인트들의 리스트를 만들어준다. (set 을 사용해서 다수의 메쉬에서 중복되는 조인트가 안생기도록)

3. 그 리스트대로 '_new' 를 붙여서 새로운 조인트를 만들어준다.


이렇게 만들어진 새로운 조인트와, 캐릭터 mesh 를 duplicate 해서 새로운 파일로 export 해 놓으면 일차적인 준비는 끝. 


Warning: 그러나, 2단계의 skin weight import/export 를 위해서는 mesh 와 joint 의 네이밍이 리깅의 버전과 동일해야 한다. 위 방식대로 duplicate 하거나 _new 를 붙인 네이밍은 새로운 파일에서 원본 리깅과 동일하도록 수정해 주어야 한다.


Warning: 이렇게 만들어진 조인트는 계층 구조가 없다. 원본의 계층 구조를 고려해서 parents 시킬 수도 있겠지만, 계층 구조가 없는 리깅도 있다. 위 스크립트의 경우에는 결과물을 수작업으로 조인트를 parents 시켜 주어야 한다. 




2. Skin weight map export / import


Maya 의 Skin weight map 기능을 이용하여 메쉬의 스키닝을 옮겨준다. 


Warning: Maya 의 Skin weight map 은 기본적으로 해당 mesh 의 UV 정보를 기준으로 map 을 만들기 때문에, UV 가 이상하게 꼬여있거나 겹쳐져 있거나 하면 제대로 스키닝 정보가 옮겨지지 않는다. 따라서 UV 가 잘 수정되어 있다는 전제가 있어야 한다.


- 먼저, Skin weight map 을 export 한다. 방법은 간단한데, export 하고 싶은 mesh 를 모두 선택한 다음, skin > export weight maps... 를 하면 간단하게 weight map 을 뽑아줄 수 있다.


- 다음, 새로이 뽑아낸 mesh 와 joint 를 기본 옵션으로 바인딩한다. 이 바인딩된 결과물은 신경쓸 필요가 없는데, 일단 '바인딩' 자체가 되어 있어야 skin weight map 을 import 할 수 있기 때문이다.


- mesh 들을 선택한 다음 skin> import weight maps... 로 스키닝 정보를 import 한다.


Warning: Import skin weight map 작업은 기본적으로 네이밍을 기준으로 이루어지므로, 네이밍이 다르다던가, 중복된 이름이 scene 안에 두개 이상 존재하면 오류가 발생하게 된다. 네이밍에 각별히 신경을 써 주도록 하자.


이렇게 하면 스키닝이 잘 옮겨지게 된다. 잘 안된다면 위의 주의사항들을 잘 읽어보고 어디에서 오류가 발생했는지 찾아 보도록 하자.