본문 바로가기

ani/Character setting (rigging) in 3ds max

3ds max _ 철퇴 리깅 ; nonflip spline IK setting for spring magic

< 셋팅의 목적 >

 

이런 모델링이 있다고 가정해보자.

1. spline IK 를 활용하여 본이 늘어나는 셋팅
2. spline IK 세팅 시 나오는 고질적인 문제인 플립 현상의 해소
3. spline IK를 사용하되 필요에 따라 spring magic 스크립트도 사용할 수 있는 구조
4. 철퇴라는 무기 특성상 최하단 자식의 애니메이션 키로 고정할 수 있는 기능
5. spline IK의 각 컨트롤러의 디폴트 위치를 쉽게 되돌릴 수 있는 기능

이 셋팅 과정 중 수많은 본과 컨트롤러가 생성되는데, 이때 사용되는 본들의 네이밍 및 레이어 정리까지 기록하고자 한다.
이 글에서는 스플라인의 기본적인 정의와 기초적인 생성 방법에 대한 것은 다루지 않을 것이며
스플라인의 자동 생성 툴은 chainstools 스크립트로 (이 부분 손으로 만드는 것은 다른 게시글에 게시 예정)
nonflip 기능은 pinksox님의 스크립트를 활용할 예정이다.

2번은 nonflip의 장점이 있으나 셋팅이 복잡해지고, 스플라인은 플립현상이 있어도 간단한 셋팅을 원한다면 2번은 건너뛰어도 된다.
3번 역시 스프링매직을 사용하지 않아도 상관이 없다면 3번도 건너뛰어도 괜찮다.
셋팅하고자 하는 캐릭터의 애니메이션을 어떻게 만들지 따라 셋팅방법이 정해질 것 같다.

미리 보는 결과 셋팅








< 셋팅 적용 >

본격적인 셋팅 전 준비 과정

1. 첫 번째로 스플라인 IK의 셋팅은 Top 뷰에서 생성하는 것이 가장 안정적이며 맥스 내에서도 엔진 내에서도 오류가 적다.
이때 고려해야 할 지점은
 

  • 모델링을 훼손하지 않는다.
  • top view에서 spline IK 본 셋팅을 진행한다.

이 두 가지가 동시에 충족되어야 한다.

따라서, 해당 메쉬를 snap shot을 이용하여 셋팅 골조 생성을 위한 메쉬로 따로 생성한다.


해당 메쉬를 잡고 tools > snapshot 옵션은 위와 같이하여 새로운 메쉬를 생성한다.
기존 해당 메쉬는 hide 시켜둔다 (하나의 메쉬일 경우 에딧터블 폴리에서 엘레멘트를 숨기는 방식으로 숨긴다)

스냅샷 mesh 네이밍 변경


편의를 위해 해당 메쉬의 네이밍을 이렇게 변경하였다.

스냅샷으로 복제한 메쉬는 editable poly로 변경해 준다.
<<앞으로 모든 과정은 스냅샷의 메쉬(weapon_copy)에서 진행한다>>



2. 스플라인 셋팅하고자 하는 메쉬의 가장 최상 단 부분의 중심이 어디인지 잘 모를 경우


해당 뚜껑? 메쉬는 없애고, border을 이용해 모서리를 잡은 뒤 shift 누른 채로 스케일을 줄여 살짝 메쉬를 만든 뒤 collapse를 해주면 중심점이 생긴다.

중심점이 생겼다!

 



3. 이제 중심점을 알았기 때문에 해당 메쉬의 중심을 관통할, 그리고 후에 다시 해당 위치를 다시 찾아올 수 있게 해주는 헬퍼 본을 달아준다.(snaps toggle를 사용)
해당 메쉬는 본에 링크 걸어준다.>> 본이 메쉬의 부모가 되어야 한다
(이 부분은 모두 셋팅을 위한 준비 작업이므로 fbx export와 연관이 없다.)

 


그리고 이 해당 본 위치를 기억할 헬퍼를 하나 생성하여 본에 포지션, 로테이션 모두 align 시켜준다. 해당 핼퍼는 위치 찾기용이므로 건들지 않는다.


4. bone_pos_weapon 본을 잡고 (0.0.0) 으로 이동시킨 뒤 top 뷰에서 윗방향을 잘 바라보도록 배치시켜준다.

대략 이런 모양새이면 될 것 같다. 그 외 셋팅을 방해할 메쉬는 모두 hide 해주었으면, bone_pose weapon 본도 셋팅과정에서는 쓰이지 않으므로 hide 시킨다.



본격적인 셋팅 시작



< 기본적인 spline IK 골조 만들기 >


스플라인 셋팅은 http://www.joleanes.com/chain-tools.html 의 체인툴을 활용하고자 한다.


1. 우선 create에서 line을 택한 뒤 snap toggle 옵션에서 vertex에 맞추어준다.
생성하고 싶은 컨트롤러의 개수만큼 top뷰에서 메쉬의 가장 최상단이 될 부분의 위치에서부터 순차적으로 점을 찍어준다.
점찍어주는 부분은 곧 컨트롤러의 위치가 된다.

 

좌 에서부터 1, 2, 3 번 사진

이왕이면 컨트롤러의 위치는 거리감이 비슷할수록 더 좋다.
만약 손으로 컨트롤러를 직접 달아줄 지식이 있다면 거리가 어떻든 상관없지만 편의로 해당 스크립트를 사용할 땐 비슷한 거리감으로 생성하는 것이 가장 베스트이다. ( 손 스플라인은 다음 게시글에..)
해당 스크립트를 쓰기 위해 이왕이면 1번보단 2번이 낫고,
스플라인의 장점(많은 본을 적은 컨트롤러로 제어)을 위해서는 3번이 더 낫다.

하지만 이번 글에서는 스프링 매직 툴을 사용하기 위해 2번 방향으로 진행해 보고자 하나,
스프링 매직 셋팅이 별도로 필요가 없다면 3번도 나쁘지 않다고 생각한다.
애니메이터의 애니 디테일의 정도에 따라 (그리고 귀찮음 정도에 따라) 컨트롤러의 개수는 정하면 될 것 같다.

해당 버텍스는 사이드 뷰에서도 위치 확인을 꼭 해주어야 한다.

 


사이드에서 확인해 보니 무기메쉬의 중앙이 아니어서 사이드에서도 버텍스 셀렉션으로 위치를 맞추어주었다.



2. 생성한 버텍스를 모두 셀렉한 뒤 우클릭 > smooth를 해준다.




3. chainstools 스크립트를 불러와서 생성한 line을 셀렉 후 예제의 경우 5마디이므로 bones : 5로 설정해 두고 ok를 눌러 실행시킨다.
이때, 더 유연한 곡선을 원한다면 본의 개수를 마디의 배수로 늘려도 상관없다. 예제의 경우 5마디이므로 10개, 15개, 20개 가 그 예이다.

bone : 10의 경우 3번 사진과 같이 정확하게 본 끝 부분과 컨트롤러의 위치가 맞아 떨어져서 애니메이션 잡기에 용이하다.




4. 체인툴로 생성한 본의 stretch Factor을 확인했을 때, 1 값이 아니라면, reset stretch를 눌러 1.0으로 만들어준다.
이 때, 최상단의 부모부터 리셋시키며 내려가는 것이 좋다.

 


 

< nonflip spline IK 골조 만들기 >

1. chainstool 스크립트 사용으로 생성된 'bone'만 셀렉하여(end 본 포함), nonflipbone스크립트를 사용해 create를 눌러 nonflip bone을 생성한다.

nonflipbone 스크립트의 작동원리는 링크로..
개인적으로,, 현실에서 고무호스는 왜 플립 현상이 없을까의 접근 방식이 신선해서 충격적이었다.

 

이때 생성되는 이 노란색 본이, 최종적으로 skin을 먹일 본(end 본 제외)이 된다.


2. 따라서, 이쯤에서 레이어 정리를 하는 것이 좋다.

스킨에 사용할 본은 >> skin_bone_weapon
nonflip 본의 업노드가 되는 주황색 헬퍼는 >>NFB_helper_weapon
chainstool 스크립트로 생성된 헬퍼는 > ctrl_spline_weapon
나머지 셋팅을 위한 chanstool때 생성된 본과 엔드본은>> setting_spline_weapon
으로 분류해 두었다.

hide 시킨 레이어는 구조를 위한 본과 헬퍼이므로 숨겨둔다.




< springmagic을 위한 셋팅 >


컨트롤러를 제외한 나머지 레이어는 모두 hide 한 상태에서 진행하도록 한다.

1. snap toggle의 옵션을 pivot으로 두고, 빨간 helper의 위치에 본을 생성한다.



그리고 위와 같이 본 네이밍과 레이어를 정리했다.
실제 hide 했던 본들을 켜면 무엇이 어떤 본인지 굉장히 헷갈리므로
스프링 본은, 좀 더 크기를 키워, display as box로 해두고 색도 변경하는 것이 좋다.

정리 전(좌), 정리 후(우)



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

결과적으로 스프링 본에 헬퍼가 종속되면서,
스프링본에 스프링매직툴을 사용했을 때, 스플라인의 스킨본들이 따라가는 구조가 된다.

>> 스프링을 걸고자 한다면, 만든 스프링 본을 직접 애니키를 주기보단, chain_root을 첫 본처럼 사용하고, 스프링_01 본부터 스프링 매직을 사용하면 좀 더 애니 잡기가 편하다.


 

< 철퇴 공 부분 셋팅 >

1. 스플라인의 마지막 빨간색 컨트롤러(Control_ChainKnot_6)를 링크 컨스트레인으로 전환해 준다.

이때 전환하게 되면 부모의 종속 관계 때문에 위치가 (0, 0, 0)으로 튀게 되는데, 다시 얼라인으로 스프링본의 마지막 엔드본에 얼라인 시켜주면 된다.

링크 컨스트레인에 디폴트로 0 프레임에 스프링본의 엔드본을 추가해 준다.


2. 철퇴 머리에 해당되는 본을 마지막 빨간색 컨트롤러 (Control_ChainKnot_6)의 피봇과 일치하게 생성해 준다.
해당본을 bone_weapon_head_01으로 수정했다.


3. bone_weapon_head_01을 링크 컨스트레인을 걸어 마지막 빨간색 컨트롤러(Control_ChainKnot_6)를 추가한다.


4. bone_weapon_head_01을 스킨 본의 마지막 본에 링크 건다.


결과적으로

이런 구조를 갖게 되며

이 본이 fbx 익스포트 하는 본이 된다.


결과적으로 철퇴의 고정시킬 수 있는 기능은 마지막 빨간색 컨트롤러(Control_ChainKnot_6)의 링크 컨스트레인으로, world와 스프링 엔드본에 교차시키며 사용하는 것이 되겠다.
애니메이션 키를 잡을 때 주의해야 할 부분은 world로 하여 키를 주게 될 시 모든 컨트롤러에 키가 들어가 있어야 컨트롤하기 쉽다.
(마치 바이패드에 올키를 주 듯)



 

< 컨트롤러의 디폴트 위치 저장 >

spline IK의 각 컨트롤러의 디폴트 위치를 쉽게 되돌릴 수 있는 기능 *로테이션과 포지션 각각 따로 적용이 주목적이 되겠다.

보통 set as skin pose와 assume skin pose를 이용하여 디폴트 위치를 되돌리는 데 사용하지만,
단점이라면, 포지션과 로테이션이 동시에 리셋되는 것이다.

맥스에 이러한 기능의 해소를 위해 기본기능인 freeze transform 기능이 있는데, (셀렉 후 alt + 우클릭)
이 기능은 어사인 컨트롤러에

이러한 것이 붙기 때문에 주로 컨트롤러에 사용이 권장된다.

freeze transform을 해준 뒤 해당 오브젝트 셀렉 후 alt + 우클릭
transform to zero는 포지션값 + 로테이션값을 동시에 리셋
rotation to zero는 로테이션 값만 리셋시킬 수 있다.



1. 이 기능을 사용하기 위해 맨 처음 준비 단계에서 만들어 두었던, bone_pose_weapon을 Helper_Chain_Root의 부모가 되게 만든다.



2. bone_pose_weapon를 point_zero_pose_weapon에 얼라인 시켜, 원래 모델링 위치에 맞게 본들을 정렬해 준다.


3. Helper_Chain_Root를 unlink를 해주고 필요한 부모에게 링크를 다시 걸어준다.
예제의 경우 Bip001 L Clavicle이 되겠다.
셋팅을 위해 만들었던. bone_pose_weapon, point_zero_pos_weapon, weapon_copy (스냅샷 메쉬)는 이제 삭제해도 괜찮다.



4. 빨간 컨트롤러와, helper_chain_root에 한하여, 반드시 하나씩 셀렉하여 alt+우클릭 freeze transform을 해준다.

이러한 경고창이 떠도 yes 눌러주면 된다.
위에서 말했던 어사인 컨트롤러를 리셋시키고 zero pos를 위한 컨트롤러를 셋팅한다는 뜻이다.
기존에 어사인 컨트롤러에 특별한 셋팅을 걸어준 것이 아니면 크게 문제 되지 않으며 이것이 컨트롤러에 한하여 사용되는 기능인 이유이기도 하다.
마자막 링크 컨스트레인을 걸어두었던, 컨트롤러도 freeze transform 해준다. 링크 컨스트레인 밑으로 계층이 들어가는 구조이기 때문에 영향이 가지 않는다.

이런 이유에 파란색 작은 컨트롤러는 set as skin pose, assume skin pose로 리셋시키는 방법밖에 없을 것 같다.

파란색 작은 컨트롤러!


5. 마지막으로 스프링본 또한 똑같은 과정을 해준다.





수정사항 >> export 본 단순화 시키기
 
1. 스킨본의 최상단 본은 클릭하고, 어사인 컨틀롤러> rotation list에서 orientation constratin를 더블클릭해 활성화 시킨다

 
 
2. 스킨본의 최상단 본을 Helper_Chain_Root에 링크 시킨다.

 
3. 다시 rotaion list에서 Euler XYZ로 활성화 시킨다.
 

 
 
4. 스킨본의 최상단본의 어사인 컨트롤러의 position을 position constraint 으로 전환시킨뒤, 
첫번째 빨간 컨트롤러를 타겟으로 삼는다.

 
 
 
 
이러게 되면 결과적으로

 
이렇게 fbx export 시킬 본이 정리된다.
 
해당 본은 예제 파일에 selection set에 묶어두겠습니다.
 
 

마무리

이제 해당 스킨 본에 스킨을 넣어주는 것으로 마무리가 되겠다.

유니티에서 테스트해봤을 때 이상이 없었다. 언리얼은 별도의 테스트가 필요하다.
그리고 위 과정중 하나라도 순서가 뒤바뀌면, 본들이 이리저리 튀는 참사가 일어난다..ㅠ


애니메이션 줄 때 팁이라면, 스프링매직을 사용해야 할 곳에서 먼저 선 사용 후에, 스플라인의 컨트롤러로 제어하는 것이 가장 이상적이다. 아니면 애초에 스프링본을 아예끄고 스플라인 컨트롤러만 사용해야한다.

사실 몇 번 만져보면 어떤 것이 감이 와서 계층 구조가 섞여있어 뭔가 설명하기가 어렵다..
추가적으로 스플라인의 트위스트 셋팅도 해주면, 플립되지 않는 스플라인이 구현된다. 이 셋팅을 진행하게 되면 스킨본은 변경된다. >> 다음 게시글에 계속

이 셋팅을 생각하게 된 경위는 스킬이 아닌, 힘을 빼도 되는 일반적인 공용 애니메이션( 걷기,, 죽기,, 히트... 등등)에서 클립을 빨리 쳐내기 위해 스프링 본을 달게 된 거라, 그 목적에 맞게 나누어 사용하는 것이 좋을 것 같다.

분명 더 좋은 셋팅 방법이 있을 것 같지만 좀 더 공부해서 더 간단하고 오류가 없는 셋팅 방법을 찾아보는 것으로..! 마무리



해당 맥스 예제 파일은 첨부에 올려놓겠습니다. ( _ _ )
 

spline_test.max
0.96MB