VR 콘텐츠 제작

[Unity VR]애니메이션을 이용해서 커스텀 핸드포즈 만들기

송현호 2023. 11. 2. 10:02

오큘러스 SDK의 Interaction을 사용해서 커스텀 핸드포즈를 구현하려고 관련자료를 찾아봤는데 자료가 너무 적어서 찾을 수가 없었다. 그래서 코드를 까봤는데 애니메이션을 이용해서 핸드포즈를 만드려면 Interaction보다는 OVR Grabber를 사용하는게 구현이 더 용이하였다.

 

먼저 OVRCameraRig를 검색해서 하이어라키에 추가한다.

MainCamera는 지워주자

 

 

LeftHandAnchor아래에 LeftControllerAnchor에 CustumHandLeft를 검색해서 추가해주자.

 

 

이 과정에서 쓰고 싶은 손 모델이 있다면 l_hand_skeletal_lowres를 비활성화하고 쓰고 싶은 핸드모델을 추가해주면 된다.

GameDevHQ의 손 모델을 추가해서 사용하기로 했다.

 

 

그리고 LeftHandAnimator을 검색해서 (l_hand_skeletal_lowres에서 선택해도됨) 컨트롤 + D를 눌러 복사본을 만들자

이름은 CustomLeftHandAnimator로 해주었다. 복사한 Animator를 Animation폴더를 만들어서 넣어주고,

추가한 Hands_05_L의 애니메이터 컨트롤러 부분에 CustomLeftHandAnimator를 넣어줬다.

 

 

그리고 CustomHandLeft를 클릭하고 Hand스크립트에서 Animator부분을 Hands_05_L로 바꿔준다.

 

 

 

 

 

 

 

 

 

 

여기까지하면 손의 그랩 기능은 완성이다, 이 다음 그랩의 대상이 되는 큐브에도 그랩이 가능하도록 스크립트를 추가해주어야한다.

 

큐브를 만들어서 리지드바디와 OVR Grabbable 스크립트를 추가하자.

 

 

그리고 실행해보면 기본적인 잡기 기능 구현은 끝이다.

 

 

이제 손에 큐브를 잡는 애니메이션을 추가해주어야한다.

이 과정에서 오큘러스 링크가 된다면 비교적 편하게 작업이 가능하다.

아까 추가한 Hands_05_L 프리펩을 선택하고 애니메이션 창을 열어 주자.

 

참고 사이트

https://youtu.be/Iphbtuhun-8?si=9q1BfqKtpZ_d3yXL

 

 

 

 

 

새로운 클립을 추가하자 이름은 l_hand_hold_cube로 해주었다.

 

 

 

큐브를 왼쪽 손으로 이동시켜준다음 애니메이션 녹화 버튼을 눌러준다.

 

 

손의 관절을 회전시켜서 큐브를 잡는 포즈를 만들어 준다.

 

 

녹화를 끝냈다면 하이어라키로 가서 큐브를 클릭한다.

그리고 큐브에 HandPose 스크립트를 검색해서 추가한다. 스크립트 이름 오른쪽의 점 3개를 누르고 Edit Script를 클릭한다.

HandPoseId에 Cube를 추가한다.

 

 

OVR Grabbable의 Snap Position과 Snap Orientation을 체크한다. 이 기능을 활성화하면 큐브를 잡을때마다 위치와 회전상태가 달라지는걸 막을 수 있다.

HandPose의 PoseId를 Cube로 설정하자, 설정을 다 끝내면 다음과 같은 상태가 된다.

 

 

다시 Hand_05_L을 클릭하고 Animator상태창을 켜주자.

 

 

아까 만들어 놓은 l_hand_hold_cube 애니메이션을 드래그해서 추가하자.

트랜지션을 만들고 Has Exit Time을 비활성화 한다음 아까 추가한 enum타입과 같도록 Pose조건을 설정해주면 된다.

Pose가 4일때(Equal) Cube애니메이션으로 전환하도록하고 Pose가 4가 아닐때(NotEqual)이면 Flex로 전환하도록 트랜지션을 설정하자.

 

코드를 까보면 OVR Grabber스크립트가 범위 내의 Grabbable을 가진 오브젝트를 찾은 다음 그랩하는 오브젝트의 PoseId를 받아서 애니메이션을 실행한다. 

 

실행해보면 손이 큐브를 그랩할때마다 l_hand_hold_cube 애니메이션을 실행하는 것을 확인할 수 있다.

큐브를 잡는 위치가 맞지 않으면 CustomHand Offset의 gripTrans위치를 수정해주면 된다.