손 코치 - MRTK2

손 코치 메뉴

손 코치는 시스템이 사용자의 손을 감지하지 못할 때 트리거되는 3D 모델링 손입니다. 제스처가 학습되지 않은 경우 사용자를 안내하는 데 도움이 되는 "교육" 구성 요소로 구현됩니다. 사용자가 지정된 제스처를 한 기간 동안 수행하지 않은 경우 손은 지연으로 반복됩니다. 손 코치는 버튼을 누르거나 홀로그램을 따기 나타내는 데 사용할 수 있습니다.

현재 상호 작용 모델은 스크롤, 멀리 선택, 근거리 탭과 같은 다양한 제스처 컨트롤을 나타냅니다. 다음은 기존 손 코치 예제의 전체 목록입니다.

  • 근거리 탭 – 단추 또는 상호 작용 가능한 개체 닫기에 사용됩니다.
  • 멀리 선택 – 멀리 떨어진 개체에 사용됨
  • 이동 – 공간에서 홀로그램을 이동하는 데 사용됩니다.
  • 회전 – 홀로그램 또는 개체를 회전하는 방법을 표시하는 데 사용됩니다.
  • 배율 – 홀로그램을 더 크거나 작게 조작하는 방법을 표시하는 데 사용됩니다.
  • 손 대칭 이동 – UI 시작 패널 또는 손 메뉴를 가져오는 데 사용됩니다.
  • 손바닥 위로 – 상자 밖으로 경험에서 벌새 순간에 사용됩니다. 또 다른 제안은 UI 시작 패널을 표시하는 것입니다.
  • 스크롤 – 목록 또는 긴 문서를 스크롤하는 데 사용됩니다.

예제 장면

HandCoachExample 장면의 MixedRealityToolkit.Examples/Experimental/HandCoach/Scenes에서 예제를 찾을 수 있습니다.

손 3D 자산

MixedRealityToolkit.SDK/Experimental/HandCoach에서 자산을 찾을 수 있습니다.

품질

스킨 메시에 왜곡이 있는 경우 프로젝트에서 적절한 양의 관절을 사용하고 있는지 확인해야 합니다. Unity의 프로젝트 설정 > 편집 > 품질 > 기타 > 혼합 가중치로 이동합니다. 부드러운 관절을 보려면 "4개의 뼈"가 선택되어 있는지 확인합니다. 프로젝트 설정

스크립트

상호 작용 힌트

스크립트는 InteractionHint.cs 애니메이션을 트리거하기 위한 래퍼 기능을 제공하고 손 장비에 대해 페이드를 제공합니다.

상호 작용 힌트를 설정하는 방법

상호 작용 힌트를 설정하려면 제공된 프리팹 "StaticHandCoachRoot_L.prefab" 및 "StaticHandCoachRoot_R.prefab"을 사용하는 것이 좋습니다. 이 프리팹에는 제공된 힌트 애니메이션이 의도한 대로 작동하도록 하는 적절한 계층 구조뿐만 아니라 InteractionHint 스크립트 및 손 리그도 포함됩니다. 그렇지 않으면 animator를 사용하여 손 장비에서 한 부모 수준 위로 gameObject에 스크립트를 배치해야 합니다.

검사기 속성

  • HideIfHandTracked 이 부울은 사용자의 손을 추적할 때 손 추적 상태를 사용하여 시각적 개체를 숨길지 여부를 지정합니다. false로 설정하면 "customShouldHideVisuals" 스크립팅 속성만 사용하여 힌트를 숨길지 여부를 결정합니다.

  • MinDelay 이 속성은 시각적 개체를 표시하기 위한 최소 지연 시간을 지정합니다. 기본적으로 손의 시각적 개체는 사용자의 손이 추적되지 않는 경우 이 몇 초 후에 표시됩니다.

  • MaxDelay 이 속성은 시각적 개체를 표시하기 위한 최대 지연 시간을 지정합니다. 기본적으로 손의 시각적 개체는 사용자의 손이 추적되더라도 몇 초 후에 표시됩니다.

  • UseMaxTimer 이 부울이 false로 설정된 경우 최대 타이머를 사용하지 않도록 설정하고 사용자의 손이 보이지 않거나 사용자 지정 조건이 false를 반환할 때만 손 힌트를 표시할 수 있습니다.

  • 반복 이 속성은 최소 또는 최대 타이머가 통과했을 때 힌트 애니메이션이 재생되는 횟수를 제어합니다. 그런 다음 힌트가 숨겨지고 지연을 다시 기다립니다.

  • 자동 활성화 이 부울이 true로 설정되면 스크립트의 GameObject가 계층에서 활성화되고 스크립트가 사용하도록 설정되면 타이머 논리를 통해 힌트가 자동으로 실행됩니다. 코드를 통해 힌트 모양과 누락을 수동으로 제어하려는 경우에만 false로 설정해야 합니다.

  • AnimationState 힌트가 활성 상태일 때 재생되어야 하는 애니메이션 상태의 이름입니다. StartHintLoop() 함수가 호출되기 전에 설정해야 합니다(자동 활성화를 선택한 경우 OnEnable 동안).

스크립트를 통해 InteractionHint 제어

  • StartHintLoop 이 함수는 자동 활성화 플래그가 true로 설정된 경우 OnEnable을 시작하는 show/hide 루프를 시작합니다.
  • StopHintLoop 이 함수는 현재 재생되지 않는 경우 페이드 아웃 애니메이션 상태를 호출한 다음, show/hide 루프를 비활성화하고 계층에서 손 조작을 비활성 상태로 설정합니다.
  • AnimationState 이 문자열은 루프 중에 재생되는 애니메이션 상태를 결정합니다. 이 문자열을 변경하여 재생되는 상태를 변경할 수 있지만 StopHintLoop을 호출한 후 이 문자열을 변경해야 하며 상태를 변경한 후 StartHintLoop을 다시 호출해야 합니다.
  • CustomShouldHideVisuals 손 시각적 개체를 숨기려는 경우 true를 반환해야 하는 고유한 함수를 사용하여 설정할 수 있습니다(MinMaxTimer, 특히 max 매개 변수에 유의).

사용자 지정 애니메이션 고려 사항

페이드 기본값은 0.5초이므로, 의미 있는 정보를 전달하려면 리그와 함께 사용하기 위해 만든 사용자 지정 애니메이션은 최소 1.5초여야 합니다.

제공된 기본 페이드 인 및 페이드 아웃 상태, Fade_In 및 Fade_Out 페이드 길이를 설정하도록 두 번째 키프레임의 타임스탬프를 변경하여 조정할 수 있습니다.

애니메이터와 스크립트는 가능한 한 간단하게 설정해야 하는 방식으로 설정되었습니다. 새 애니메이션 상태를 추가하려면 fbx를 가져오고, 애니메이션 이름이 고유한 이름으로 설정되어 있는지 확인하고, 해당 애니메이션을 애니메이터로 끌어옵니다.

MoveToTarget

MoveToTarget.cs 스크립트는 시간 경과에 따라 손 힌트를 추적 위치에서 대상 위치로 이동하는 기능을 제공합니다.

MoveToTarget을 설정하는 방법

제공된 프리팹 "MovingHandCoachRoot_L.prefab" 및 "MovingHandCoachRoot_R.prefab"에는 해당 계층 구조에 MoveToTarget이 포함되어 있습니다. 사용자 고유의 설정에서 이 스크립트를 사용하려면 리그에 대한 Animator가 포함된 루트 gameobject에 배치해야 합니다.

검사기 속성

  • TrackingObject 동작을 시작하기 전에 리그가 따라야 할 개체로 설정합니다. 빈 GameObject를 만들고 추적을 정확히 파악하는 데 도움이 되도록 특정 위치로 이동하는 것이 좋습니다.
  • Targetobject 동작하는 동안 리그를 이동할 개체로 설정합니다. 빈 GameObject를 만들고 추적을 정확히 파악하는 데 도움이 되도록 특정 위치로 이동하는 것이 좋습니다.
  • RootObject 상대 위치를 올바르게 계산할 수 있도록 추적 개체와 대상 개체 간의 공유 부모로 설정합니다. 포함된 프리팹에는 추적 개체와 대상 개체가 모두 계층 구조에 있지만 대상 개체를 프리팹 외부의 gameObject로 설정하고 루트 개체를 공유 부모로 변경할 수 있습니다.
  • 기간 TrackingObject에서 TargetObject로 이동하는 데 걸리는 시간(초)입니다.
  • TargetOffset GameObject가 올바른 대상 위치에 도달하도록 하는 조정 가능한 오프셋입니다. 이 기능은 애니메이션 중에 애니메이션에 위치 오프셋이 포함된 경우에 유용합니다.
  • AnimationCurve 기본적으로 선형 곡선으로 설정되지만 동작 경로를 시작하고 중지할 때 감속/축소를 제공하도록 곡선을 변경할 수 있습니다.

스크립트를 통해 MoveToTarget 제어

사용자 지정 스크립트에서 Hand Rig가 TrackingObject를 따르도록 하려는 동안 Follow()를 호출한 다음, 손 장비가 TargetObject에 대한 동작을 시작하도록 하려면 MoveToTargetPosition()을 호출합니다.

애니메이션을 통해 MoveToTarget 제어

이동해야 하는 애니메이션에서 두 개의 이벤트를 설정합니다. 하나는 Follow()를 호출하고 다른 하나는 MoveToTargetPosition()을 호출합니다. Hand Rig가 TrackingObject를 따르도록 하므로 첫 번째 키 프레임에서 팔로우를 설정해야 합니다. MoveToTargetPosition은 장비가 대상으로 이동하기 시작할 키프레임에서 설정되어야 합니다. 이는 제공된 프리팹에서 스크립트 기능을 사용하는 방법입니다.

RotateAroundPoint

RotateAroundPoint.cs 스크립트는 시간이 지남에 따라 피벗 지점을 중심으로 손 힌트를 회전하는 기능을 제공합니다.

RotateAroundPoint를 설정하는 방법

제공된 프리팹 "RotatingHandCoachRoot_L.prefab" 및 "RotatingHandCoachRoot_R.prefab"에는 해당 계층 구조에 RotateAroundPoint가 포함되어 있습니다. 사용자 고유의 설정에서 이 스크립트를 사용하려면 리그에 대한 Animator가 포함된 루트 gameobject에 배치해야 합니다.

검사기 속성

  • CenteredParent 리그를 피벗할 부모 개체로 설정합니다.
  • InverseParent 손 방향을 동일하게 유지하기 위해 부모로 이 값을 centeredParent로 역순으로 회전하도록 설정합니다. 일반적으로 InteractionHint 스크립트가 있는 부모 개체입니다.
  • 피벗 위치 힌트가 이동을 시작할 지점으로 설정합니다.
  • 기간 CenteredParent를 중심으로 회전하는 데 걸리는 시간(초)입니다.
  • AnimationCurve 기본적으로 선형 곡선으로 설정되지만 동작 경로를 시작하고 중지할 때 감속/축소를 제공하도록 곡선을 변경할 수 있습니다.
  • RotationVector 각 축을 따라 회전할 각도입니다.

스크립트를 통해 RotateAroundPoint 제어

사용자 지정 스크립트에서 손 장비가 CenteredParent를 중심으로 회전을 시작하도록 하려면 RotateToTarget()을 호출합니다. 위치를 원래 피벗 위치로 다시 설정하려면 ResetAndDeterminePivot()을 호출합니다.

애니메이션을 통해 RotateAroundPoint 제어

이동해야 하는 애니메이션에서 두 개의 이벤트를 설정합니다. 하나는 ResetAndDeterminePivot()을 호출하고 다른 하나는 RotateToTarget()을 호출합니다. ResetAndDeterminePivot은 손 장비가 피벗 위치로 다시 설정되도록 하므로 첫 번째 키 프레임에서 설정해야 합니다. RotateToTarget은 리그가 CenteredParent를 중심으로 회전을 시작할 키프레임에 설정되어야 합니다. 이는 제공된 프리팹에서 스크립트 기능을 사용하는 방법입니다.