HoloLens MRDesignLabs 제스처 시각화
HoloLens를 조작 할 때의 제스처는 익숙하지 않으면 꽤 어렵습니다.
MRDesignLabs LunarModule 이라는 샘플에는 홀로그램이 표시되는 영역을 표시하고, 제스처 작업을 설명하고, 스캔을 유도하는 등, 앱을 시작할 때 필요한 기술이 담겨 있습니다.
이번, 샘플의 HandCoach를 이용해, 3D의 손의 홀로그램을 자신의 손에 맞추어 표시하도록 해 보았습니다.
개발 환경
구현
Unity를 시작하고 새 프로젝트를 만듭니다.
다운로드한 MRDesignLabs_Unity_LunarModule의 Assets 폴더의 내용을 Project 뷰로 가져옵니다.
Main Camera를 삭제하고 MRDesignLab->HUX->Interface->HoloLens를 Hierarchy 뷰로 가져옵니다.
빈 GameObjet를 만들고 이름을 HandCoachDisplay로 지정합니다.
HandCoachDisplay 아래에 MRDesignLab_LunarModule->Prefabs->HandCoach를 두 개 가져와 각각 LeftHandCoach와 RightHandCoach로 설정합니다.
Inspector 뷰의 HandCoach 설정은 다음과 같이 각각 한 손만 표시, 집게 손가락을 든 상태가 되도록 설정합니다.
HandCoachDisplay의 Inspector 보기에서 HandCoachDisplay.cs 스크립트를 작성합니다.
스크립트의 내용은 다음과 같습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HUX;
using HUX.Interaction;
public class HandCoachDisplay : MonoBehaviour {
public HandCoach leftHandCoach;
public HandCoach rightHandCoach;
private float MinConfidence = 0.01f;
private Vector3 OffsetLeft = new Vector3(0.18f, -1.34f, -0.2f);
private Vector3 OffsetRight = new Vector3(-0.18f, -1.34f, -0.2f);
private Vector3 Offset = new Vector3(0.0f, -1.34f, 0.6f);
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
UpdateHand(leftHandCoach, InputSources.Instance.hands.GetHandState(InputSourceHands.HandednessEnum.Left, MinConfidence), OffsetLeft);
UpdateHand(rightHandCoach, InputSources.Instance.hands.GetHandState(InputSourceHands.HandednessEnum.Right, MinConfidence), OffsetRight);
}
private void UpdateHand(HandCoach handObject, InputSourceHands.CurrentHandState handState, Vector3 handOffset)
{
if (handState == null)
{
handObject.LeftGesture = HandCoach.HandGestureEnum.Ready;
handObject.RightGesture = HandCoach.HandGestureEnum.Ready;
handObject.transform.position = Veil.Instance.HeadTransform.position;
handObject.transform.rotation = Veil.Instance.HeadTransform.rotation;
handObject.transform.Translate(Offset);
}
else
{
if (handState.Pressed)
{
handObject.LeftGesture = HandCoach.HandGestureEnum.None;
handObject.RightGesture = HandCoach.HandGestureEnum.None;
}
else
{
handObject.LeftGesture = HandCoach.HandGestureEnum.Ready;
handObject.RightGesture = HandCoach.HandGestureEnum.Ready;
}
handObject.transform.position = handState.Position;
handObject.transform.rotation = Veil.Instance.HeadTransform.rotation;
handObject.transform.Translate(handOffset);
}
}
}
LeftHandCoach와 RightHandCoach를 연결하면 완성됩니다.
실행 동영상은 여기입니다.
동영상에서는 MRDesignLab_LunarModule->Prefabs->HandInputDisplay도 추가하고 있습니다.
InputSources.Instance.hands.GetHandState에서 왼손·오른손 인식을 하고 있습니다만, 어느 방향으로 오른손과 왼손이 반대로 인식되는 버그가 있는 것 같습니다.
참고 기사
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HUX;
using HUX.Interaction;
public class HandCoachDisplay : MonoBehaviour {
public HandCoach leftHandCoach;
public HandCoach rightHandCoach;
private float MinConfidence = 0.01f;
private Vector3 OffsetLeft = new Vector3(0.18f, -1.34f, -0.2f);
private Vector3 OffsetRight = new Vector3(-0.18f, -1.34f, -0.2f);
private Vector3 Offset = new Vector3(0.0f, -1.34f, 0.6f);
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
UpdateHand(leftHandCoach, InputSources.Instance.hands.GetHandState(InputSourceHands.HandednessEnum.Left, MinConfidence), OffsetLeft);
UpdateHand(rightHandCoach, InputSources.Instance.hands.GetHandState(InputSourceHands.HandednessEnum.Right, MinConfidence), OffsetRight);
}
private void UpdateHand(HandCoach handObject, InputSourceHands.CurrentHandState handState, Vector3 handOffset)
{
if (handState == null)
{
handObject.LeftGesture = HandCoach.HandGestureEnum.Ready;
handObject.RightGesture = HandCoach.HandGestureEnum.Ready;
handObject.transform.position = Veil.Instance.HeadTransform.position;
handObject.transform.rotation = Veil.Instance.HeadTransform.rotation;
handObject.transform.Translate(Offset);
}
else
{
if (handState.Pressed)
{
handObject.LeftGesture = HandCoach.HandGestureEnum.None;
handObject.RightGesture = HandCoach.HandGestureEnum.None;
}
else
{
handObject.LeftGesture = HandCoach.HandGestureEnum.Ready;
handObject.RightGesture = HandCoach.HandGestureEnum.Ready;
}
handObject.transform.position = handState.Position;
handObject.transform.rotation = Veil.Instance.HeadTransform.rotation;
handObject.transform.Translate(handOffset);
}
}
}
Reference
이 문제에 관하여(HoloLens MRDesignLabs 제스처 시각화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/SatoshiGachiFujimoto/items/5699f40e95c4d2954baa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)