페이스 리깅(10) wrinkle맵 설정하기


wrinkle맵은, 컨트롤러 값에 따라서 주름이 나타나는 맵이다. 전문 프로덕션에서는,

2004년부터 normal맵으로 multiple normal map을 구사해왔다. 이보다 좀더 진보된 방식은 페이스에 조인트를 넣고 다시 wrinkle맵을 컨트롤러와 결합시킨 방법이다. 

direct 11 방식 + shaderfx 쉐이더를 사용한다면, 실시간으로 wrinkle맵 움직임을 볼 수 있지만, 해당 포스팅에서는 arnold 랜더링에 적합한 노드구조를 사용했다. (유투브에 많음)


1 『주름맵 생성』

눈을 크게 떳을 때, 특정부위의 피부가 밀려나면서 주름이 발생한다. 주름이 잡히는 정도를 실험하는 목적이기 때문에 큰 선들을 만든다. z브러시에서 디스맵을 추출할 때는 apaptive를 끈다. (퀄러티 차이없이 시간 오래걸림) 주름맵은 주로 얼굴에 한정되어 있기 때문에 얼굴위주로 한장씩 뽑아낸다. 이후 multi uv방식으로 전에 랜더링한 얼굴부위의 맵 이름을 규칙을 그대로 적용해준다. (이름변경) 


가령, 현재 프로젝트에서 얼굴부위 이름은, u_2 v_1 맵에 해당하므로, 해당하는 디스맵만 한장 뽑아내고 이름을 그전의 multi map export에서 만들어진 방식으로 설정했다.

2 주름 컨트롤러 지정
- 왼쪽 눈썹 컨트롤러에 따라서 이마 주름이 나타났다가 사라져야 한다.


3 노드구조
- 노드 에디터에서 바로 시작하는 방법이 좋지만, 하이퍼쉐이더에서 쉐이더를 일단 가져온 뒤에 노드 에디터로 옮길 수 있다. (중간 마우스 드래그)

 

- file노드를 2개 생성하고, 아래 사진에서 위쪽에는 주름 디스맵을 넣고, 아래 노드에는 기본 디스맵을 넣는다. (file노드에서 알파offset같은 강도는 설정하지 않는다)

 

- plusMinusAverage 노드를 2개 생성해서, 하나는 'subtract'(빼기)모드로 하고 나머지는 'sum'모드로 한다.

- subtract모드의 plusminusAverage노드의 input 1D[0]에 기본 디스맵 out Color R노드를 연결하고, 주름디스맵의 out Color R값을 input 1D input[1](두번째)에 연결한다. (사진참고)


- multiplyDivide노드를 생성하고, subtract모드의 plusMinusAverage노드의 outPut 1D값을 muliplyDivide노드의 input 1X에 연결한다.


- 기본 디스맵이 있는 파일노드의 out Alpha값을 plusMinusAverage노드(sum모드)의 input 1D[0]에 연결한다. 

- multiplyDivide노드의 outputX값을 plutMinusAverage(sum모드)의 input 1D[1]에 연결한다. (아래사진 참고)

 

- plusMinusAverage(Sum모드)의 output 1D값을 displacement 쉐이딩노드와 연결한다.


4 노드 에디터 설정
- 하이퍼쉐이더에서 만든 노드를 중간 마우스 드래그로 노드에디터에 끌어다 놓는다.

- 왼쪽 눈썹 컨트롤러 노드(no shape노드)를 노드에디터로 갖고 온다.  여기서는 translateY값에 따라서 주름맵 활성화 유무가 나타나기 때문에, translateY 파이프를 multiplyDivide노드의 input 2 -> input 2X와 연결한다.


- multiplyDivide노드의 모드가 'multiply'로 설정되어 있다. 따라서 translateY값이 0만 아니라면 input 1X에 들어온 디스맵 차이값에 따라 디스맵 수치가 달라진다. 


 

5 주름맵 실험
- 랜더링 시간이 많이 소요되기에 nHair 효과를 삭제했다. (머리가 그대로 가라앉음) 주름을 대충 만들었지만, 눈썹 컨트롤러의 translateY값이 커짐에 따라 주름이 선명하게 나타난다. 주름값이 너무 강하다면, multiplyDivide노드의 output값을 감산하는 노드를 연결하면 된다.