본문 바로가기
정보융합탐구

[ 정융탐 ] 02. 손을 만들어보자

by 조종빈 2023. 4. 11.

저번 시간에는 VR 개발에 필요한 기본적인 설정을 완료하고 컨트롤러의 입력을 받아보았습니다.

이번 시간에는 손의 그래픽을 추가하고, 핀치와 그립 애니메이션을 넣어 우리의 손을 만들어보겠습니다.


글을 시작하기에 앞서, 손의 모형은 대부분 직접 모델링하거나, 적당한 에셋을 찾아서 사용합니다. 

저는 해외에 존재하는 튜토리얼 자료의 손 패키지를 사용하였습니다. 자료는 다음 구글 드라이브에서 얻으실 수 있습니다.

https://drive.google.com/file/d/10b39IekUdpBHlcTslZ-BlNRyH5uqPUe1/view


위 링크에서 다운로드 받은 유니티 패키지를 에디터 창에 드래그해서 놓아주시면 자동으로 이러한 창이 뜹니다.

Import를 눌러서 임포트해줍니다.

이 패키지 안에는 기본적인 손의 애니메이션들, 모형들이 들어있습니다. 이번에는 가장 기본적인 핀치와 그립만 다루어보도록 하겠습니다.

임포트한 후 Oculus Hands - Prefabs 폴더에 들어가면 존재하는 Left Hand Model / Right Hand Model을 지난 시간에 만든 큐브 대신 넣어줍니다. ( 큐브는 삭제합니다 ) 

화살표를 눌러 모델을 자세히 뜯어보시면 hands:Rhand ( hands:Lhand ) 와 같이 적힌 오브젝트가 있는데, Meterial을 조절하여 색깔과 느낌을 바꾸어 줄 수 있습니다.

저는 파란색 계열의 색으로 설정해주었습니다.

이후 애니메이션 설정을 진행하기 위하여 먼저 구성을 살펴보도록 합시다.

Window - Animation - Animator 창으로 이동하여 줍니다.

이후 Blend Tree가 적힌 사각형을 더블클릭 하여 주면 다음과 같은 화면이 뜨는데요, 핀치( Trigger ) 와 그립 ( Grip ) 애니메이션을 값에 따라 조정해줄 수 있습니다. 이 값을 VR 컨트롤러로부터 입력으로 받고, 실제 주먹을 쥐는 것처럼 만들 수 있습니다.

Animator 창을 닫고, 본격적으로 애니메이션의 설정을 진행하기 위해 Right Hand Model ( Left Hand 먼저 하셔도 괜찮습니다. ) 의 Inspector창에서 Add Component를 클릭해줍니다. 

새로운 스크립트를 작성할 것이기 때문에 이름을 지어 주시고 New Script를 생성합니다.

스크립트를 열어주시면 가장 먼저 UnityEngine에서 지원하는 InputSystem을 사용해야 하므로, 다음과 같이 입력하여 줍니다.

다음으로는 유니티 에디터 창에서 끌어다 쓸 수 있는 변수인 public 변수의 형태로, InputActionProperty 변수를 사용하기 위해 다음과 같이 입력하여 줍니다.

입력을 하고 유니티 에디터 창으로 돌아오게 되면 다음과 같이 무언가 설정을 할 수 있는 창이 생겼습니다.

이 창에 컨트롤러의 액션 중 하나를 넣고, 그 값을 입력받아 아까 살펴보았던 애니메이터를 실행시키는 것입니다.

저희가 핀치 ( trigger ) 로 입력받을 부분은 컨트롤러의 Activate Value라는 값이고, 이 부분은 트리거를 터치하게 되면 실수의 형태로 주어집니다.

Use Reference에 체크해주시고 Starter Assets 안의 XRI RightHand( LeftHand ) Interaction/Activate Value를 찾아 Reference 퍼블릭 변수에 드래그해서 놓아줍니다. 

입력값이 정상적으로 전달되는지 확인하기 위해 유니티 내의 콘솔에 값을 출력해주는 Debug.Log 함수를 사용합니다.

그 후 Window - General - Console 에 들어가시면 콘솔 창이 나타나게 됩니다.

콘솔 창에서 Debug.Log를 설정해주었기 때문에, 입력값이 없으면 ( 트리거를 터치하지 않았으면 ) 0의 값이, 입력값이 있으면 ( 트리거를 터치했으면 ) 0이 아닌 값이 나타나는 모습을 볼 수 있습니다.

( 저는 VR기기를 사용한 것이 아니라 VR 시뮬레이터를 사용하여 테스트했기 때문에 0 또는 1의 값이 나오지만, 실제로는 0과 1만 나오지는 않습니다. ) 

입력이 잘 들어오는 것을 확인했으니 이제 본격적으로 애니메이터를 활성화시켜주어야 합니다.

public 변수로 Animator를 담는 handAnimator 변수를 만들어주시고, triggerValue 값을 받을 수 있도록 SetFloat함수를 이용하여 코드를 작성해줍니다.

다 작성한 후에는 Animator ( 파란색 글씨 ) 를 Public변수인 Hand Animator ( 파란색 배경으로 채워진 박스 ) 쪽으로 드래그해서 놓아줍니다.

실행해보면 다음과 같이 핀치가 잘 작동하는 모습을 볼 수 있습니다.

그립 애니메이션도 동일한 방식으로 진행하므로 다음과 같이 코드를 작성합니다.

그립 에니메이션의 액션으로는 Select Value를 이용할 것이므로, XRI RightHand( LeftHand ) Interaction/Select Value를 드래그해서 놓아줍니다.

그립 액션도 역시 잘 작동하는 모습을 볼 수 있습니다.

이렇게 하여 핀치와 그립 애니메이션을 손 모양의 프리팹을 가져와서 구현해보았습니다. 왼손 또한 동일한 방식으로 진행할 수 있습니다.

실행 화면