HoloLens MRDesignLabs 제스처 시각화

HoloLens 어드벤트 캘린더 23 일째 기사입니다!

HoloLens를 조작 할 때의 제스처는 익숙하지 않으면 꽤 어렵습니다.
MRDesignLabs LunarModule 이라는 샘플에는 홀로그램이 표시되는 영역을 표시하고, 제스처 작업을 설명하고, 스캔을 유도하는 등, 앱을 시작할 때 필요한 기술이 담겨 있습니다.

이번, 샘플의 HandCoach를 이용해, 3D의 손의 홀로그램을 자신의 손에 맞추어 표시하도록 해 보았습니다.

개발 환경


  • Unity 2017.1.2f1
  • Visual Studio 2017 (15.2)
  • MRDesignLabs_Unity_LunarModule

  • 구현



    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에서 왼손·오른손 인식을 하고 있습니다만, 어느 방향으로 오른손과 왼손이 반대로 인식되는 버그가 있는 것 같습니다.

    참고 기사


  • HoloLens에서 시작하는 MRDesignLabs - MRDesignLabs_Unity_LunarModule을 즐기는 방법
  • HoloLens로 시작하는 MRDesignLabs - 양손 제스처 입력 구현
  • HoloLens에서 시작하는 MRDesignLabs - HandCoach 사용하기
  • 좋은 웹페이지 즐겨찾기