손 메뉴 - MRTK2

Hand Menu UX Example

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

손 메뉴 예제

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

이러한 손 메뉴 프리팹은 폴더 아래에서 MRTK/Examples/Demos/HandTracking/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 경우 잡을 수 있고 움직일 수 있습니다. 조작 시작 이벤트에서 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 Palm up
  • 금고 영역: 안전 영역은 콘텐츠를 제한할 위치를 지정합니다. 손과 겹치지 않도록 콘텐츠가 Ulnar 쪽에 배치되고 상호 작용 품질이 향상되는 것이 좋습니다. 금고 영역은 비행기 직각으로 프로젝션된 손 방향을 카메라 보기로 가져가 손 주위의 경계 상자에 대해 광선 캐스팅하여 계산됩니다. 금고 영역은 작동 IMixedRealityHand 하도록 정의되지만 다른 컨트롤러 형식에서도 작동합니다. 각 안전 영역이 서로 다른 컨트롤러 유형에서 무엇을 나타내는지 살펴보는 것이 좋습니다.

  • 이 활성으로 카메라 마주볼 때까지 손을 따라가면 솔버가 카메라가 카메라를 마주보고 있는 응시에 메뉴가 충분히 맞춰질 때까지 손 회전을 따릅니다. 이는 HandConstraintSolver의 SolverRotationBehavior를 LookAtTrackedObject에서 LookAtMainCamera로 변경하여 솔버의 GazeAlignment 각도가 달라짐에 따라 작동합니다.

HandMenu Safe Zones
  • 활성화 이벤트: 현재 트리거는 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 해 찾기의 UpdateSolver가 True인지 여부에 관계없이 대상 개체를 추적된 지점에 자동으로 다시 연결할 수 있습니다. 이 작업은 World-locked(이 경우 SolverHandler의 UpdateSolver를 False로 효과적으로 설정)된 후 HandConstraintPalmUp의 StartWorldLockReattachCheckCoroutine() 함수를 호출하여 수행됩니다.

참조