본문 바로가기

ani/Character setting (rigging) in 3ds max

3ds Max _ 눈알 셋팅(2) - 평면, 카툰 형태의 눈, Planar eye rig; Wire Parameter, ExposeTm

1. 문제 현상 (지난 글에 이어서.. )


구 형태의 눈 세팅은 Rotation-LookAt Constraint를 사용해 회전 값으로 눈동자의 움직임을 만들어 주었지만,
평면 형태의 눈은 Position 값으로 눈동자의 움직임을 만들어 주어야 한다.

그래서 조금은 다른 방식으로 셋팅을 해줘야 한다.

만약 평면 형태의 눈을 구 형태의 눈 셋팅 방식과 동일하게 한다면

이때 흰자와 검은자는 서로 떨어져있는 메쉬이다.


이렇게 흰자에 파묻히는 현상이 벌어진다.
그렇다면 단순히 눈 본과 컨트롤러를 Link Constraint로 연결하여 Position 값을 준다면 해결이 될까?
결론부터 말하면 아니다.

캐릭터의 두상이 XY평면과 평행하다는 보장도 없을 뿐이기 때문이다.
좀 더 쉽게 얘기하자면, 탑뷰에서 보면

Top view


위와 같이 눈의 평면이 회전이 되어있어서
각각의 눈동자에 해당하는 Local 축을 고려하지 않고 컨트롤러의 축 ( World 축 ) 기준으로 움직이게 된다.

때문에 아래와 같이 흰자에서 눈동자가 이탈하는 현상이 생긴다.

Top view(좌) Front view(우)



그래서 구 형태의 눈세팅과는 완전히 다른 방식의 셋팅이 필요하다.
평면 형태의 눈 셋팅을 해보면서, 링크 구조에 따른 트랜스폼 값에 대해 알게 되었고, 여전히 헷갈리는 부분이라고 생각한다.


2. 해결 과정




서두에 설명한 현상을 해결하는 최종적인 셋팅의 목표는
컨트롤러의 World 값으로 눈동자가 Local 축 기준으로 1 : 1 대응하여 움직이게 만드는 것이다.



1. 눈동자의 중심에 Skin값을 줄 Point를 만든다. 눈동자 평면과 Point의 Local 축 방향이 일치하도록 배치한다.
Naming은 Point_L_Eye, Point_R_Eye로 했다.

Perspective view(좌) Top view(우)


이때 조심해야 하는 부분은 양쪽 point의 Local 축 방향이 같아야 한다.

Local 축 방향을 잘 보자..!

다시 말해 본을 mirror를 썼을 때처럼 축이 Y축 기준으로 좌우 대칭이 되면 안 된다.
그 이유에 대해서는 후술 하도록 하고 계속 진행해보자.
(그래서 좀 더 편하게 진행하기 위해 앞으로 만들 모든 Point를 Front뷰에서 생성시키고 움직여주는 것을 추천한다.)


2. 1에서 배치해놓은 Point에 눈동자 Skin값을 준다.

검은자에 해당하는 메쉬에만 1값을 각각 주었다.




3. 눈동자를 직접 잡고 움직여줄 컨트롤러를 Point로 만든다.

위와 같이 네이밍을 주었고 예제의 경우 보기 좋게 각 눈에 해당하는 포인트의 색을 바꾸어줬다.
평면 눈 컨트롤러는 구형태 눈의 셋팅과 다르게 눈 본의 Position과 Rotation값에 영향을 받지 않는다.
어느 위치와 각도에 있어도 상관없지만 셋팅의 직관성을 위해 눈과 일직선상에 두었다.


이 역시 Local 축의 방향이 눈동자와 모두 동일하게 두는 것이 좋다.



<잠시.. Zero Position에 대한 설명>

지금까지 Point에 어떤 링크 구조도 만들어 주지 않았다.
그 이유는 각 포인트의 Local값을 0으로 만들어줄 Zero position Point를 만들어 주기 위함이다.

Object의 링크 구조에서 자식의 Local값은 부모의 Pivot과 어느 정도의 위치와 회전 값이 주어졌는지에 따라,
자식이 맥스 내부적으로 값을 갖게 된다. 즉, 자식은 부모에 영향을 받는 구조를 두고 있다.
따라서, 부모와 자식의 Pivot이 정확하게 일치한 상태로 만들어준다면,
자식 Object의 Local값이 Zero Position 값으로 갖게 된다.

이렇게 Zero Position 값으로 만들어주는 것이 중요한 이유는,
내부적으로 1이 아닌 값을 갖게 된다면 컨트롤러를 사용했을 때 자식이 가지고 있는 값이 영향을 주기 때문이다.
이러한 특징은 Link Constraint를 사용할 때 명확하게 드러나는데,
이에 대한 내용은 후에 새로운 게시글로 다시 서술하는 것으로 하고
이 글에서는 눈 셋팅에 대한 방법에만 설명하고자 한다.





4. 만들어 주었던 Point에 Zero Position 역할을 할 Point를 생성하고, Align으로 Postion과 Rotation을 동일하게 만들어준다. 직관성을 위해 기존의 Point보다 크기를 크게 만들어주었고 아래와 같이 네이밍을 붙여주었다.




5. 눈 컨트롤러에 배치해줄 create에서 ExposeTm을 생성해 눈 컨트롤러에 Align 시켜준다.
(naming : Point_L_Eye_ExposeTM, Point_R_Eye_ExposeTM)
아래와 같이 직관성을 위해 오른쪽, 왼쪽 눈 컨트롤러에 가장 작게 만들어 주었다.
이때 모디파이어에서 Expose Node를 Point_Ctl_L, R_Eye로 둔다.


ExposeTM은 후술 하겠지만 간단하게 설명하면 해당 Object의 월드 로컬 트랜스폼의 정보를 가져오는 것이다.
특히 바이패드와 연결되어있는 Object 라면 ExposeTM의 활용은 매우 중요하다.

여기서는 Upnode로 둔 Point_Ctl_L, R_Eye의 트랜스폼 정보를 갖고온다.
이때 Zeropos로 만들어 놓은 Point이기 때문에 ExposeTm은 자동으로 Point_Ctl_L, R_Eye의 부모인 Point_Ctl_L, R_Eye_Zeropose와 간의 Position과 Rotation값 차이를 계산해준다.
우리는 이 셋팅에서 이 값을 활용하는 방식을 택하려고 한다.




6. 이제 링크 구조를 아래와 같이 만들어 준다.

지금까지 네이밍을 제대로 잘 넣어줬다면 무리 아래와 같은 계층 구조가 나와야 한다.



7. Point_L_Eye를 우클릭 > Wire Parameters > Transform > Position > X Position > 드래그하여 Point_L_Eye_ExposeTM
> Object (ExposeTransformHelper) > Local Position X를 선택해준다.




8. 좌측 칸의 축 방향과 우측 칸의 축방향을 확인 후 아래와 같이 <- 화살표 클릭 후 Connect를 선택한다.
그러면 오른쪽과 같이 해당 축의 색이 바뀐다.

이 뜻은 Point_L_Eye(오른쪽 칸)의 X축 Position값과, Point_L_Eye_ExposeTM의 Local X축 Position 값과 연결시킨다는 뜻과 같다.


이때 Point_Ctl_L_Eye를 선택하여 Local 축 기준 X축을 움직이면 눈동자가 따라서 움직이는 것을 알 수 있다.
아직 다른 축은 설정을 안 했기 때문에 지금은 X축만 움직인다.

컨트롤러와 컨트롤러 Zeropos와의 거리 차 만큼 눈동자가 움직이는 원리이다.


9. 동일한 방법을 Y축도 연결해주고 나머지 눈도 함께 진행한다.


다음과 같이 되어야 한다. Z 축 이동은 사용하지 않으니 생략한다.


이렇게 ExposeTM의 원리는 맛보았는데 잘만 활용한다면 여러 종류의 세팅이 가능하게 된다.



10. Point_Ctl_L, R_Eye를 Link Constraint로 Point_Ctl_Eyes에 연결시켜준다.
기존의 링크 구조 때문에 Point_Ctl_L, R_Eye의 위치가 튈 수 있는데, 당황하지 않고 Point_Ctl_L, R_Eye_Zeropos에 Align 시켜 원래 있던 자리로 옮겨준다.




11. Point_Ctl_L, R_Eye_Zeropos를 Link Constraint로 Bip001 Head에 연결시켜준다.




12. Point_Ctl_Eyes를 Bip001 Head의 자식으로 Link 시킨다.




13. Point_L, R_Eye / Point_L, R_Eye_Zeropose / Point_Ctl_L, R_Eye_ Zeropose / Point_L, R_Eye_ExposeTM 은 Hide 시킨다.

완성!



14. 메인 컨트롤러를 움직여 눈동자가 잘 따라가는지 확인해 본다.

성공!



3. 마무리


이 셋팅을 해보면서 부모 자식 간의 링크 구조, Wire Parameter, ExposeTM의 역할을 알게 되었다.
더불어 셋팅에 다양한 가능성까지 알게 되었던 경험으로
잘 숙지해서 다른 모델링에 다양한 방법으로 응용이 가능할 것으로 기대가 된다.