손 메뉴 — MRTK2

손 메뉴 UX 예

손 메뉴를 사용하면 자주 사용되는 함수에 대한 손 연결 UI를 빠르게 가져올 수 있습니다. 다른 개체와 상호 작용하는 동안 잘못된 활성화를 방지하기 위해 손 메뉴에는 '플랫 핸드 필요' 및 '응시 활성화 사용' 등의 옵션이 제공됩니다. 원치 않는 활성화를 방지하려면 이러한 옵션을 사용하는 것이 좋습니다.

손 메뉴 예제

HandMenuExamples.unity 장면이 폴더 아래에 있습니다 MRTK/Examples/Demos/HandTracking/Scenes . 실행 중인 장면에는 현재 선택한 메뉴 유형만 활성화됩니다.
HandMenu_ExampleScene

이러한 손 메뉴 프리팹은 폴더 아래에서 MRTK/Examples/Common/Prefabs 찾을 수 있습니다.

HandMenu_Small_HideOnHandDrop 및 HandMenu_Medium_HideOnHandDrop

이 두 예제에서는 단순히 MenuContent 개체를 활성화하고 비활성화하여 OnFirstHandDetected()OnLastHandLost() 이벤트에 메뉴를 표시하고 숨깁니다.
HandMenu_ExampleScene 1
HandMenu_ExampleScene 2

HandMenu_Large_WorldLock_On_GrabAndPull

상호 작용 시간이 더 긴 더 복잡한 메뉴의 경우 메뉴를 월드 잠금으로 잠그는 것이 좋습니다. 이 예제에서 사용자는 OnFirstHandDetected()OnLastHandLost() 이벤트에서 MenuContent를 활성화하고 비활성화하는 것 외에도 메뉴를 월드 잠금으로 끌어올 수 있습니다.
HandMenu_ExampleScene 3

백플레이트의 ManipulationHandler 경우 잡기 가능하고 움직일 수 있습니다. Manipulation Started 이벤트에서 SolverHandler.UpdateSolvers 가 비활성화되어 메뉴를 월드 잠금으로 잠급니다. 또한 작업이 완료되면 사용자가 메뉴를 닫을 수 있도록 닫기 단추를 표시합니다. 조작 종료 이벤트에서 HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine 을 호출하여 사용자가 손바닥을 들어 올려서 보고 메뉴를 다시 손에 가져올 수 있도록 합니다.
HandMenu_ExampleScene 4

닫기 단추는 SolverHandler.UpdateSolvers 를 다시 활성화하고 MenuContent를 숨깁니다.
HandMenu_ExampleScene 5

HandMenu_Large_AutoWorldLock_On_HandDrop

이 예제는 HandMenu_Large_WorldLock_On_GrabAndPull 비슷합니다. 유일한 차이점은 메뉴가 손 놓기에서 자동으로 월드 잠금된다는 것입니다. 이 동작은 OnLastHandLost() 이벤트에 MenuContent를 숨기지 않음으로써 처리됩니다. 끌어오기 & 동작은 HandMenu_Large_WorldLock_On_GrabAndPull 예제와 동일합니다.

스크립트

동작은 HandConstraint 손 제한 콘텐츠(예: 손 UI, 메뉴 등)에 대해 추적된 개체를 안전한 지역으로 제한하는 솔버를 제공합니다. 안전 지역은 손으로 교차하지 않는 영역으로 간주됩니다. 손바닥이 사용자를 향하고 있을 때 솔버 추적 개체를 활성화하는 일반적인 동작을 보여 주기 위해 HandConstraintPalmUp이라는 HandConstraint의 파생 클래스도 포함됩니다.

자세한 설명서는 각 HandConstraint 속성에 사용할 수 있는 도구 팁을 참조하세요. 몇 가지 속성은 아래에 자세히 정의되어 있습니다.

HandMenu_ExampleScene 팜 업
  • 안전 영역: 안전 영역은 콘텐츠를 제한할 위치를 지정합니다. 손과 겹치지 않도록 콘텐츠가 Ulnar 쪽에 배치되고 상호 작용 품질이 향상되는 것이 좋습니다. 안전 영역은 비행기 직교로 프로젝션된 손 방향을 카메라 보기로 가져가 손 주위의 경계 상자에 대해 광선 투사하여 계산됩니다. 안전 영역은 작업 IMixedRealityHand 하도록 정의되지만 다른 컨트롤러 유형에서도 작동합니다. 각 안전 영역이 서로 다른 컨트롤러 유형에서 무엇을 나타내는지 살펴보는 것이 좋습니다.

  • 카메라를 향할 때까지 손 따르기 이 설정이 활성화되면 메뉴가 응시에 충분히 맞춰질 때까지 솔버가 손 회전을 따릅니다. 이때 카메라와 마주하게 됩니다. 이 동작은 HandConstraintSolver의 SolverRotationBehavior를 LookAtTrackedObject에서 LookAtMainCamera로 변경하여 해 찾기가 있는 GazeAlignment 각도가 변경됨에 따라 작동합니다.

HandMenu 안전 영역
  • 활성화 이벤트: 현재 는 HandConstraint 4개의 활성화 이벤트를 트리거합니다. 이러한 이벤트는 다양한 조합으로 사용하여 고유한 HandConstraint 동작을 만들 수 있습니다. 이러한 동작의 예는 아래 MRTK/Examples/Demos/HandTracking/Scenes/ 의 HandBasedMenuExample 장면을 참조하세요.

    • OnHandActivate: 손이 IsHandActive 메서드를 충족할 때 트리거됩니다.
    • OnHandDeactivate: IsHandActive 메서드가 더 이상 충족되지 않을 때 트리거됩니다.
    • OnFirstHandDetected: 손 추적 상태가 보기에 없는 손에서 보기의 첫 번째 손으로 변경될 때 발생합니다.
    • OnLastHandLost: 손 추적 상태가 보기에서 하나 이상의 손에서 보기에 있는 손 없음으로 변경되는 경우에 발생합니다.
  • 해 찾기 활성화/비활성화 논리: 현재 논리 활성화 및 비활성화 HandConstraintPalmUp 를 위한 권장 사항은 개체를 사용하지 않도록 설정/활성화하는 대신 SolverHandler의 UpdateSolver 값을 사용하여 수행하는 것입니다. 이 동작은 연결된 메뉴의 ManipulationHandler "OnManipulationStarted/Ended" 이벤트 후에 트리거되는 편집기 기반 후크를 통해 예제 장면에서 볼 수 있습니다.

    • 손 제약 조건 논리 중지: 활성화/비활성화 논리를 중지(또는 실행하지 않음)되도록 손 제한 개체를 설정하려고 할 때 HandConstraintPalmUp을 사용하지 않도록 설정하는 대신 UpdateSolver를 False로 설정합니다.
      • 응시 기반(또는 응시 기반이 아닌) 다시 연결 논리를 사용하도록 설정하려면 HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() 함수를 호출하여 후속 작업을 수행합니다. 이 호출은 "IsValidController" 조건이 충족되면 계속 검사 코루틴을 트리거하고, 이 조건이 충족되면 UpdateSolver를 True로 설정합니다(또는 개체가 비활성화됨).
    • 손 제약 조건 논리 시작: 손 제한 개체가 활성화 조건을 충족하는지 여부에 따라 손 뒤를 다시 따르도록 설정하려고 할 때 SolverHandler의 UpdateSolver를 true로 설정합니다.
  • 다시 연결 논리: 현재 HandConstraintPalmUp 는 SolverHandler의 UpdateSolver가 True인지 여부에 관계없이 대상 개체를 추적된 지점에 자동으로 다시 연결할 수 있습니다. 이 동작은 월드 잠금이 적용된 후 HandConstraintPalmUp의 StartWorldLockReattachCheckCoroutine() 함수를 호출하여 처리됩니다(이 경우 SolverHandler의 UpdateSolver를 False로 효과적으로 설정함).

추가 정보