Unity의 제스처

Unity에서 응시에 대한 작업을 수행하는 두 가지 주요 방법, HoloLens 및 몰입형 HMD의 손 제스처모션 컨트롤러가 있습니다. Unity에서 동일한 API를 통해 공간 입력의 두 원본에 대한 데이터에 액세스합니다.

Unity는 Windows Mixed Reality 공간 입력 데이터에 액세스하는 두 가지 기본 방법을 제공합니다. 일반적인 Input.GetButton/Input.GetAxis API는 여러 Unity XR SDK에서 작동하지만 Windows Mixed Reality 특정 InteractionManager/GestureRecognizer API는 전체 공간 입력 데이터 집합을 노출합니다.

상위 수준 복합 제스처 API(GestureRecognizer)

네임스페이스:UnityEngine.XR.WSA.Input
형식: GestureRecognizer, GestureSettings, InteractionSourceKind

또한 앱은 공간 입력 원본, 탭, 길게 누르기, 조작 및 탐색 제스처에 대해 더 높은 수준의 복합 제스처를 인식할 수 있습니다. GestureRecognizer를 사용하여 두 모션 컨트롤러 에서 이러한 복합 제스처를 인식할 수 있습니다.

GestureRecognizer의 각 제스처 이벤트는 이벤트 당시의 대상 헤드 레이뿐만 아니라 입력에 대한 SourceKind를 제공합니다. 일부 이벤트는 추가 컨텍스트 관련 정보를 제공합니다.

제스처 인식기를 사용하여 제스처를 캡처하는 데 필요한 단계는 몇 가지뿐입니다.

  1. 새 제스처 인식기 만들기
  2. watch 제스처 지정
  3. 이러한 제스처에 대한 이벤트 구독
  4. 제스처 캡처 시작

새 제스처 인식기 만들기

GestureRecognizer를 사용하려면 GestureRecognizer를 만들어야 합니다.

GestureRecognizer recognizer = new GestureRecognizer();

watch 제스처 지정

SetRecognizableGestures()를 통해 관심 있는 제스처를 지정합니다.

recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);

이러한 제스처에 대한 이벤트 구독

관심 있는 제스처에 대한 이벤트를 구독합니다.

void Start()
{
    recognizer.Tapped += GestureRecognizer_Tapped;
    recognizer.HoldStarted += GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}

참고

탐색 및 조작 제스처는 GestureRecognizer의 instance 대해 상호 배타적입니다.

제스처 캡처 시작

기본적으로 GestureRecognizerStartCapturingGestures() 가 호출될 때까지 입력을 모니터링하지 않습니다. StopCapturingGestures()가 처리된 프레임 이전에 입력이 수행된 경우 StopCapturingGestures()가 호출된 후 제스처 이벤트가 생성될 수 있습니다. GestureRecognizer는 제스처가 실제로 발생한 이전 프레임 동안 켜졌는지 여부를 기억하므로 이 프레임의 응시 대상 지정에 따라 제스처 모니터링을 시작하고 중지할 수 있습니다.

recognizer.StartCapturingGestures();

제스처 캡처 중지

제스처 인식을 중지하려면 다음을 수행합니다.

recognizer.StopCapturingGestures();

제스처 인식기 제거

GestureRecognizer 개체를 삭제하기 전에 구독한 이벤트의 구독을 취소해야 합니다.

void OnDestroy()
{
    recognizer.Tapped -= GestureRecognizer_Tapped;
    recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}

Unity에서 모션 컨트롤러 모델 렌더링

모션 컨트롤러 모델 및 텔레포트
모션 컨트롤러 모델 및 텔레포트

사용자가 보유하고 있는 실제 컨트롤러와 일치하는 모션 컨트롤러를 앱에서 렌더링하고 다양한 단추를 누를 때 명료하게 표현하려면 Mixed Reality 도구 키트에서 MotionController 프리팹을 사용할 수 있습니다. 이 프리팹은 시스템의 설치된 모션 컨트롤러 드라이버에서 런타임에 올바른 glTF 모델을 동적으로 로드합니다. 이러한 모델을 편집기에서 수동으로 가져오는 대신 동적으로 로드하는 것이 중요하므로 앱은 사용자가 가질 수 있는 현재 및 미래의 컨트롤러에 대해 물리적으로 정확한 3D 모델을 표시합니다.

  1. 시작 지침에 따라 Mixed Reality 도구 키트를 다운로드하고 Unity 프로젝트에 추가합니다.
  2. 카메라를 시작 단계의 일부로 MixedRealityCameraParent 프리팹으로 교체한 경우 해당 프리팹에는 모션 컨트롤러 렌더링이 포함됩니다. 그렇지 않으면 프로젝트 창의 장면 에 Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab 을 추가합니다. 사용자가 장면 내에서 텔레포트할 때 카메라를 이동하는 데 사용하는 부모 개체의 자식으로 해당 프리팹을 추가하여 컨트롤러가 사용자와 함께 오도록 합니다. 앱에 텔레포트가 포함되지 않는 경우 장면의 루트에 프리팹을 추가하기만 하면 됩니다.

개체 throw

가상 현실에서 개체를 던지는 것은 처음에는 보이는 것보다 더 어려운 문제입니다. 대부분의 물리적 기반 상호 작용과 마찬가지로 게임에서 던질 때 예기치 않은 방식으로 작동하면 즉시 명백하고 몰입이 중단됩니다. 우리는 물리적으로 올바른 던지기 동작을 나타내는 방법에 대해 깊이 생각하고, 플랫폼에 대한 업데이트를 통해 활성화 된 몇 가지 지침을 마련했습니다, 우리는 당신과 공유하고 싶습니다.

여기에서 throw를 구현하는 것이 좋습니다. 이 샘플은 다음 네 가지 지침을 따릅니다.

  • 위치 대신 컨트롤러의 속도를 사용합니다. Windows에 대한 11월 업데이트에서는 ''Approximate'' 위치 추적 상태일 때 동작이 변경되었습니다. 이 상태에서 컨트롤러에 대한 속도 정보는 위치보다 긴 높은 정확도가 높은 것으로 판단되는 한 계속 보고됩니다.

  • 컨트롤러의 각 속도를 통합합니다. 이 논리는 모두 위의 연결된 패키지 내에서 정적 메서드의 파일에 GetThrownObjectVelAngVel 포함 throwing.cs 됩니다.

    1. 각 속도가 보존되므로 throw된 개체는 throw 시점과 동일한 각도 속도를 유지해야 합니다. objectAngularVelocity = throwingControllerAngularVelocity;

    2. throw된 개체의 질량 중심이 그립 포즈의 원점이 아닐 가능성이 높기 때문에 사용자의 참조 프레임에 있는 컨트롤러의 속도와 속도가 다를 수 있습니다. 이러한 방식으로 개체의 속도에 기여하는 부분은 컨트롤러 원점 주위에서 throw된 개체의 질량 중심에서 순간적인 탄젠트 속도입니다. 이 탄젠트 속도는 컨트롤러 원점과 throw된 개체의 질량 중심 사이의 거리를 나타내는 벡터를 사용하여 컨트롤러의 각 속도의 교차곱입니다.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. throw된 개체의 총 속도는 컨트롤러의 속도와 이 탄젠트 속도의 합계입니다. objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • 속도를 적용하는 시간에 주의하세요. 버튼을 누르면 해당 이벤트가 Bluetooth를 통해 운영 체제로 버블링되는 데 최대 20ms가 걸릴 수 있습니다. 즉, 컨트롤러 상태 변경을 누른 상태에서 누르지 않음으로 폴링하거나 다른 방법으로 폴링하는 경우 컨트롤러에서 가져오는 정보를 제공하는 컨트롤러는 실제로 이 상태 변경보다 앞서 있을 것입니다. 또한 폴링 API에서 제시하는 컨트롤러 포즈는 앞으로 프레임이 표시될 때 20ms 이상이 될 수 있는 포즈를 반영할 것으로 예측됩니다. 이는 보류된 개체 를 렌더링하는 데 좋지만, 사용자가 throw를 해제하는 순간의 궤적을 계산할 때 개체를 대상으로 지정하는 데 시간이 더 복잡합니다. 다행히 11월 업데이트에서 InteractionSourcePressed 또는 InteractionSourceReleased 와 같은 Unity 이벤트가 전송되면 단추를 누르거나 놓을 때의 기록 포즈 데이터가 상태에 포함됩니다. throw하는 동안 가장 정확한 컨트롤러 렌더링 및 컨트롤러 대상 지정을 얻으려면 폴링 및 이벤트를 적절하게 올바르게 사용해야 합니다.

    • 각 프레임을 렌더링하는 컨트롤러의 경우 앱은 컨트롤러의 GameObject를 현재 프레임의 광자 시간 동안 정방향 예측 컨트롤러 포즈에 배치해야 합니다. XR과 같은 Unity 폴링 API에서 이 데이터를 가져옵니다 . InputTracking.GetLocalPosition 또는 XR. Wsa. Input.InteractionManager.GetCurrentReading.
    • 보도 또는 릴리스 를 대상으로 하는 컨트롤러 의 경우 앱은 해당 보도 또는 릴리스 이벤트에 대한 기록 컨트롤러 포즈를 기반으로 궤적을 광선캐스트하고 계산해야 합니다. InteractionManager.InteractionSourcePressed와 같은 Unity 이벤트 API에서 이 데이터를 가져옵니다.
  • 그립 포즈를 사용합니다. Angular 속도 및 속도는 포인터 포즈가 아닌 그립 포즈를 기준으로 보고됩니다.

Throw는 향후 Windows 업데이트로 계속 개선될 것이며 여기에서 자세한 정보를 찾을 수 있습니다.

MRTK의 제스처 및 모션 컨트롤러

입력 관리자에서 제스처 및 모션 컨트롤러에 액세스할 수 있습니다.

안내 따르기

자세한 사용자 지정 예제와 함께 단계별 자습서는 Mixed Reality Academy에서 사용할 수 있습니다.

MR 입력 213 - 모션 컨트롤러
MR 입력 213 - 모션 컨트롤러

다음 개발 검사점

배치한 Unity 개발 과정을 따라가는 경우 MRTK 핵심 구성 요소를 탐색하는 중입니다. 여기에서 다음 구성 요소로 진행할 수 있습니다.

또는 Mixed Reality 플랫폼 기능 및 API로 이동합니다.

언제든지 Unity 개발 검사점으로 돌아갈 수 있습니다.

참고 항목