손 코치 - MRTK2

Hand Coach Menu

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

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

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

예제 장면

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

손 3D 자산

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

품질

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

스크립트

상호 작용 힌트

이 스크립트는 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 상대 위치를 올바르게 계산할 수 있도록 추적 개체와 대상 개체 간의 공유 부모로 설정합니다. 포함된 프리팹에는 추적 개체와 대상 개체가 모두 계층 구조에 있지만 대상 개체를 prefab 외부의 gameObject로 설정하고 루트 개체를 공유 부모로 변경할 수 있습니다.
  • 기간 TrackingObject에서 TargetObject로 이동하는 데 걸리는 시간(초)(초)입니다.
  • TargetOffset GameObject가 올바른 대상 위치에 도달하도록 튜닝할 수 있는 오프셋입니다. 애니메이션이 애니메이션 중에 위치 오프셋을 포함하는 경우에 유용합니다.
  • AnimationCurve 이는 기본적으로 선형 곡선으로 설정되지만, 이동 경로를 시작하고 중지할 때 감속/축소를 제공하도록 곡선을 변경할 수 있습니다.

스크립트를 통해 MoveToTarget 제어

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

애니메이션을 통해 MoveToTarget 제어

이동해야 하는 애니메이션에서 다음()에 대한 호출이 있는 이벤트와 MoveToTargetPosition()에 대한 호출이 있는 이벤트 등 두 개의 이벤트를 설정합니다. 핸드 리그가 TrackingObject를 따르도록 하기 때문에 첫 번째 키 프레임에서 팔로우를 설정해야 합니다. MoveToTargetPosition은 리그가 대상으로 이동하기 시작할 키 프레임에 설정되어야 합니다. 제공된 프리팹에서 스크립트 기능을 사용하는 방법입니다.

RotateAroundPoint

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

RotateAroundPoint를 설정하는 방법

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

검사기 속성

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

스크립트를 통해 RotateAroundPoint 제어

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

애니메이션을 통해 RotateAroundPoint 제어

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