JiggleBone / Ragdoll (지글 본/래그돌) 적용기

스매싱 더 배틀 플레이 영상 https://www.youtube.com/watch?v=kSmeidraUqs

jiggleBone관련참고자료 http://farfarer.com/blog/2011/07/07/unity-skeletal-ragdoll-jiggle-bones-tutorial/


※ 해당글은 Game Character Artist인 James O'Hare님의 글을 기본으로 하여 제 주관을 덧붙임 것임을 밝혀둡니다.



'스매싱 더 배틀'의 한군님께 마리 루시의 트윈테일 머리 애니메이션이 너무 자연스러워서 방법을 물어봤었는데,

jiggle Bone 이라는 것을 사용해서 실시간으로 시뮬레이션 하는것이라고 하셨다. (다른 명칭으로 Ragdoll 이라고도 하는 듯)


뭔가 실시간이라니 무거울 것같은 느낌이지만! 한번 테스트해보기로 하였다.




0. Jiggle Bone 이란?




- 헤어, 가슴, 치마, 허리띠와 같이 캐릭터의 움직임에 따라서 반동으로 움직이는 것들을 애니메이터가 직접 잡아주지 않고 물리엔진에 의해시뮬레이션 하는 것

- 세팅만 잘 한다면 훨씬 자연스럽기도 하고, 애니메이터의 업무부담도 덜 수 있다.




1. 3Ds Max에서 셋업하기


   



 - 이 캐릭터의 경우는 앞머리 양쪽 2개, 뒷머리 한개로 본을 구성하였다.



- 캐릭터 자체는 일반적으로 하듯이 리깅을 하면 된다. 

- jiggle bone을 붙이고 싶은 오브젝트는 바이패드에 있는 ponytail이나 Extra Bone을 사용해서 스킨을 발라준다.

- 제일 중요한건 jiggle bone에는 절대 키프레임이 존재하면 안된다. (T포즈에다가 키를 넣는것도 안된다!)




2. 3Ds Max에서 익스포트하기


- 익스포트할 때, 메쉬와 twist bone을 포함한 모든 본을 선택한다음 Export Selected로 익스포트한다.

- 이때에는 Animation을 포함하지 않고 내보내야한다. 

   (애니메이션을 같이 내보내면 jiggle bone에 키프레임이 걸린다고 한다.)




3. 3Ds Max에서 애니메이션 익스포트하기


- 그리고 애니메이션을 내보낼 때에는 jiggle bone만 제외하고 선택해서 Selected로 익스포트를 하면 된다.

- Max의 Layer 기능을 활용하여, jiggle bone들을 별도의 Layer에 넣고, 프리징을 걸어놓으면 더 편하다.

- 당연한 거지만 파일 명칭은 [모델이름]@[애니메이션이름].fbx 로 내보내야한다.

- 그리고 Bake Animation을 체크해야한다. 그렇지 않으면 twist bone이 익스포트 되지 않는다.




4-1. 유니티에서 셋팅하기 : parent bone & Other bone


   


- jiggle 본이 부딪히게 되는 Parent 본과 그 밖에 팔, 어깨 등에 rigid body와 collider를 달아 jiggle본이 부딛힐 수 있게 한다.


[ 상위 본 ]

- rigidBody를 달아준 후, Use Gravity는 체크해제. Is Kinematic는 체크해준 뒤, Capsule collider를 달아준다. 

   (Is kinematic은 다른 오브젝트에 영향을 주지만, 이들 자체는 물리 특성의 영향을 받지 않는 것을 의미한다)

- 나중에 이 캡슐 콜리더에 부딪혀서 jiggle bone이 바운스 되는 것이니 위치 선정을 적절히 해줘야 한다.

- 만약 허리에 달린 벨트를 표현하고싶다면 엉덩이 부분뿐만아니라 다리쪽에도 위와같은 세팅을 하는편이 자연스럽다.




4-2. 유니티에서 셋팅하기 : jiggle bone


   


 

- Character Joint는 ponytail쪽의 설정값. 앞쪽 헤어는 swig Axis가 x축으로 되어있는것만 다르다.


[ jiggle bone ]

- rigidBody를 달아준 후, Use Gravity는 체크, Is Kinematic은 체크해제.

- mass와 Drag를 적당한 값으로 설정. 일단 테스트값은 3과 0.5정도로 하면 된다.

- Collider를 달아준 뒤, bone 위치와 일치하도록 맞춰준다.

- Character Joint 컴포넌트를 달아준다. 이 컴포넌트의 세팅값이 무척 중요한데, Connected Body는 바로 상위 bone을 할당해주고, Axis와 Swing Axis는 벡터값이기 때문에 세개의 축 중 하나만 1, 나머지는 0으로 둔다. Twist Limit는 -5~5정도로 낮게 주는것이 좋고, Swing은 취향대로 준다.

- 하위본이 존재한다면 각각에다 똑같이 달아준다.




4-2-1. 모든 Jiggle Bone에 달아줘야할 스크립트


#pragma strict


private var thisParent : Transform;

private var thisRigidbody : Rigidbody;


private var parentPosLastFrame : Vector3 = Vector3.zero;


function Awake () {

thisParent = transform.parent;

thisRigidbody = transform.GetComponent.< Rigidbody > ();

}


function Update () {

thisRigidbody.AddForce ( ( parentPosLastFrame - thisParent.position ) * 100 );

parentPosLastFrame = thisParent.position;

}


 - 없어도 되긴 하지만, 아래의 스크립트를 달아주면 모멘텀이 생긴다.

 - 이건 일단 꺼놓고 없어도 자연스러운 상태가 되면 그 때 달아보고 결정하기 바란다. 빠르게 움직이는 오브젝트는 사방팔방으로 튀는 경우가 있다.



5. Physics Setting


- Collider를 사용하기 때문에 다른 콜리더의 간섭이 있다면 머리카락이 미친듯이 춤을 춘다.

- 별도의 jiggle Bone 레이어를 만든 후 Player Setting쪽에 있는 Physics 세팅을 통해 다른 콜리더의 간섭을 배제한다. 




+ 유니티에서 기본적으로 ragDoll 컴포넌트를 제공해준다. 머리, 팔, 다리 등을 지정해주면, 래그돌을 만들어준다.

   날아가거나 굴러떨어지는 시체들을 표현할때 쓰는 듯하다.

   관련 듀토리얼 : https://www.youtube.com/watch?v=Maxmzd_rWHE 





댓글

Designed by JB FACTORY