손 코치 - 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를 중심으로 회전을 시작할 키프레임에 설정되어야 합니다. 이는 제공된 프리팹에서 스크립트 기능을 사용하는 방법입니다.