XR Interaction Toolkit Animated Hands (Grip, Pinch)
VR/XR Interaction Toolkit 2023. 12. 27. 12:12https://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
새 씬을 만들어 주고
![](https://blog.kakaocdn.net/dn/bZPvdR/btsCKPz0eMF/bchEjVqTS70BFxk9JmYApk/img.png)
메인 카메라를 제거 하고 XR Origin을 생성 한다
![](https://blog.kakaocdn.net/dn/dosoZD/btsCLoCaB7A/XCBjEenb7zFSPWSxVoTk0K/img.png)
Left / Right Controller 오브젝트를 선택하고 XR Controller 컴포넌트를 제외하고 모두 제거 한다
![](https://blog.kakaocdn.net/dn/XPjDP/btsCLq7OHAs/VdKaeWA7t3CkKJqcnm3wX1/img.png)
![](https://blog.kakaocdn.net/dn/dGvBmj/btsCKo3t8xd/PeOC3LRIYpNssuOLKiKLqk/img.png)
Left Controller를 선택하고 다음과 같은 구조로 빈오브젝트를 생성한다
![](https://blog.kakaocdn.net/dn/dDWC01/btsCzrgCSvF/1zqrm7CjyXXhi6G03ncttk/img.png)
Left Controller를 선택하고 Model Prefab과 Model Parent를 넣어준다
![](https://blog.kakaocdn.net/dn/YNtdI/btsCAjibzjA/Fx9uTkNJGQ9Vv7ss5Agv8K/img.png)
오른쪽도 동일하게 진행한다
Offset을 설정해 손의 위치와 회전을 설정 한다
![](https://blog.kakaocdn.net/dn/UU9tN/btsCLoIVQOX/iXhkzNbl3W0Z2UWFl8o6e1/img.png)
![](https://blog.kakaocdn.net/dn/crvfN1/btsCzqWi0mf/JqF2WEBIs9cMXNJVHokau1/img.png)
애니메이션 잡기
왼손 프리팹모드로 들어와
![](https://blog.kakaocdn.net/dn/W08X9/btsCAkai5N8/vTsuBSxRX4ykqzbyRJ7ip0/img.png)
![](https://blog.kakaocdn.net/dn/OuO1R/btsCzszS7UD/884LLdRX8ZtMCoApp4ssW0/img.png)
Animation을 선택한다
![](https://blog.kakaocdn.net/dn/O2CN3/btsCF8mAJwv/3UiGkKIU0DhB1gkAzPSEh1/img.png)
Create버튼을 누르고
![](https://blog.kakaocdn.net/dn/KAFys/btsCLovpiXW/kuwBKh0rFlj6SyJGTHJYg1/img.png)
애니메이션을 저장 한다
Hand_L_Grip
![](https://blog.kakaocdn.net/dn/bZlfAL/btsCBNiYPfi/fE6DOIlDa6bStxGYKdEPhK/img.png)
레코드 버튼을 누르고 손을 접어 준다
![](https://blog.kakaocdn.net/dn/qOZ3H/btsCy4ltHRx/V9KqIkRKaqgmgvzWOOaR6K/img.png)
![](https://blog.kakaocdn.net/dn/RggrI/btsCBJ1WKQs/5U4zK1iC1I0CqKI2snZrl1/img.png)
이제 레코드를 해제 한다
Pinch 애니메이션 만들기
새로운 클립을 생성하고
![](https://blog.kakaocdn.net/dn/clHRsV/btsCKr0d67l/35VlT1jGZAFMW5zkE3p0EK/img.png)
저장한다
![](https://blog.kakaocdn.net/dn/Eqlh5/btsCzp37Rnj/AOpzbEhHnmo23YGyYOcdD1/img.png)
다시 레코드 버튼을 누르고 손을 접어준다
![](https://blog.kakaocdn.net/dn/crmOu2/btsCJhKiTFU/HVh7JKK9Iu2kb2CUp6QXTk/img.png)
![](https://blog.kakaocdn.net/dn/bIqerk/btsCzp37TgJ/YKRdc4RMX2kk9lfWEGMue0/img.png)
이제 레코드를 해제 한다
완전히 편 손 애니메이션 만들기
새로운 클립을 만들고
![](https://blog.kakaocdn.net/dn/ddOKhX/btsCJjH8y2E/VXKJIlzbeHKl9A8zhJWTlK/img.png)
저장한다
![](https://blog.kakaocdn.net/dn/dkbUwZ/btsCCx8ea05/5Yremx7oVfSCvzU3cXaM4k/img.png)
기본이 펴진 상태이기 때문에 키는 안잡아도 된다
![](https://blog.kakaocdn.net/dn/ATovP/btsCzGLtwIb/CDHVYd909UGTTTardQgxrk/img.png)
애니메이터 컨트롤러를 더블클릭하고
![](https://blog.kakaocdn.net/dn/b2idIh/btsCMoBV0nl/k10t46Kd9Friuukclw2BW0/img.png)
![](https://blog.kakaocdn.net/dn/cNgQDi/btsCIHI2kOA/APSukmnkrAMM7v2HK9oNV1/img.png)
안에 있는 State를 제거 한다
![](https://blog.kakaocdn.net/dn/u1cJw/btsCKQTc3yK/8dE8NwEGsiZkuIDyL7pKp1/img.png)
블랜드 트리를 생성하고
![](https://blog.kakaocdn.net/dn/cfGkCa/btsCIGQRvVG/eLTdKofM175cpxq9ZtYes1/img.png)
![](https://blog.kakaocdn.net/dn/o8Hi2/btsCzGkjUrC/pRS7dlxKV9FgYqapv1FZ0k/img.png)
Float 형식으로 Grip, Trigger 파라미터를 생성하고 기존에 있던 것은 제거 한다
팝업이 뜨면 그냥 지우겠다고 하면된다
![](https://blog.kakaocdn.net/dn/k612B/btsCJioUwUb/YiKw85JguEXD7oPYImkB5k/img.png)
블랜드 트리를 선택 하고
![](https://blog.kakaocdn.net/dn/O82xM/btsCzIoWVMd/SKQfIXSkBmqPfN2jBpZ6hk/img.png)
블랜드 트리를 선택하고 인스펙터에서 Blend Type을 2D Freeform Cartesian을 선택 한다
![](https://blog.kakaocdn.net/dn/bhsm4A/btsCzsNprFu/jfR1hKlHQ4lAKZfSPZKfJ0/img.png)
Add Motion Field를 4개 만든다
![](https://blog.kakaocdn.net/dn/6abDj/btsCKqAiN5b/NhxagepkEgLCWOufHViuk0/img.png)
![](https://blog.kakaocdn.net/dn/7tnXx/btsCDdPc6IO/Azs0FfCHtpom62JkgpkAL1/img.png)
Pose X, Y 를 다음과 같이 설정 하고
![](https://blog.kakaocdn.net/dn/wRDdk/btsCLqzYViU/QHHSIEFcKlEhbllA1S9uJ1/img.png)
다음과 같이 모션을 넣어 준다
![](https://blog.kakaocdn.net/dn/SCYF0/btsCIH3oLkm/3xMrsm5oE6zWArh0W5Rnak/img.png)
손을 넣어주고
![](https://blog.kakaocdn.net/dn/dnG6S5/btsCAjicrb7/ZB4lmeVq6ZfBllkRprccN1/img.png)
빨간 점을 이용해 모션이 동작 하는지 확인 한다
스크립트를 만들어 다음과 같이 작성하고 프리팹에 부착 한다
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를 선택 한다
![](https://blog.kakaocdn.net/dn/b0Od79/btsCDhRHmep/en2mUT1aZEl2uFhiLkIvK0/img.png)
실행후 결과를 확인해보자
인덱스 트리거를 눌렀을때 Pich가
핸드 트리거를 눌렀을때 Grip 애니메이션이 실행되는지 확인한다
오른손도 동일하게 작업 한다
프리팹을 선택하고
![](https://blog.kakaocdn.net/dn/cB8WgH/btsCzQgaUbl/2y6azUSQroG5J2bM0RBApk/img.png)
![](https://blog.kakaocdn.net/dn/o9rio/btsCCAjB0By/ijKV1Kdr6PzDKm0U6prKZ1/img.png)
애니메이션 창을 열고
![](https://blog.kakaocdn.net/dn/qxrHl/btsCG45yNFa/GGLnxlGOX6TKxWvyC8wAhk/img.png)
저장하고
![](https://blog.kakaocdn.net/dn/n3XO2/btsCLoa62y0/xBnggUIhqOQRGYV8huLaI0/img.png)
레코드 버튼을 누르고
손 모양을 잡아준다
![](https://blog.kakaocdn.net/dn/ytryt/btsCMzKetyR/CF318X4O8zsiYnCPj0VEa1/img.png)
새 클립을 만들고
![](https://blog.kakaocdn.net/dn/Oynal/btsCzF6OP3H/gSa6IzKeuI27JMjsOK3Og0/img.png)
다시 저장 하고
![](https://blog.kakaocdn.net/dn/nNJVm/btsCG1ugLAA/51d5HLYRb4x58nkG9S3rh1/img.png)
레코드 버튼을 누르고 손 모양( Pinch)를 잡아 준다
![](https://blog.kakaocdn.net/dn/GQcvC/btsCEIPd0Ru/yBub3nUsaT9SvDRRW1M3wk/img.png)
다시 새 클립을 만들고
![](https://blog.kakaocdn.net/dn/R6Jh2/btsCKsSlpi4/auP1xFFnkL7cXfYQT1vkE1/img.png)
Hand_R_Open으로 저장한다
![](https://blog.kakaocdn.net/dn/cBkxt0/btsCLohTx52/67Yg1kMDDUJwuT8RRkW9bK/img.png)
기본형이 펴진 상태기 때문에 키는 안잡아도 된다
![](https://blog.kakaocdn.net/dn/zN7wi/btsCKsESqWe/XmNI71f533SkIZSN9Cpky1/img.png)
핸드 프리팹을 선택하고
![](https://blog.kakaocdn.net/dn/cbBLmv/btsCGaxWDal/Lz2Aww5lAugyaKjFUq924k/img.png)
![](https://blog.kakaocdn.net/dn/bniHlR/btsCAknMMuJ/8k9mOm7d9ch98jsX7KJSP0/img.png)
컨트롤러를 더블클릭하고
![](https://blog.kakaocdn.net/dn/2W6rA/btsCLpujF3O/HY8ZPwxLWSGLqEuF9BLUeK/img.png)
안에 있는 State들을 제거 한다
![](https://blog.kakaocdn.net/dn/dDMyLi/btsCKPNAng3/wHbf7Y94HcllU9pvgtXGKk/img.png)
Float 형식으로 2개의 파라미터 (Grip, Trigger)를 만들어 주고
![](https://blog.kakaocdn.net/dn/zwAjo/btsCK8e4SxP/6GEHLgkoyF4ALh5YhNFlyk/img.png)
![](https://blog.kakaocdn.net/dn/b8O1CT/btsCztMlc6z/V0enlTothuHeCX9SFa7t21/img.png)
블랜드 트리를 생성하고 더블 클릭해서 들어간다
![](https://blog.kakaocdn.net/dn/usdO2/btsCzQUOC51/N6CLhKBjyNs6gFqpTCdek1/img.png)
![](https://blog.kakaocdn.net/dn/AFxQ5/btsCzHpZ5TA/TV05KyKwHC33yOUdODHFZk/img.png)
![](https://blog.kakaocdn.net/dn/ptG5g/btsCKQyV3mA/QcJfR6lDyMAy3CJ2eHh9Pk/img.png)
인스펙터에서 2D Freefrom Cartesian을 선택하고
![](https://blog.kakaocdn.net/dn/dqD3rh/btsCDdPd1hl/SEbTbe9cgnNli7QEA8dQy1/img.png)
다음과 같이 파라미터를 설정 한다
![](https://blog.kakaocdn.net/dn/bUEPp3/btsCGaLvvDV/cvBuvc04vG1O1i8SKeIEkK/img.png)
![](https://blog.kakaocdn.net/dn/bkPtwj/btsCDhRH3QX/JJFTmQs2UelzhLs4Z6l2k1/img.png)
+ 버튼을 눌러 Add motion field 를 4개 생성하고
다음과 같이 설정 한다
![](https://blog.kakaocdn.net/dn/cekMR1/btsCMnpvIeb/WvWdIzCoCYci0e4rd8n7ek/img.png)
![](https://blog.kakaocdn.net/dn/SEF4K/btsCG3yPg3d/UaPGoLQ8MxRld4Ny67rkz1/img.png)
![](https://blog.kakaocdn.net/dn/cDJdFJ/btsCIF5wDa1/ZJNQPNiGEiSWU3qQkD2ww1/img.png)
이제 블랜드 트리의 슬라이더를 이용해 애니메이션 동작을 확인 한다
핸드 프리팹을 선택하고 Hand 스크립트를 부착 한다
이때 Input Device Characteristics는 Controller, Right를 선택하고
Hand Animator는 위에 있는 Animator 컴포넌트를 넣어주면 된다
![](https://blog.kakaocdn.net/dn/dC0SJB/btsCzKG8v5K/CjEK1dOss73gsKIa8PMZv0/img.png)
플레이 해보고 두 손 모두 애니메이션이 잘 나오는지 확인 하자
'VR > XR Interaction Toolkit' 카테고리의 다른 글
[OpenXR] XR Interaction Toolkit 2.4.3 (Two Hand Grab) (0) | 2023.12.28 |
---|---|
[XR Interaction Toolkit 2.4.3] Custom Hand Grab Pose (0) | 2023.12.27 |
Access hand data from Unity components in the scene (0) | 2023.12.27 |
XR Interaction Toolkit 2.4.3 OpenXR Throw Object (0) | 2023.12.27 |
XR Interaction Toolkit 2.4.3 (OpenXR) Animated Hand Model (0) | 2023.12.26 |