본문 바로가기

유니티(Unity)/Hololens2

[Hololens 2] 홀로렌즈 2 - 응시 위치 찾아 바닥에 평면 깔기

이전 글에서 아이트래킹을 통해 홀로렌즈로 보고 있는 오브젝트가 무엇인지에 대한 정보를 얻어올 수 있었습니다. 이를 살짝 응용해서 바닥면을 바라보고 그곳에 평면을 깔아보도록 하겠습니다.

 

[이전 글]

[AR/Hololens 2] 홀로렌즈 2 - 현재 보고 있는 오브젝트 구하기

 

[AR/Hololens 2] 홀로렌즈 2 - 현재 보고 있는 오브젝트 구하기

홀로렌즈로 어떤 오브젝트를 보고 있을 때 그 오브젝트가 무엇인지에 대한 정보를 얻어야할 필요가 있을 수 있습니다. 이 글에서는 아이 트래킹을 이용해서 현재 보고 있는 오브젝트에 대한 정

ggjjdiary.tistory.com


 

세팅은 이전 글에서 그대로 이어집니다.

현재 바라보고 있는 위치에 오브젝트를 옮겨보는 작업부터 시작해보겠습니다. GameObject - 3D Object - Sphere를 눌러 구체를 하나 생성합니다. 이 구체는 사용자의 시선을 따라 움직이며, 레이 캐스팅을 통해 적절한 지점에 배치됩니다.

 

 

새로 만든 구체의 크기가 너무 크기 때문에, Inspector에서 Transform을 조정해 크기를 작게 줄여줍니다(x : 0.01, y : 0.01, z : 0.01). 이름은 Point로 해줍니다.

 

이 구체는 플레이어가 보고 있는 곳을 표시해주는 역할만 수행합니다. 그렇기 때문에 레이 캐스트의 영향을 받지 않아야 합니다. 이를 위해 레이어 마스크를 지정해 해당 구체는 hit되지 않도록 해줍니다.

 

레이어 마스크와 레이 캐스트에 대한 내용은 이 글에서는 생략합니다..

 

Point의 Inspector에서 Layer를 찾습니다. 기본 설정으로 Default가 되어있는데, 이를 클릭해 Ignore Raycast로 바꿔줍니다.

 

 

이제 Point가 눈을 따라 이동하게 만들어 줍니다. 이전 글에서 만들었던 빈 오브젝트인 GameObject의 FollowEye 스크립트를 엽니다. 다음과 같이 수정해줍니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.Toolkit;

public class FollowEye : MonoBehaviour
{
    public GameObject point;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        // 눈이 바라보는 곳에 point를 옮깁니다.
        point.transform.position = CoreServices.InputSystem.EyeGazeProvider.HitPosition;
        
        // 지금은 필요하지 않으니 주석처리 해줍니다.
        // Debug.Log(CoreServices.InputSystem.EyeGazeProvider.GazeTarget.ToString());
    }
}

 

GameObject의 이름을 EyeTracking으로 바꾸고 Point를 EyeTracking의 자식으로 옮겨줍니다. 이어서, FollowEye의 Point 부분에 자식으로 추가한 Point를 넣어줍니다.

 

 

눈이 움직일 때마다 point가 같이 움직이는지 테스트 해줍니다.

 

 

이제 응시한 위치에 평면을 깔아줄 차례입니다.

 

FollowEye 스크립트에 아래 내용으로 수정합니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.Toolkit;

public class FollowEye : MonoBehaviour
{
    public GameObject point;
    public GameObject floor;
    
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        // 눈이 바라보는 곳에 point를 옮깁니다.
        point.transform.position = CoreServices.InputSystem.EyeGazeProvider.HitPosition;
        
        // 지금은 필요하지 않으니 주석처리 해줍니다.
        // Debug.Log(CoreServices.InputSystem.EyeGazeProvider.GazeTarget.ToString());
    }
    
    // 바닥 지정
    public void setting_floor()
    {
        floor.SetActive(true);
        floor.transform.position = point.transform.position;
    }
}

 

버튼을 누르면 바닥이 설치되는 방식으로 하겠습니다.

PressableButtonHoloLens2TextOnly_48x48을 찾아 Hierarchy에 끌여다 놓습니다. 이름은 SetFloor로 수정합니다.

 

 

다음으로 GameObject - 3D Object - Plane을 눌러 평면 오브젝트를 만들고 Inspector창의 체크를 해제해 비활성화 상태로 만들어줍니다.

 

 

지금 만든 Plane을 EyeTracking의 Follow Eye 스크립트 컴포넌트의 Floor에 추가합니다.

 

 

SetFloor로 돌아옵니다. Add Component를 눌러 HandConstraintPalmUp을 추가해줍니다. 아래와 같이 HandBounds와 SolverHandler도 같이 생깁니다.

 

 

HandConstraintPalmUp을 추가하면서 이제 손바닥을 감지하기 시작하면 버튼이 나타나게됩니다.

 

SetFloor의 Inspector창에서 Interactable 컴포넌트를 찾습니다.

Interactable - Events - OnClick()을 찾아, EyeTracking을 끌어다 놓습니다. No Function을 눌러서 FollowEye - setting_floor를 찾아 선택합니다. 최종적으로 아래와 같이 됩니다.

 

 

다음으로 버튼이 손바닥을 계속 따라가게 해줍니다. SetFloor의 Inspecor창에서 SolverHandler 컴포넌트를 찾아 Tracked Target TypeHand Joint로 바꿔줍니다.

 

 

손바닥을 폈을 때 버튼이 나타나고, 버튼을 누르면 응시하는 위치에 평면이 생성되는지 테스트합니다.

 

(혹시 버튼의 텍스트를 수정하고 싶으시다면, SetFloor의 자식 중 IconAndText를 찾아 자식인 TextMeshPro에서 값을 수정하시면 됩니다.)