XR Interaction Toolkit Animated Hands (Grip, Pinch)

VR/XR Interaction Toolkit 2023. 12. 27. 12:12
반응형

https://youtube.com/playlist?list=PLTFRwWXfOIYBIPKhWi-ZO_ITXqtNuqj6j&si=XhyHS26tNDP6u7CA

XR Interaction Toolkit 2.4.3

XR Interaction Toolkit 2.4.3 OpenXR Oculus

www.youtube.com


새 씬을 만들어 주고 

메인 카메라를 제거 하고 XR Origin을 생성 한다 

 
 
Left / Right Controller 오브젝트를 선택하고 XR Controller 컴포넌트를 제외하고 모두 제거 한다 

 
 
Left Controller를 선택하고 다음과 같은 구조로 빈오브젝트를 생성한다 

 
Left Controller를 선택하고 Model Prefab과 Model Parent를 넣어준다 

 
오른쪽도 동일하게 진행한다 
 
Offset을 설정해 손의 위치와 회전을 설정 한다 
 

왼손 Offset
오른손 Offset
실행 결과

 


 

애니메이션 잡기 

 
왼손 프리팹모드로 들어와 

 
 
Animation을 선택한다 

Create버튼을 누르고 

 
애니메이션을 저장 한다 
Hand_L_Grip

레코드 버튼을 누르고 손을 접어 준다

 
 
이제 레코드를 해제 한다 
 

Pinch 애니메이션 만들기 

새로운 클립을 생성하고 
 

저장한다 

 
다시 레코드 버튼을 누르고 손을 접어준다 

 
이제 레코드를 해제 한다 
 
 

완전히 편 손 애니메이션 만들기 

새로운 클립을 만들고 

저장한다 

 
기본이 펴진 상태이기 때문에 키는 안잡아도 된다 

 
 
애니메이터 컨트롤러를 더블클릭하고 

 
안에 있는 State를 제거 한다 

 
블랜드 트리를 생성하고 

 
Float 형식으로 Grip, Trigger 파라미터를 생성하고 기존에 있던 것은 제거 한다 
팝업이 뜨면 그냥 지우겠다고 하면된다 

 
 
 
블랜드 트리를 선택 하고 

 
블랜드 트리를 선택하고 인스펙터에서 Blend Type을 2D Freeform Cartesian을 선택 한다 

 
Add Motion Field를 4개 만든다 

 
Pose X, Y 를 다음과 같이 설정 하고 

 
다음과 같이 모션을 넣어 준다 

 
손을 넣어주고 

 
 
빨간 점을 이용해 모션이 동작 하는지 확인 한다 

 
 
 
스크립트를 만들어 다음과 같이 작성하고 프리팹에 부착 한다 

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;

public class Hand : MonoBehaviour
{
    public InputDeviceCharacteristics inputDeviceCharacteristics;

    private InputDevice _targetDevice;
    [SerializeField] private Animator _handAnimator;

    private void Start()
    {
        InitializeHand();
    }

    private void InitializeHand()
    {
        List<InputDevice> devices = new List<InputDevice>();
        InputDevices.GetDevicesWithCharacteristics(inputDeviceCharacteristics, devices);

        if (devices.Count > 0)
        {
            _targetDevice = devices[0];
        }
    }

    private void Update()
    {
        if (!_targetDevice.isValid)
        {
            InitializeHand();
        }
        else
        {
            UpdateHand();
        }
    }

    private void UpdateHand()
    {
        SetAnimatorParameterValue(CommonUsages.grip, "Grip");
        SetAnimatorParameterValue(CommonUsages.trigger, "Trigger");
    }

    private void SetAnimatorParameterValue(InputFeatureUsage<float> feature, string parameterName)
    {
        if (_targetDevice.TryGetFeatureValue(feature, out float value))
        {
            _handAnimator.SetFloat(parameterName, value);
        }
        else
        {
            _handAnimator.SetFloat(parameterName, 0);
        }
    }
}

 
이때 Input Device Characteristics 는 Controller, Left를 선택 한다 

 
실행후 결과를 확인해보자 
 
인덱스 트리거를 눌렀을때 Pich가 
핸드 트리거를 눌렀을때 Grip 애니메이션이 실행되는지 확인한다 
 

 
 
오른손도 동일하게 작업 한다 
프리팹을 선택하고 

 

 
애니메이션 창을 열고 

 
저장하고 

 
 
레코드 버튼을 누르고 
손 모양을 잡아준다 

 
 
새 클립을 만들고 

다시 저장 하고 

 
레코드 버튼을 누르고 손 모양( Pinch)를 잡아 준다 

 
다시 새 클립을 만들고 

Hand_R_Open으로 저장한다 

 
기본형이 펴진 상태기 때문에 키는 안잡아도 된다 

 
 
핸드 프리팹을 선택하고 

 
 
컨트롤러를 더블클릭하고 

 
안에 있는 State들을 제거 한다 

 
Float 형식으로 2개의 파라미터 (Grip, Trigger)를 만들어 주고

 
 
블랜드 트리를 생성하고 더블 클릭해서 들어간다 

 
 
인스펙터에서 2D Freefrom Cartesian을 선택하고 

다음과 같이 파라미터를 설정 한다 

 
+ 버튼을 눌러 Add motion field 를 4개 생성하고 
다음과 같이 설정 한다 

 

 
이제 블랜드 트리의 슬라이더를 이용해 애니메이션 동작을 확인 한다 
 

 
 
핸드 프리팹을 선택하고 Hand 스크립트를 부착 한다
 
이때 Input Device Characteristics는 Controller, Right를 선택하고 
Hand Animator는 위에 있는 Animator 컴포넌트를 넣어주면 된다 

 
플레이 해보고 두 손 모두 애니메이션이 잘 나오는지 확인 하자 
 

 

반응형
: