HoloLens(1세대) 입력 210: 응시
중요
Mixed Reality Academy 자습서는 HoloLens(1세대), Unity 2017 및 Mixed Reality 몰입형 헤드셋을 염두에 두고 설계되었습니다. 따라서 이러한 디바이스 개발에 대한 지침을 계속 찾고 있는 개발자를 위해 이러한 자습서를 그대로 두는 것이 중요합니다. 이러한 자습서는 HoloLens 2 사용되는 최신 도구 집합 또는 상호 작용으로 업데이트되지 않으며 최신 버전의 Unity와 호환되지 않을 수 있습니다. 대신 지원되는 디바이스에서 계속 작동하도록 유지 관리됩니다. HoloLens 2에 대한 새로운 자습서 시리즈가 게시되었습니다.
응시 는 첫 번째 입력 형식이며 사용자의 의도와 인식을 표시합니다. MR Input 210(프로젝트 Explorer이라고도 하는)은 Windows Mixed Reality 응시 관련 개념을 자세히 설명합니다. 앱이 사용자의 시선에 대해 알고 있는 내용을 최대한 활용하여 커서 및 홀로그램에 컨텍스트 인식을 추가할 예정입니다.
우리는 당신이 응시 개념을 배울 수 있도록 여기에 친절한 우주 비행사가 있습니다. MR Basics 101에서는 시선을 따라가는 간단한 커서가 있었습니다. 현재는 간단한 커서를 넘어 한 걸음 더 나아가고 있습니다.
- 커서와 홀로그램 응시를 인식합니다. 둘 다 사용자가 찾고 있는 위치 또는 사용자가 보지 않는 위치에 따라 변경됩니다. 이렇게 하면 컨텍스트를 인식할 수 있습니다.
- 사용자에게 대상에 대한 더 많은 컨텍스트를 제공하기 위해 커서 및 홀로그램에 피드백을 추가합니다. 이 피드백은 오디오 및 시각적 개체일 수 있습니다.
- 사용자가 더 작은 대상에 도달할 수 있도록 타겟팅 기술을 보여 줍니다.
- 방향 표시기를 사용하여 홀로그램에 사용자의 주의를 끄는 방법을 보여 드리겠습니다.
- 우리는 그녀가 당신의 세계에서 이동으로 사용자와 홀로그램을 취할 수있는 기술을 가르 칠 것이다.
중요
아래 각 챕터에 포함된 비디오는 이전 버전의 Unity 및 Mixed Reality 도구 키트를 사용하여 녹화되었습니다. 단계별 지침은 정확하고 최신이지만 오래된 해당 비디오에서 스크립트와 시각적 개체를 볼 수 있습니다. 비디오는 후손을 위해 포함되어 있으며 다루는 개념이 여전히 적용되므로 계속 포함됩니다.
디바이스 지원
과정 | HoloLens | 몰입형 헤드셋 |
---|---|---|
MR 입력 210: 응시 | ✔️ | ✔️ |
시작하기 전에
필수 구성 요소
- 올바른 도구가 설치되어 구성된 Windows 10 PC입니다.
- 몇 가지 기본 C# 프로그래밍 기능.
- MR Basics 101을 완료해야 합니다.
- 개발을 위해 구성된 HoloLens 디바이스입니다.
프로젝트 파일
- 프로젝트에 필요한 파일을 다운로드합니다. Unity 2017.2 이상이 필요합니다.
- 바탕 화면 또는 기타 쉽게 연결할 수 있는 위치에 파일을 보관 해제합니다.
참고
다운로드하기 전에 소스 코드를 살펴보려면 GitHub에서 사용할 수 있습니다.
Errata 및 Notes
- Visual Studio에서 코드의 중단점을 적중하려면 도구->옵션->디버깅에서 "내 코드만"을 사용하지 않도록 설정(선택 취소)해야 합니다.
1장 - Unity 설치
목표
- HoloLens 개발을 위해 Unity를 최적화합니다.
- 자산을 가져오고 장면을 설정합니다.
- HoloLens에서 우주 비행사를 봅니다.
지침
- Unity를 시작합니다.
- 새 프로젝트를 선택합니다.
- 프로젝트 이름을 ModelExplorer로 지정합니다.
- 이전에 보관하지 않은 Gaze 폴더로 위치를 입력합니다.
- 프로젝트가 3D로 설정되어 있는지 확인합니다.
- 프로젝트 만들기를 클릭합니다.
HoloLens에 대한 Unity 설정
내보내려는 앱이 2D 보기 대신 몰입형 보기를 만들어야 한다는 것을 Unity에 알려야 합니다. 이렇게 하려면 HoloLens를 가상 현실 디바이스로 추가합니다.
- 프로젝트 설정 > 플레이어 편집 > 으로 이동합니다.
- 플레이어 설정에 대한 검사기 패널 에서 Windows 스토어 아이콘을 선택합니다.
- XR 설정 그룹을 확장합니다.
- 렌더링 섹션에서 가상 현실 지원 확인란을 선택하여 새 가상 현실 SDK 목록을 추가합니다.
- 목록에 Windows Mixed Reality가 나타나는지 확인합니다. 그렇지 않은 경우 목록 맨 아래에 있는 단추를 선택하고 +Windows Holographic을 선택합니다.
다음으로 스크립팅 백 엔드를 .NET으로 설정해야 합니다.
- 프로젝트 설정 > 플레이어 편집 > 으로 이동합니다(이전 단계에서 이 작업을 수행할 수 있음).
- 플레이어 설정에 대한 검사기 패널 에서 Windows 스토어 아이콘을 선택합니다.
- 기타 설정 구성 섹션에서 스크립팅 백 엔드가 .NET으로 설정되어 있는지 확인합니다.
마지막으로, HoloLens에서 빠른 성능을 달성하기 위해 품질 설정을 업데이트합니다.
- 프로젝트 설정 > 품질 편집 > 으로 이동합니다.
- Windows 스토어 아이콘 아래의 기본 행에서 아래쪽 화살표를 클릭합니다.
- Windows 스토어 앱에 대해 매우 낮음을 선택합니다.
프로젝트 자산 가져오기
- 프로젝트 패널에서 Assets 폴더를 마우스 오른쪽 단추 로 클릭합니다.
- 패키지 사용자 지정 패키지 > 가져오기를 클릭합니다.
- 다운로드한 프로젝트 파일로 이동하고 ModelExplorer.unitypackage를 클릭합니다.
- 열기를 클릭합니다.
- 패키지가 로드된 후 가져오기 단추를 클릭합니다.
장면 설정
- 계층 구조에서 기본 카메라를 삭제합니다.
- HoloToolkit 폴더에서 입력 폴더를 연 다음 Prefabs 폴더를 엽니다.
- Prefabs 폴더의 MixedRealityCameraParent 프리팹을 계층 구조로 끌어서 놓습니다.
- 계층 구조에서 방향 표시등 을 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.
- Holograms 폴더에서 다음 자산을 계층 구조의 루트로 끌어서 놓습니다.
- AstroMan
- 조명
- SpaceAudioSource
- SpaceBackground
- 재생 모드▶를 시작하여 우주 비행사를 봅니다.
- 재생 모드▶를 다시 클릭하여 중지합니다.
- Holograms 폴더에서 Fitbox 자산을 찾아 계층 구조의 루트로 끕니다.
- 계층 구조 패널에서 Fitbox를 선택합니다.
- AstroMan 컬렉션을 계층 구조에서 검사기 패널의 Fitbox의 Hologram Collection 속성으로 끕니다.
프로젝트 저장
- 새 장면 > 파일 저장 장면을 다른 이름으로 저장합니다.
- 새 폴더를 클릭하고 폴더 이름을 Scenes로 지정합니다.
- 파일 이름을 "ModelExplorer"로 지정하고 Scenes 폴더에 저장합니다.
프로젝트 빌드
- Unity에서 파일 > 빌드 설정을 선택합니다.
- 열린 장면 추가를 클릭하여 장면을 추가합니다.
- 플랫폼 목록에서 유니버설 Windows 플랫폼 선택하고 플랫폼 전환을 클릭합니다.
- HoloLens용으로 특별히 개발하는 경우 대상 디바이스 를 HoloLens로 설정합니다. 그렇지 않으면 모든 디바이스에 그대로 둡니다.
- 빌드 유형이 D3D로 설정되고 SDK가 최신 설치됨(SDK 16299 이상이어야 합니다)으로 설정되어 있는지 확인합니다.
- 빌드를 클릭한 다음
- "App"이라는 새 폴더 를 만듭니다.
- 앱 폴더를 한 번 클릭합니다.
- 폴더 선택을 누릅니다.
Unity가 완료되면 파일 탐색기 창이 나타납니다.
- App 폴더를 엽니다.
- ModelExplorer Visual Studio Solution을 엽니다.
HoloLens에 배포하는 경우:
- Visual Studio에서 위쪽 도구 모음을 사용하여 대상을 디버그에서 릴리스 로, ARM에서 x86으로 변경합니다.
- 로컬 컴퓨터 단추 옆에 있는 드롭다운 화살표를 클릭하고 원격 머신을 선택합니다.
- HoloLens 디바이스 IP 주소를 입력하고 인증 모드를 유니버설(암호화되지 않은 프로토콜)로 설정합니다. 선택을 클릭합니다. 디바이스 IP 주소를 모르는 경우 설정 > 네트워크 & 인터넷 > 고급 옵션을 참조하세요.
- 위쪽 메뉴 모음에서 디버그 -> 디버깅하지 않고 시작을 클릭하거나 Ctrl + F5를 누릅니다. 디바이스에 처음 배포하는 경우 Visual Studio와 페어링해야 합니다.
- 앱이 배포되면 선택 제스처로 Fitbox를 해제합니다.
몰입형 헤드셋에 배포하는 경우:
- Visual Studio의 위쪽 도구 모음을 사용하여 대상을 디버그에서 릴리스 로, ARM에서 x64로 변경합니다.
- 배포 대상이 로컬 컴퓨터로 설정되어 있는지 확인합니다.
- 위쪽 메뉴 모음에서 디버그 -> 디버깅하지 않고 시작을 클릭하거나 Ctrl + F5를 누릅니다.
- 앱이 배포되면 동작 컨트롤러에서 트리거를 끌어 와 Fitbox 를 해제합니다.
2장 - 커서 및 대상 피드백
목표
- 커서 시각적 디자인 및 동작.
- 응시 기반 커서 피드백.
- 응시 기반 홀로그램 피드백.
작업을 기반으로 몇 가지 커서 디자인 원칙, 즉 다음을 수행합니다.
- 커서는 항상 존재합니다.
- 커서가 너무 작거나 커지지 않도록 합니다.
- 콘텐츠를 방해하지 않습니다.
지침
- HoloToolkit\Input\Prefabs 폴더에서 InputManager 자산을 찾습니다.
- InputManager를 계층 구조로 끌어서 놓습니다.
- HoloToolkit\Input\Prefabs 폴더에서 커서 자산을 찾습니다.
- 커서를 계층 구조로 끌어서 놓습니다.
- 계층 구조에서 InputManager 개체를 선택합니다.
- Cursor 개체를 계층 구조의 Inspector 아래쪽에 있는 InputManager의 SimpleSinglePointerSelector커서 필드로 끕니다.
빌드 및 배포
- 파일 > 빌드 설정에서 앱을 다시 빌드합니다.
- App 폴더를 엽니다.
- ModelExplorer Visual Studio Solution을 엽니다.
- 디버그 -> 디버깅하지 않고 시작을 클릭하거나 Ctrl + F5를 누릅니다.
- 커서가 그려지는 방식과 홀로그램에 닿는 경우 커서가 어떻게 변하는지 관찰합니다.
지침
- 계층 구조 패널에서 AstroMan-GEO_G-Back_Center>> 개체를 확장합니다.
- Interactible.cs를 두 번 클릭하여 Visual Studio에서 엽니다.
- Interactible.cs의 IFocusable.OnFocusEnter() 및 IFocusable.OnFocusExit() 콜백에서 줄의 주석 처리를 제거합니다. 포커스(응시 또는 컨트롤러 포인팅)가 특정 GameObject의 충돌체를 입력하고 종료할 때 Mixed Reality Toolkit의 InputManager에 의해 호출됩니다.
/* TODO: DEVELOPER CODING EXERCISE 2.d */
void IFocusable.OnFocusEnter()
{
for (int i = 0; i < defaultMaterials.Length; i++)
{
// 2.d: Uncomment the below line to highlight the material when gaze enters.
defaultMaterials[i].EnableKeyword("_ENVIRONMENT_COLORING");
}
}
void IFocusable.OnFocusExit()
{
for (int i = 0; i < defaultMaterials.Length; i++)
{
// 2.d: Uncomment the below line to remove highlight on material when gaze exits.
defaultMaterials[i].DisableKeyword("_ENVIRONMENT_COLORING");
}
}
참고
우리는 이상을 DisableKeyword
사용합니다EnableKeyword
. 도구 키트의 표준 셰이더를 사용하여 사용자 고유의 앱에서 이러한 셰이더를 사용하려면 스크립트를 통해 자료에 액세스하기 위한 Unity 지침을 따라야 합니다. 이 경우 Resources 폴더에 필요한 강조 표시된 자료의 세 가지 변형 이 이미 포함되어 있습니다(이름에 강조가 있는 세 개의 재질을 찾습니다).
빌드 및 배포
- 이전과 마찬가지로 프로젝트를 빌드하고 HoloLens에 배포합니다.
- 응시가 개체를 겨냥할 때와 그렇지 않은 경우 어떻게 되는지 관찰합니다.
챕터 3 - 대상 지정 기술
목표
- 홀로그램을 더 쉽게 대상으로 지정할 수 있습니다.
- 자연스러운 머리 움직임을 안정화합니다.
지침
- 계층 구조 패널에서 InputManager 개체를 선택합니다.
- 검사기 패널에서 응시 안정기 스크립트를 찾습니다. 살펴보려는 경우 Visual Studio에서 열려면 클릭합니다.
- 이 스크립트는 Raycast 데이터 샘플을 반복하고 정밀도 대상 지정에 대한 사용자의 시선을 안정화하는 데 도움이 됩니다.
- 검사기에서 저장된 안정성 샘플 값을 편집할 수 있습니다. 이 값은 안정화된 값을 계산하기 위해 안정화기가 반복하는 샘플 수를 나타냅니다.
4장 - 방향 표시기
목표
- 홀로그램을 찾는 데 도움이 되도록 커서에 방향 표시기를 추가합니다.
지침
다음을 수행할 DirectionIndicator.cs 파일을 사용합니다.
- 사용자가 홀로그램을 응시하지 않는 경우 방향 표시기를 표시합니다.
- 사용자가 홀로그램을 응시하는 경우 방향 표시기를 숨깁니다.
- 홀로그램을 가리키도록 방향 표시기를 업데이트합니다.
이제 시작하겠습니다.
- 계층 구조 패널에서 AstroMan 개체를 클릭하고 화살표를 클릭하여 확장합니다.
- 계층 구조 패널의 AstroMan에서 DirectionalIndicator 개체를 선택합니다.
- 검사기 패널에서 구성 요소 추가 단추를 클릭합니다.
- 메뉴에서 검색 상자 방향 표시기를 입력합니다. 검색 결과를 선택합니다.
- 계층 구조 패널에서 Cursor 개체를Inspector의 Cursor 속성으로 끌어서 놓습니다.
- 프로젝트 패널의 홀로그램 폴더에서 DirectionalIndicator 자산을 Inspector의 Directional Indicator 속성으로 끌어서 놓습니다.
- 앱을 빌드 및 배포합니다.
- 방향 표시기 개체가 우주 비행사를 찾는 데 어떻게 도움이 되는지 확인합니다.
챕터 5 - 빌보드
목표
- 광고판을 사용하여 홀로그램이 항상 당신을 향하게 합니다.
우리는 빌보드.cs 파일을 사용하여 GameObject 지향을 유지하여 항상 사용자를 마주하게 할 것입니다.
- 계층 구조 패널에서 AstroMan 개체를 선택합니다.
- 검사기 패널에서 구성 요소 추가 단추를 클릭합니다.
- 메뉴에서 검색 상자 빌보드를 입력 합니다. 검색 결과를 선택합니다.
- 검사기에서 피벗 축을 Y로 설정합니다.
- 사용해 보세요. 이전과 같이 앱을 빌드하고 배포합니다.
- 관점을 어떻게 변경하든 빌보드 개체가 어떻게 마주하는지 알아보세요.
- 지금은 AstroMan 에서 스크립트를 삭제합니다.
6장 - Tag-Along
목표
- Tag-Along 사용하여 홀로그램이 방 주위를 따라가도록 합니다.
이 문제를 해결할 때 다음과 같은 디자인 제약 조건을 안내합니다.
- 콘텐츠는 항상 한눈에 볼 수 있어야 합니다.
- 콘텐츠가 방해가 되어서는 안 됩니다.
- 헤드 잠금 콘텐츠가 불편합니다.
여기서 사용되는 솔루션은 "태그 따라" 접근 방식을 사용하는 것입니다.
태그를 따라가는 개체는 사용자의 뷰를 완전히 벗어나지 않습니다. 태그는 고무 밴드로 사용자의 머리에 부착된 개체라고 생각할 수 있습니다. 사용자가 이동하면 콘텐츠를 완전히 벗어나지 않고 보기 가장자리쪽으로 밀어 손쉽게 볼 수 있습니다. 사용자가 태그를 따라 개체를 응시할 때 더 완벽하게 표시됩니다.
다음을 수행할 SimpleTagalong.cs 파일을 사용합니다.
- Tag-Along 개체가 카메라 경계 내에 있는지 확인합니다.
- 뷰 frustum 내에 있지 않은 경우 뷰 frustum 내에서 부분적으로 Tag-Along 배치합니다.
- 그렇지 않으면 Tag-Along 사용자와의 기본 거리에 배치합니다.
이렇게 하려면 먼저 Interactible.cs 스크립트를 변경하여 TagalongAction을 호출해야 합니다.
- 코딩 연습 6.a(주석 처리 줄 84~87)를 완료하여 Interactible.cs 를 편집합니다.
/* TODO: DEVELOPER CODING EXERCISE 6.a */
// 6.a: Uncomment the lines below to perform a Tagalong action.
if (interactibleAction != null)
{
interactibleAction.PerformAction();
}
Interactible.cs와 쌍을 이루는 InteractibleAction.cs 스크립트는 홀로그램을 탭할 때 사용자 지정 작업을 수행합니다. 이 경우 태그를 사용하기 위해 특별히 하나를 사용합니다.
- Scripts 폴더에서 TagalongAction.cs 자산을 클릭하여 Visual Studio에서 엽니다.
- 코딩 연습을 완료하거나 다음으로 변경합니다.
- 계층 구조 위쪽의 검색 창에서 ChestButton_Center 입력하고 결과를 선택합니다.
- 검사기 패널에서 구성 요소 추가 단추를 클릭합니다.
- 메뉴에서 Tagalong 작업 검색 상자를 입력합니다. 검색 결과를 선택합니다.
- 홀로그램 폴더에서 Tagalong 자산을 찾습니다.
- 계층에서 ChestButton_Center 개체 를 선택합니다. Project 패널에서 Inspector로 TagAlong개체를 끌어서 Object To Tagalong 속성으로 놓습니다.
- Tagalong Action 개체를 Inspector에서 Interactible 스크립트의 상호 작용 가능 작업 필드로 끌어옵니다.
- TagalongAction 스크립트를 두 번 클릭하여 Visual Studio에서 엽니다.
다음을 추가해야 합니다.
- TagalongAction 스크립트의 PerformAction 함수에 기능을 추가합니다(InteractibleAction에서 상속됨).
- 응시 대상 개체에 광고판을 추가하고 피벗 축을 XY로 설정합니다.
- 그런 다음, 개체에 간단한 Tag-Along 추가합니다.
TagalongAction.cs의 솔루션은 다음과 같습니다.
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.
using HoloToolkit.Unity;
using UnityEngine;
public class TagalongAction : InteractibleAction
{
[SerializeField]
[Tooltip("Drag the Tagalong prefab asset you want to display.")]
private GameObject objectToTagalong;
private void Awake()
{
if (objectToTagalong != null)
{
objectToTagalong = Instantiate(objectToTagalong);
objectToTagalong.SetActive(false);
/* TODO: DEVELOPER CODING EXERCISE 6.b */
// 6.b: AddComponent Billboard to objectToTagAlong,
// so it's always facing the user as they move.
Billboard billboard = objectToTagalong.AddComponent<Billboard>();
// 6.b: AddComponent SimpleTagalong to objectToTagAlong,
// so it's always following the user as they move.
objectToTagalong.AddComponent<SimpleTagalong>();
// 6.b: Set any public properties you wish to experiment with.
billboard.PivotAxis = PivotAxis.XY; // Already the default, but provided in case you want to edit
}
}
public override void PerformAction()
{
// Recommend having only one tagalong.
if (objectToTagalong == null || objectToTagalong.activeSelf)
{
return;
}
objectToTagalong.SetActive(true);
}
}
- 사용해 보세요. 앱을 빌드 및 배포합니다.
- 콘텐츠가 응시점의 중심을 따라가는 방식을 확인하지만, 지속적으로 차단하지 않고 진행하지는 않습니다.