HoloLens(1세대) 입력 211: 제스처

중요

Mixed Reality Academy 자습서는 HoloLens(1세대), Unity 2017 및 Mixed Reality 몰입형 헤드셋을 염두에 두고 설계되었습니다. 따라서 이러한 디바이스 개발에 대한 지침을 계속 찾고 있는 개발자를 위해 이러한 자습서를 그대로 두는 것이 중요합니다. 이러한 자습서는 HoloLens 2 사용되는 최신 도구 집합 또는 상호 작용으로 업데이트되지 않으며 최신 버전의 Unity와 호환되지 않을 수 있습니다. 대신 지원되는 디바이스에서 계속 작동하도록 유지 관리됩니다. HoloLens 2에 대한 새로운 자습서 시리즈가 게시되었습니다.

제스처는 사용자 의도를 동작으로 바꿔줍니다. 제스처를 사용하면 사용자가 홀로그램과 상호 작용할 수 있습니다. 이 과정에서는 사용자의 손을 추적하고, 사용자 입력에 응답하고, 손 상태 및 위치에 따라 사용자에게 피드백을 제공하는 방법을 알아봅니다.

MR Basics 101에서는 간단한 에어 탭 제스처를 사용하여 홀로그램과 상호 작용했습니다. 이제 에어 탭 제스처를 넘어 새로운 개념을 탐색하여 다음을 수행합니다.

  • 사용자의 손이 추적되는 시기를 감지하고 사용자에게 피드백을 제공합니다.
  • 탐색 제스처를 사용하여 홀로그램을 회전합니다.
  • 사용자의 손이 시야에서 벗어나려고 할 때 피드백을 제공합니다.
  • 조작 이벤트를 사용하여 사용자가 손으로 홀로그램을 이동할 수 있도록 합니다.

이 과정에서는 MR 입력 210에서 빌드한 Unity 프로젝트 모델 탐색기를 다시 살펴보겠습니다. 우리의 우주 비행사 친구는 이러한 새로운 제스처 개념의 우리의 탐구에 우리를 돕기 위해 돌아왔다.

중요

아래 각 챕터에 포함된 비디오는 이전 버전의 Unity 및 Mixed Reality Toolkit 사용하여 녹화되었습니다. 단계별 지침은 정확하고 최신이지만 해당 비디오에서 오래된 스크립트와 시각적 개체를 볼 수 있습니다. 비디오는 후손을 위해 포함 된 상태로 남아 있으며 다루는 개념이 여전히 적용되므로.

디바이스 지원

과정 HoloLens 몰입형 헤드셋
MR 입력 211: 제스처 ✔️ ✔️

시작하기 전에

필수 구성 요소

프로젝트 파일

  • 프로젝트에 필요한 파일을 다운로드합니다. Unity 2017.2 이상이 필요합니다.
  • 바탕 화면 또는 기타 쉽게 도달할 수 있는 위치에 파일을 보관 해제합니다.

참고

다운로드하기 전에 소스 코드를 살펴보려면 GitHub 사용할 수 있습니다.

Errata 및 참고 사항

  • 코드의 중단점을 적중하려면 도구->옵션->디버깅 아래의 Visual Studio "내 코드만 사용"을 사용하지 않도록 설정(선택 취소)해야 합니다.

챕터 0 - Unity 설정

Instructions

  1. Unity를 시작합니다.
  2. 열기를 선택합니다.
  3. 이전에 보관하지 않은 제스처 폴더로 이동합니다.
  4. StartingModel/탐색기 폴더를 찾아 선택합니다.
  5. 폴더 선택 단추를 클릭합니다.
  6. Project 패널에서 Scenes 폴더를 확장합니다.
  7. ModelExplorer 장면을 두 번 클릭하여 Unity에 로드합니다.

빌딩

  1. Unity에서 파일 > 빌드 설정 선택합니다.
  2. 장면/ModelExplorer빌드의 장면에 나열되지 않은 경우 열린 장면 추가를 클릭하여 장면을 추가합니다.
  3. HoloLens 위해 특별히 개발하는 경우 대상 디바이스HoloLens 설정합니다. 그렇지 않으면 모든 디바이스에 그대로 둡니다.
  4. 빌드 유형D3D로 설정되고 SDK최신 설치됨(SDK 16299 이상이어야 합니다)으로 설정되어 있는지 확인합니다.
  5. 빌드를 클릭한 다음
  6. "App"이라는 새 폴더 를 만듭니다.
  7. 폴더를 한 번 클릭합니다.
  8. 폴더 선택 키를 누르면 Unity가 Visual Studio 프로젝트 빌드를 시작합니다.

Unity가 완료되면 파일 탐색기 창이 나타납니다.

  1. 폴더를 엽니다.
  2. ModelExplorer Visual Studio 솔루션을 엽니다.

HoloLens 배포하는 경우:

  1. Visual Studio 위쪽 도구 모음을 사용하여 대상을 디버그에서 릴리스로, ARM에서 x86으로 변경합니다.
  2. 로컬 컴퓨터 단추 옆에 있는 드롭다운 화살표를 클릭하고 원격 머신을 선택합니다.
  3. HoloLens 디바이스 IP 주소를 입력하고 인증 모드를 유니버설(암호화되지 않은 프로토콜)로 설정합니다. 선택을 클릭합니다. 디바이스 IP 주소를 모르는 경우 설정 > 네트워크 & 인터넷 > 고급 옵션을 살펴보세요.
  4. 위쪽 메뉴 모음에서 디버그 -> 디버깅하지 않고 시작을 클릭하거나 Ctrl +F5를 누릅니다. 디바이스에 처음 배포하는 경우 Visual Studio 페어링해야 합니다.
  5. 앱이 배포되면 선택 제스처를 사용하여 Fitbox를 해제합니다.

몰입형 헤드셋에 배포하는 경우:

  1. Visual Studio 위쪽 도구 모음을 사용하여 대상을 디버그에서 릴리스로, ARM에서 x64로 변경합니다.
  2. 배포 대상이 로컬 컴퓨터로 설정되어 있는지 확인합니다.
  3. 위쪽 메뉴 모음에서 디버그 -> 디버깅하지 않고 시작을 클릭하거나 Ctrl +F5를 누릅니다.
  4. 앱이 배포되면 동작 컨트롤러에서 트리거를 끌어 Fitbox 를 해제합니다.

참고

Visual Studio 오류 패널에서 빨간색 오류가 표시될 수 있습니다. 무시해도 안전합니다. 출력 패널로 전환하여 실제 빌드 진행률을 확인합니다. 출력 패널의 오류는 수정해야 합니다(대부분 스크립트의 실수로 인해 발생함).

1장 - 손에서 피드백 검색됨

목표

  • 손 추적 이벤트를 구독합니다.
  • 커서 피드백을 사용하여 손을 추적할 때 사용자에게 표시합니다.

참고

HoloLens 2 손가락이 가리키는 것뿐만 아니라 손이 보일 때마다 손이 발사되는 것을 감지했습니다.

Instructions

  • 계층 구조 패널에서 InputManager 개체를 확장합니다.
  • GesturesInput 개체를 찾아 선택합니다.

InteractionInputSource.cs 스크립트는 다음 단계를 수행합니다.

  1. InteractionSourceDetected 및 InteractionSourceLost 이벤트를 구독합니다.
  2. HandDetected 상태를 설정합니다.
  3. InteractionSourceDetected 및 InteractionSourceLost 이벤트에서 구독을 취소합니다.

다음으로 MR Input 210 에서 사용자의 작업에 따라 피드백을 표시하는 커서로 업그레이드합니다.

  1. 계층 구조 패널에서 커서 개체를 선택하고 삭제합니다.
  2. Project 패널에서 CursorWithFeedback을 검색하여 계층 구조 패널로 끕니다.
  3. 계층 구조 패널에서 InputManager를 클릭한 다음, CursorWithFeedback 개체를 계층 구조의 Inspector 아래쪽에 있는 InputManager의 SimpleSinglePointerSelector커서 필드로 끕니다.
  4. 계층 구조에서 CursorWithFeedback을 클릭합니다.
  5. [검사기] 패널의 [개체 커서] 스크립트에서 [커서 상태 데이터]를 확장합니다.

커서 상태 데이터는 다음과 같이 작동합니다.

  • 모든 관찰 상태는 손이 감지되지 않고 사용자가 단순히 주위를 둘러보고 있음을 의미합니다.
  • 모든 상호 작용 상태는 손 또는 컨트롤러가 검색됨을 의미합니다.
  • 가리키기 상태는 사용자가 홀로그램을 보고 있다는 것을 의미합니다.

빌드 및 배포

  • Unity에서 파일 > 빌드 설정 사용하여 애플리케이션을 다시 빌드합니다.
  • 폴더를 엽니다.
  • 아직 열려 있지 않으면 ModelExplorer Visual Studio 솔루션을 엽니다.
    • (설정 중에 Visual Studio 이 프로젝트를 이미 빌드/배포한 경우 VS의 해당 인스턴스를 열고 메시지가 표시되면 '모두 다시 로드'를 클릭할 수 있습니다.)
  • Visual Studio 디버그 -> 디버깅하지 않고 시작을 클릭하거나 Ctrl +F5를 누릅니다.
  • 애플리케이션이 HoloLens 배포되면 에어 탭 제스처를 사용하여 fitbox를 해제합니다.
  • 손을 보기로 이동하고 검지 손가락을 하늘로 가리킨 다음 손 추적을 시작합니다.
  • 손을 왼쪽, 오른쪽, 위아래로 이동합니다.
  • 손이 감지된 후 보기에서 손실될 때 커서가 어떻게 바뀌는지 확인합니다.
  • 몰입형 헤드셋을 사용하는 경우 컨트롤러를 연결하고 연결을 끊어야 합니다. 연결된 컨트롤러는 항상 "사용 가능"하므로 이 피드백은 몰입형 디바이스에서 덜 흥미롭습니다.

2장 - 탐색

목표

  • 탐색 제스처 이벤트를 사용하여 우주 비행사를 회전합니다.

Instructions

앱에서 탐색 제스처를 사용하려면 Navigation 제스처가 발생할 때 개체를 회전하도록 GestureAction.cs 를 편집합니다. 또한 탐색을 사용할 수 있을 때 표시할 피드백을 커서에 추가합니다.

  1. 계층 구조 패널에서 CursorWithFeedback을 확장합니다.
  2. 홀로그램스 폴더에서 ScrollFeedback 자산을 찾습니다.
  3. ScrollFeedback 프리팹을 계층 구조CursorWithFeedback GameObject로 끌어서 놓습니다.
  4. CursorWithFeedback을 클릭합니다.
  5. [검사기] 패널에서 [구성 요소 추가] 단추를 클릭합니다.
  6. 메뉴에서 검색 상자 CursorFeedback을 입력합니다. 검색 결과를 선택합니다.
  7. ScrollFeedback 개체를 Hierarchy에서 Inspector커서 피드백 구성 요소에 있는 Scroll Detected Game Object 속성으로 끌어서 놓습니다.
  8. 계층 구조 패널에서 AstroMan 개체를 선택합니다.
  9. [검사기] 패널에서 [구성 요소 추가] 단추를 클릭합니다.
  10. 메뉴에서 검색 상자 제스처 동작을 입력합니다. 검색 결과를 선택합니다.

그런 다음 Visual Studio GestureAction.cs를 엽니다. 코딩 연습 2.c에서 스크립트를 편집하여 다음을 수행합니다.

  1. 탐색 제스처가 수행될 때마다 AstroMan 개체를 회전합니다.
  2. rotationFactor를 계산하여 개체에 적용되는 회전의 양을 제어합니다.
  3. 사용자가 손을 왼쪽 또는 오른쪽으로 이동할 때 y축을 중심으로 개체를 회전합니다.

스크립트에서 코딩 연습 2.c를 완료하거나 아래 완성된 솔루션으로 코드를 바꿉니다.

using HoloToolkit.Unity.InputModule;
using UnityEngine;

/// <summary>
/// GestureAction performs custom actions based on
/// which gesture is being performed.
/// </summary>
public class GestureAction : MonoBehaviour, INavigationHandler, IManipulationHandler, ISpeechHandler
{
    [Tooltip("Rotation max speed controls amount of rotation.")]
    [SerializeField]
    private float RotationSensitivity = 10.0f;

    private bool isNavigationEnabled = true;
    public bool IsNavigationEnabled
    {
        get { return isNavigationEnabled; }
        set { isNavigationEnabled = value; }
    }

    private Vector3 manipulationOriginalPosition = Vector3.zero;

    void INavigationHandler.OnNavigationStarted(NavigationEventData eventData)
    {
        InputManager.Instance.PushModalInputHandler(gameObject);
    }

    void INavigationHandler.OnNavigationUpdated(NavigationEventData eventData)
    {
        if (isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 2.c */

            // 2.c: Calculate a float rotationFactor based on eventData's NormalizedOffset.x multiplied by RotationSensitivity.
            // This will help control the amount of rotation.
            float rotationFactor = eventData.NormalizedOffset.x * RotationSensitivity;

            // 2.c: transform.Rotate around the Y axis using rotationFactor.
            transform.Rotate(new Vector3(0, -1 * rotationFactor, 0));
        }
    }

    void INavigationHandler.OnNavigationCompleted(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void INavigationHandler.OnNavigationCanceled(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationStarted(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            InputManager.Instance.PushModalInputHandler(gameObject);

            manipulationOriginalPosition = transform.position;
        }
    }

    void IManipulationHandler.OnManipulationUpdated(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 4.a */

            // 4.a: Make this transform's position be the manipulationOriginalPosition + eventData.CumulativeDelta
        }
    }

    void IManipulationHandler.OnManipulationCompleted(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationCanceled(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void ISpeechHandler.OnSpeechKeywordRecognized(SpeechEventData eventData)
    {
        if (eventData.RecognizedText.Equals("Move Astronaut"))
        {
            isNavigationEnabled = false;
        }
        else if (eventData.RecognizedText.Equals("Rotate Astronaut"))
        {
            isNavigationEnabled = true;
        }
        else
        {
            return;
        }

        eventData.Use();
    }
}

다른 탐색 이벤트는 이미 일부 정보로 채워져 있습니다. GameObject를 Toolkit InputSystem의 모달 스택에 푸시하므로 회전이 시작된 후에는 사용자가 우주 비행사에 집중할 필요가 없습니다. 이에 따라 제스처가 완료되면 GameObject를 스택에서 팝합니다.

빌드 및 배포

  1. Unity에서 애플리케이션을 다시 빌드한 다음 Visual Studio 빌드 및 배포하여 HoloLens 실행합니다.
  2. 우주 비행사를 응시하면 커서 양쪽에 두 개의 화살표가 나타납니다. 이 새로운 시각적 개체는 우주 비행사를 회전할 수 있음을 나타냅니다.
  3. HoloLens 손을 추적하기 시작할 수 있도록 준비 위치(하늘을 가리키는 검지 손가락)에 손을 놓습니다.
  4. 우주 비행사를 회전하려면 검지 손가락을 손가락 모으기 위치로 낮추고 손을 왼쪽이나 오른쪽으로 이동하여 NavigationX 제스처를 트리거합니다.

3장 - 손 지침

목표

  • 손 안내 점수를 사용하여 손 추적이 손실되는 시기를 예측합니다.
  • 커서 에 대한 피드백을 제공하여 사용자의 손이 카메라의 보기 가장자리에 가까이 있는 경우를 표시합니다.

Instructions

  1. 계층 구조 패널에서 CursorWithFeedback 개체를 선택합니다.
  2. [검사기] 패널에서 [구성 요소 추가] 단추를 클릭합니다.
  3. 메뉴에서 검색 상자 손 안내를 입력합니다. 검색 결과를 선택합니다.
  4. Project 패널 홀로그램스 폴더에서 HandGuidanceFeedback 자산을 찾습니다.
  5. HandGuidanceFeedback 자산을 검사기 패널의 손 지침 표시기 속성으로 끌어서 놓습니다.

빌드 및 배포

  • Unity에서 애플리케이션을 다시 빌드한 다음 Visual Studio 빌드 및 배포하여 HoloLens 앱을 경험합니다.
  • 손을 보고 검지 손가락을 들어 추적합니다.
  • 탐색 제스처를 사용하여 우주 비행사를 회전하기 시작합니다(검지 손가락과 엄지손가락을 함께 꼬집기).
  • 손을 왼쪽, 오른쪽, 위쪽 및 아래로 이동합니다.
  • 손이 제스처 프레임의 가장자리에 가까워지면 커서 옆에 화살표가 나타나 손 추적이 손실될 것임을 경고해야 합니다. 화살표는 추적이 손실되지 않도록 손을 이동할 방향을 나타냅니다.

4장 - 조작

목표

  • 조작 이벤트를 사용하여 우주 비행사를 손으로 이동합니다.
  • 커서에 대한 피드백을 제공하여 조작을 사용할 수 있는 시기를 사용자에게 알릴 수 있습니다.

Instructions

GestureManager.cs 및 AstronautManager.cs를 사용하면 다음을 수행할 수 있습니다.

  1. 음성 키워드 "우주 비행사 이동"을 사용하여 조작 제스처를 사용하도록 설정하고 "우주 비행사 회전"을 사용하여 사용하지 않도록 설정합니다.
  2. 조작 제스처 인식기 응답으로 전환합니다.

이제 시작하겠습니다.

  1. 계층 구조 패널에서 빈 GameObject를 새로 만듭니다. 이름을 "AstronautManager"로 지정합니다.
  2. [검사기] 패널에서 [구성 요소 추가] 단추를 클릭합니다.
  3. 메뉴에서 검색 상자 의 우주 비행사 관리자를 입력합니다. 검색 결과를 선택합니다.
  4. [검사기] 패널에서 [구성 요소 추가] 단추를 클릭합니다.
  5. 메뉴에서 검색 상자 Speech Input Source를 입력합니다. 검색 결과를 선택합니다.

이제 우주 비행사의 상호 작용 상태를 제어하는 데 필요한 음성 명령을 추가합니다.

  1. 검사기에서 키워드 섹션을 확장합니다.
  2. 오른쪽을 + 클릭하여 새 키워드를 추가합니다.
  3. 이동 우주 비행사로 키워드를 입력합니다. 원하는 경우 키 바로 가기를 자유롭게 추가할 수 있습니다.
  4. 오른쪽을 + 클릭하여 새 키워드를 추가합니다.
  5. 키워드를 회전 우주 비행사로 입력합니다. 원하는 경우 키 바로 가기를 자유롭게 추가할 수 있습니다.
  6. 해당 처리기 코드는 ISpeechHandler.OnSpeechKeywordRecognized 처리기의 GestureAction.cs에서 찾을 수 있습니다.

How to set-up the Speech Input Source for chapter 4

다음으로 커서에 대한 조작 피드백을 설정합니다.

  1. Project 패널 홀로그램스 폴더에서 PathingFeedback 자산을 찾습니다.
  2. PathingFeedback 프리팹을 계층 구조CursorWithFeedback 개체로 끌어서 놓습니다.
  3. 계층 구조 패널에서 CursorWithFeedback을 클릭합니다.
  4. PathingFeedback 개체를계층 구조에서 검사기의 커서 피드백 구성 요소에 있는 Pathing Detected Game Object 속성으로 끌어서 놓습니다.

이제 다음을 사용하도록 설정하려면 GestureAction.cs 에 코드를 추가해야 합니다.

  1. 조작 제스처가 감지되면 우주 비행사를 이동하는 IManipulationHandler.OnManipulationUpdated 함수에 코드를 추가합니다.
  2. 이동 벡터를 계산하여 우주 비행사를 손 위치에 따라 이동해야 하는 위치를 결정합니다.
  3. 우주 비행사를 새 위치로 이동합니다.

GestureAction.cs에서 코딩 연습 4.a를 완료하거나 아래 완료된 솔루션을 사용합니다.

using HoloToolkit.Unity.InputModule;
using UnityEngine;

/// <summary>
/// GestureAction performs custom actions based on
/// which gesture is being performed.
/// </summary>
public class GestureAction : MonoBehaviour, INavigationHandler, IManipulationHandler, ISpeechHandler
{
    [Tooltip("Rotation max speed controls amount of rotation.")]
    [SerializeField]
    private float RotationSensitivity = 10.0f;

    private bool isNavigationEnabled = true;
    public bool IsNavigationEnabled
    {
        get { return isNavigationEnabled; }
        set { isNavigationEnabled = value; }
    }

    private Vector3 manipulationOriginalPosition = Vector3.zero;

    void INavigationHandler.OnNavigationStarted(NavigationEventData eventData)
    {
        InputManager.Instance.PushModalInputHandler(gameObject);
    }

    void INavigationHandler.OnNavigationUpdated(NavigationEventData eventData)
    {
        if (isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 2.c */

            // 2.c: Calculate a float rotationFactor based on eventData's NormalizedOffset.x multiplied by RotationSensitivity.
            // This will help control the amount of rotation.
            float rotationFactor = eventData.NormalizedOffset.x * RotationSensitivity;

            // 2.c: transform.Rotate around the Y axis using rotationFactor.
            transform.Rotate(new Vector3(0, -1 * rotationFactor, 0));
        }
    }

    void INavigationHandler.OnNavigationCompleted(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void INavigationHandler.OnNavigationCanceled(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationStarted(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            InputManager.Instance.PushModalInputHandler(gameObject);

            manipulationOriginalPosition = transform.position;
        }
    }

    void IManipulationHandler.OnManipulationUpdated(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 4.a */

            // 4.a: Make this transform's position be the manipulationOriginalPosition + eventData.CumulativeDelta
            transform.position = manipulationOriginalPosition + eventData.CumulativeDelta;
        }
    }

    void IManipulationHandler.OnManipulationCompleted(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationCanceled(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void ISpeechHandler.OnSpeechKeywordRecognized(SpeechEventData eventData)
    {
        if (eventData.RecognizedText.Equals("Move Astronaut"))
        {
            isNavigationEnabled = false;
        }
        else if (eventData.RecognizedText.Equals("Rotate Astronaut"))
        {
            isNavigationEnabled = true;
        }
        else
        {
            return;
        }

        eventData.Use();
    }
}

빌드 및 배포

  • Unity에서 다시 빌드한 다음 Visual Studio 빌드 및 배포하여 HoloLens 앱을 실행합니다.
  • HoloLens 앞에서 손을 이동하고 추적할 수 있도록 검지 손가락을 들어 올립니다.
  • 우주 비행사 위에 커서를 집중합니다.
  • '우주 비행사 이동'을 말하여 조작 제스처로 우주 비행사를 이동합니다.
  • 이제 프로그램이 조작 이벤트에 응답함을 나타내기 위해 커서 주위에 4개의 화살표가 나타납니다.
  • 검지 손가락을 엄지 손가락으로 낮추고 함께 꼬집어 둡니다.
  • 손을 움직이면 우주 비행사도 움직입니다(조작임).
  • 우주 비행사 조작을 중지하려면 검지 손가락을 들어 올립니다.
  • 참고: 손을 움직이기 전에 '우주 비행사 이동'이라고 말하지 않으면 탐색 제스처가 대신 사용됩니다.
  • 회전 가능한 상태로 돌아가려면 '우주 비행사 회전'이라고 말합니다.

5장 - 모델 확장

목표

  • 우주 비행사 모델을 사용자가 상호 작용할 수 있는 더 작은 여러 조각으로 확장합니다.
  • 탐색 및 조작 제스처를 사용하여 각 조각을 개별적으로 이동합니다.

Instructions

이 섹션에서는 다음 작업을 수행합니다.

  1. 새 키워드 "모델 확장"을 추가하여 우주 비행사 모델을 확장합니다.
  2. 새 키워드 "모델 재설정"을 추가하여 모델을 원래 형식으로 반환합니다.

이전 챕터의 Speech Input Source에 두 개의 키워드를 더 추가하여 이 작업을 수행합니다. 또한 인식 이벤트를 처리하는 또 다른 방법을 보여 줍니다.

  1. 검사기에서 AstronautManager 를 다시 클릭하고 검사 기에서 키워드섹션을 확장합니다.
  2. 오른쪽을 + 클릭하여 새 키워드를 추가합니다.
  3. 키워드를 확장 모델로 입력합니다. 원하는 경우 키 바로 가기를 자유롭게 추가할 수 있습니다.
  4. 오른쪽을 + 클릭하여 새 키워드를 추가합니다.
  5. 키워드를 다시 설정 모델로 입력합니다. 원하는 경우 키 바로 가기를 자유롭게 추가할 수 있습니다.
  6. [검사기] 패널에서 [구성 요소 추가] 단추를 클릭합니다.
  7. 메뉴에서 검색 상자 음성 입력 처리기를 입력합니다. 검색 결과를 선택합니다.
  8. 포커스가 있는 GameObject에 관계없이 이러한 명령이 작동하도록 하므로 전역 수신기인지 확인합니다.
  9. + 단추를 클릭하고 키워드 드롭다운에서 모델 확장을 선택합니다.
  10. 응답 아래를 + 클릭하고 Hierarchy에서 None(개체) 필드로 AstronautManager를 끕니다.
  11. 이제 함수 없음 드롭다운을 클릭하고 , AstronautManager, ExpandModelCommand를 차례로 선택합니다.
  12. 음성 입력 처리기의 + 단추를 클릭하고 키워드 드롭다운에서 모델 다시 설정을 선택합니다.
  13. 응답 아래를 + 클릭하고 Hierarchy에서 None(개체) 필드로 AstronautManager를 끕니다.
  14. 이제 함수 없음 드롭다운을 클릭하고 , AstronautManager를 선택한 다음, ResetModelCommand를 선택합니다.

How to set-up the Speech Input Source and Handler for chapter 5

빌드 및 배포

  • 사용해 보세요. 앱을 빌드하고 HoloLens 배포합니다.
  • 확장된 우주 비행사 모델을 보려면 모델을 확장한다고 가정해 보겠습니다.
  • 탐색을 사용하여 우주 비행사 정장의 개별 조각을 회전합니다.
  • 우주 비행사를 이동한 다음 조작을 사용하여 우주 비행사 소송의 개별 조각을 이동한다고 가정해 보겠습니다.
  • 우주 비행사를 회전하여 조각을 다시 회전한다고 가정해 봅시다.
  • 우주 비행사를 원래 형태로 되돌리려면 모델 재설정 을 말합니다.

축하합니다! 이제 MR 입력 211: 제스처를 완료했습니다.

  • 손 추적, 탐색 및 조작 이벤트를 감지하고 대응하는 방법을 알고 있습니다.
  • 탐색 및 조작 제스처의 차이점을 이해합니다.
  • 커서를 변경하여 손을 감지할 때, 손을 잃을 때, 개체가 서로 다른 상호 작용을 지원하는 경우(탐색 및 조작)에 대한 시각적 피드백을 제공하는 방법을 알고 있습니다.