포즈 인식 - 2024-Adoor/practice GitHub Wiki

Interaction SDK를 통한 신체, 손 포즈 인식에 대한 내용 정리

NOTE

  • 신체 포즈 인식은 직접 퀘스트에서 자세를 찍고 기록해서 쓸 수 있다.

손 인식의 개념 - 손의 모양의 조건을 정의하는 Shape, 손의 방향을 정의하는 Transform이 있다.

이 조건들 각각을 상태로 봐서 조합이 가능하다.

  • LastKnownGoodHand - (Left/Right)Hand 오브젝트 하위에 있는 HandData(Left/Right)에 이미 컴포넌트로 있음. 오히려 손을 인식하지 못할 때 fallback 값으로 이동시키는게 추가 레이어고 이게 더 로우한 데이터인듯?

공식 문서 번역

신체 포즈 인식

🔗 이 부분은 Body Pose Detection을 바탕으로 합니다.

Body Pose는 신체 골격의 모양를 나타내며, 이는 로컬 관절 포즈와 루트 관절로부터의 관절 포즈로 표현됩니다. Body Pose는 스켈레톤 매핑을 참조하여 스켈레톤 포즈를 구성해야 합니다. 신체 입력 데이터 스택에 관한 오버뷰는 Input Data를 참조하세요.

IBodyPose

IBodyPose는 Body Pose가 소비되는 인터페이스입니다. 여기에는 GetJointPoseLocal 및 GetJointPoseFromRoot 메서드가 포함되어 있으며 소비자가 관절 세트 및 각 관절의 부모/자식 관계를 쿼리할 수 있는 IskeletonMapping을 노출합니다. 서로 다른 뼈대에는 서로 다른 관절 세트가 있으므로 ISkeletonMapping을 사용하여 다른 뼈대에는 존재하지 않는 견갑골이나 어깨 관절을 한 뼈대에서 가져올 수 있습니다. 또한 관절의 부모를 찾기 위해 사용할 수도 있는데, 이는 상대적 위치와 회전을 결정하는 데 종종 사용됩니다.

BodyPoseData는 BodyPose의 직렬화된 ScriptableObject 형태이며 포즈 데이터를 저장하고 호출하는 데 사용할 수 있습니다. 빈 BodyPoseData 객체를 생성하려면 Unity 툴바의 Oculus > Interaction 메뉴를 확인하세요.

공식 문서에 설명된 BodyPoseData 객체 생성 경로가 업데이트되어 달라진 것을 반영하지 못하는 것으로 보여서 세부 경로 일부를 제거함.

PoseFromBody

PoseFromBody는 IBody를 받아서 IBodyPose를 노출합니다. 이는 디버그 비주얼이나 바디 메시와 같이 IBodyPose를 사용하는 컴포넌트를 구동하는 데 사용할 수 있습니다.

AutoUpdate 불리언은 IBody 데이터가 업데이트될 때 PoseFromBody가 자동으로 업데이트되어야 하는지 여부를 결정합니다. true로 설정하면 IBody와 같이 업데이트됩니다. false인 경우에는 업데이트하지 않습니다. AutoUpdatefalse로 설정하고 UpdatePose() 메서드를 명시적으로 호출하면 IBody의 현재 포즈에 대한 스냅샷을 찍는 데 사용할 수 있습니다.

BodyPoseComparerActiveState

BodyPoseComparerActiveState는 IBodyPose들 간의 로컬 관절 방향을 비교하는 포즈 인식 컴포넌트입니다. 이를 통해 어떤 관절을 모니터링할 것인지와 각 관절 사이의 최대 각도 델타는 어디까지인지 선택할 수 있습니다. 만약 모든 관절이 이 최대 각도 내에 있다면, IActiveState가 Active가 됩니다.

신체 포즈 기록하기

Interaction SDK에는 신체 포즈를 캡처해 BodyPoseData ScriptableObject들로 만드는 에디터 도구가 포함되어 있습니다. 그런 다음 이렇게 만들어진 ScriptableObject는 당신의 애플리케이션안에 실려 사전설정 포즈로서 포즈 비교에 사용되거나 게임 내 포즈 교육을 위한 신체 모델을 가져오는 데 사용할 수 있습니다. 실제 신체 포즈를 캡처하기 위해서 이 유틸리티는 Unity 에디터의 재생 모드에서 사용해야 합니다.

프로퍼티 설명
Source 캡처된 포즈에 대한 관절 데이터를 공급할 IBody입니다. 이는 당신의 씬에서 발견된 첫 번째 IBody에 자동으로 연결될 것입니다. 필요하다면 다른 것으로 덮어쓸 수 있습니다.
Target Asset 포즈가 캡처되어 저장될 BodyPoseData ScriptableObject입니다. 선택적 옵션으로, 아무 것도 제공되지 않으면 캡처된 각 포즈에 대해 새 자산이 생성되고 Assets/BodyPoses에 추가됩니다.
Capture Delay Capture Body Pose 버튼을 누른 시점과 실제로 캡처되는 시점 사이의 시간입니다.
Play Sound On Capture 체크하면 타이머가 흐르고 포즈가 캡처될 때 시스템 비프음이 재생됩니다.

레퍼런스

신체 자세 감지에 사용되는 컴포넌트에 대한 레퍼런 정보는 다음 링크들을 참조하세요.

손 포즈 인식

🔗 이 부분은 Hand Pose Detection을 바탕으로 합니다.

손 포즈는 shape와 transform으로 정의됩니다. shape는 손 손가락 관절의 필요한 위치에 대한 불리언 조건입니다. transform은 월드 공간에서 필요한 손 방향에 대한 불리언 조건입니다. 추적된 손이 해당 포즈의 필요 shape와 transform과 일치할 때 포즈가 감지됩니다.

이 주제에서는 포즈, shape 및 transform 인식, 그리고 포즈 감지 여부를 결정하는 데 사용되는 기준에 대해 설명합니다. 또한 포즈를 시각적으로 디버깅하는 데 사용할 수 있는 디버그 컴포넌트에 대해서도 설명합니다. 자신만의 사용자 정의 손 포즈를 만들려면 Build a Custom Hand Pose를 참조하세요.

Pose Prefabs

Interaction SDK에는 사용할 준비가 된 포즈 프리팹 예시 6개가 포함되어 있습니다. 이러한 프리팹에 정의되어 있는 패턴을 이용하여 나만의 포즈를 정의할 수 있습니다. PoseExamples 샘플 씬에서 이 포즈 프리팹들을 사용하여 포즈 인식을 실험해 볼 수 있습니다.

  • RockPose
  • PaperPose
  • ScissorsPose
  • ThumbsUpPose
  • ThumbsDownPose
  • StopPose

각 포즈 프리팹에는 다음 컴포넌트들이 있습니다:

  • IHand를 가지는 HandRef - 이 프리팹의 다른 컴포넌트는 이 참조(HandRef)를 통해서 손의 상태를 읽습니다.
  • 하나 또는 그 이상의 ShapeRecognizerActiveState - 지정된 Shape 기준을 충족하는 경우 활성화됩니다.
  • TransformRecognizerActiveState - transform 특징(예: 특정 손목 방향)이 감지되면 활성화됩니다.
    원문에서는 State가 빠져 있지만 유니티에서 실제로 봐도 이름에 State가 있고 밑 참고 사진에도 이름에 State가 있는 걸로 봐서 오류로 추정, 직접 이름에 State 추가
  • ActiveStateGroup - 모든 종속 ActiveState가 true인 경우 true를 반환합니다. (*종속 ActiveState - 컴포넌트에 리스트 프로퍼티로 달려있음)
  • ActiveStateSelectorSelectorUnityEventWrapper - 포즈가 감지될 때 이벤트를 호출할 수 있습니다.


포즈는 필요 trasform(TransformRecognizerActiveState에 번들로 제공됨)과 shape(ShapeRecognizerActiveState에 번들로 제공됨)을 포함합니다. 이들은 ActiveStateGroup을 사용하여 결합되어 포즈를 정의합니다.

Shape 인식

포즈에는 하나 이상의 shape가 포함됩니다. shape는 하나 이상의 손가락 위치에 대한 일련의 불리안 조건입니다. 조건은 Finger Features의 상태를 사용하여 정의됩니다. 추적된 손이 이러한 조건을 충족하면 shape가 활성화됩니다. 포즈의 모든 shape가 활성화되고 transform도 활성화되면 포즈가 감지됩니다. 포즈의 모양은 포즈의 ShapeRecognizerActiveState 컴포넌트에 ShapeRecognizer 에셋으로 저장됩니다.

ShapeRecognizerActiveState

ShapeRecognizerActiveState는 모든 손가락의 상태에 대해 포즈를 구성하는 shape를 확인합니다. 모두 일치하면 ShapeRecognizerActiveState가 활성화됩니다.

ShapeRecognizer

ShapeRecognizer는 shape를 정의하는 ScriptableObject입니다. shape를 정의하기 위해 Feature Configs이라는 규칙 세트를 사용합니다. Feature Configs은 다섯 손가락 각각에 대해 필요한 위치(상태)를 지정합니다. Feature Configs은 Finger Features(Curl, Flexion, Abduction, Opposition) 중 하나 이상을 사용하여 상태를 정의합니다. 포즈가 활성 상태인지 확인하기 위해 ShapeRecognizer는 ShapeRecognizerActiveState 컴포넌트에서 참조됩니다.

FingerFeatureStateProvider

FingerFeatureStateProvider는 추적된 손의 손가락 상태를 제공하고 각 손가락에 대한 상태 전환 임계값을 포함합니다. 이것은 ShapeRecognizerActiveState 컴포넌트에서 참조됩니다.

FingerFeatureStateThresholds

FingerFeatureStateThresholds는 각 Finger Feature의 상태 임계값을 정의하는 ScriptableObject입니다. 상태 임계값은 손가락이 상태 간에 전환되는 시기를 결정하는 경계 집합입니다. 예를 들어 Curl feature에는 열림, 중립, 닫힘의 3가지 상태가 있습니다. Curl 상태 임계값은 각도를 사용하여 손가락 상태가 열림에서 중립으로, 중립에서 닫힘으로 또는 그 반대로 변경되는 시기를 정의합니다.

Interaction SDK는 DefaultSettings/PoseDetection 아래에 네 가지 기본 상태 임계값 세트를 제공합니다.

  • DefaultThumbFeatureStateThresholds (엄지용)
  • IndexFingerFeatureStateThresholds (검지용)
  • MiddleFingerFeatureStateThresholds (중지용)
  • DefaultFingerFeatureStateThresholds (약지 & 소지용)


엄지 손가락의 Curl 상태 임계값입니다. Curl의 경우 값은 각도입니다.

FingerFeatureStateThresholds 예제

두 상태 사이의 전환을 가정해봅시다, A <> B:

현재 상태가 "A"인 경우, "B"로 전환하려면 "최소 상태 유지 시간" 초 동안 각도가 해당 페어링의 중간점보다 (너비/2.0) 이상 증가해야 합니다.

현재 상태가 "B"인 경우 "A"로 전환하려면 "최소 상태 유지 시간" 초 동안 각도가 해당 페어링의 중간점 아래로 (너비/2.0) 이상 내려가야 합니다.

따라서 컬의 경우 전환하려면: Open > Neutral: 값은 0.0222초 동안 195 이상이어야 합니다. Neutral > Open: 값은 0.0222초 동안 185 미만이어야 합니다. Neutral > Closed: 값은 0.0222초 동안 210 이상이어야 합니다. Closed > Neutral: 값은 0.0222초 동안 200 미만이어야 합니다.

Finger Features

Finger Featuress는 shape를 정의할 수 있는 특정 손가락 위치입니다. 네 가지 feature 있습니다:

Features: Curl Flexion Abduction Opposition
그림
설명 손가락이나 엄지손가락의 위쪽 두 관절이 얼마나 구부러졌는지 나타냅니다. 이 기능은 근위(너클) 관절을 고려하지 않습니다. 근위(지관절) 관절이 손바닥에 비해 구부러지는 정도입니다. Flexion은 네 손가락만 신뢰할 수 있습니다. 엄지 손가락에서의 Flexion은 잘못된 긍정을 제공할 수 있습니다. 인접한 두 손가락 사이의 각도로, 두 손가락의 밑부분에서 측정됩니다. Abduction은 주어진 손가락과 새끼손가락 방향에 있는 인접 손가락 사이의 각도를 측정합니다. 예를 들어 검지의 Abduction은 검지와 중지 사이의 각도입니다. *참고: 새끼손가락에서의 Abduction은 지원되지 않습니다. 주어진 손가락 끝이 엄지손가락 끝과 얼마나 가까운지에 대해. 검지, 중지, 약지, 새끼손가락에만 사용할 수 있습니다.
상태 Open: 손가락은 완전히 곧게 펴져 있니다.
Neutral: 손가락은 마치 커피잔을 감싸듯이 안쪽으로 약간 말려 있습니다.
Closed(그림과 같은): 손가락 끝이 손바닥에 거의 닿을 정도로 안쪽으로 촘촘하게 말려 있습니다.
Open: 손가락의 첫 번째 뼈는 완전히 확장되어 손바닥과 평행합니다.
Neutral: 약간 구부러졌습니다.
Closed: 지관절이 완전히 구부러졌습니다(그림과 같이).
Open: 두 손가락이 벌려져 있습니다(그림에서 검지).
Closed: 두 손가락이 서로 꽉 맞붙어 있습니다.(그림에서는 엄지, 중지, 약지).
None: 아직 사용되지 않습니다.
Touching: 손가락 끝 관절은 ~1.5cm 이내입니다(그림에서 검지).
Near: 손가락 끝 관절은 ~1.5cm에서 ~15cm 사이로 떨어져 있습니다.
None: 손가락 끝 관절은 ~15cm 이상 떨어져 있습니다.

Transform 인식

포즈는 하나 이상의 transform으로 구성됩니다. 손의 transform은 방향과 위치만을 나타냅니다. 방향은 다음 transform들에 대해 상대적으로만 평가됩니다: WristUp, WristDown, PalmDown, PalmUp, PalmTowardsFace, PalmsAwayFromFace, FingersUp, FingersDown, PinchClear.

포즈에 필요한 transform은 포즈의 TransformRecognizerActiveState 컴포넌트에 나열됩니다. 손 트래킹 중, 손의 transform은 포즈의 transform과 비교됩니다. 두 transform 세트가 모두 일치하고 포즈의 모든 shape가 활성화된 경우, 포즈가 감지됩니다.


손의 손가락, 손목, 손바닥을 정의하는 축들입니다.

TransformRecognizerActiveState

TransformRecognizerActiveState는 손, 손 transform의 현재 상태, transform feature configs 리스트와 transform config를 가져옵니다. 이것은 손 transform의 현재 상태를 가져오기 위해 GetHandAspect 메서드를 사용하여 TransformFeatureStateProvider 컴포넌트를 찾습니다. 그 컴포넌트는 raw feature 값을 읽고 해당 컴포넌트에서 제공하는 Transform Config을 사용하여 그 값을 TransformFeatureStates로 양자화합니다.

TransformFeatureStateProvider

TransformFeatureStateProvider는 추적된 손의 transform 상태를 제공합니다. 이것은 TransformRecognizerActiveState 컴포넌트에서 참조됩니다.

TransformConfig

참고: 특정 구성을 등록하면 RegisterConfig메서드가 구성에 대해 추적된 각 상태의 상태를 쿼리할 수 있습니다. 이것은 FeatureStateProvider를 활용하여 상태 변경 논리를 구동합니다.

Velocity 인식

shape 인식은 정적 자세만 감지하는 반면 velocity 인식은 동작을 감지합니다. 예를 들어, shape 인식은 엄지손가락을 치켜든 자세의 손을 감지할 수 있지만 해당 자세에서 손이 위로 움직이는지는 확인할 수 없습니다.

두 가지 velocity 인식 컴포넌트가 있습니다.

  • JointVelocityActiveState
  • JointRotationActiveState

두 컴포넌트 모두 JointDeltaProvider 컴포넌트에서 관절 데이터를 가져옵니다.

Sequences

IActiveState 컴포넌트는 Sequence 컴포넌트를 사용하여 서로 연결할 수 있습니다. Sequence는 시간이 지남에 따라 연속되는 IActiveState를 인식할 수 있으므로, 이들을 복잡한 제스처를 구성하는 데 사용할 수 있습니다. 복잡한 제스처의 예제는 GestureExamples 샘플 장면을 참조하세요.

Sequence Classes

SequenceActivationStep 리스트를 가져와 그것들이 활성화됨에 따라 순회합니다. 각 ActivationStep은 IActiveState, 최소 활성 시간, 최대 단계 시간으로 구성됩니다. 이러한 단계는 다음과 같이 작동합니다:

  • IActiveStateSequence가 ​​다음 단계로 진행되기 전에 적어도 '최소 활성 시간' 만큼 활성 상태여야 합니다.
  • IActiveState가 '최대 단계 시간'보다 오랫동안 활성 상태이면 단계가 실패하고 Sequence가 ​​다시 시작됩니다.

Sequence의 마지막 ActivationStep이 완료되고 나면, 해당 Sequence가 활성화됩니다. 선택 사항인 KeepActiveWhile IActiveState가 제공된 경우, KeepActiveWhile이 활성화되어 있는 한 Sequence는 활성화된 상태로 유지됩니다.

Sequence의 마지막 단계는 선택적 쿨다운 단계로, 그 지속 시간은 RemainActiveCooldown 필드에서 설정할 수 있습니다. 비활성화 중인 Sequence는 최종적으로 비활성화되기 전에 이 쿨다운 타이머가 경과할 때까지 기다립니다.

SequenceActiveStateSequence에 대한 IActiveState 래퍼로, 시퀀스가 시작되었을 때나, 시퀀스 단계가 끝났을 때나, 혹은 두 경우 모두에도 active 상태를 보고할 수 있습니다.

내부 구현 클래스

여기에 설명된 클래스는 기반 기능을 구현하지만 포즈 인식을 사용하기 위해 수정할 필요는 없습니다.

FeatureStateProvider

feature의 현재 상태를 추적하고 임계값을 사용하여 상태 변경을 결정하는 제네릭 도우미 클래스입니다. 이 클래스는 버퍼를 사용하여 상태 변경으로부터 일어나는 상태 간 feature 전환이 너무 빠르게 일어나도록 하지 않게 보장합니다.

FeatureStateThresholdsEditor

FingerFeatureStateThresholdsEditor 및 TransformStatesThresholdsEditor와 같은 종속 편집기 클래스의 모양과 느낌을 정의하는 제네릭 에디터 클래스입니다.

FeatureDescriptionAttribute

사용자가 feature에 대한 임계값을 설정하는 데 도움이 되도록 에디터에 표시되는 설명, 힌트 및 값을 정의할 수 있습니다.

IFeatureStateThreshold

IFeatureStateThreshold는 손 자세 감지에 사용되는 모든 임계값의 기능을 정의하는 제네릭 인터페이스입니다.

IFeatureStateThresholds

finger feature든 transform feature든 관계없이 feature인 타입에 대한 IFeatureStateThresholds 컬렉션*을 정의합니다. *컬렉션 = c#의 컬렉션

IFeatureThresholds

IFeatureStateThresholds 컬렉션과 MinTimeInState(즉, feature가 다른 상태로 전환되기 전에 특정 상태에 있을 수 있는 최소 임계값)에 대한 인터페이스를 제공합니다.
공식 문서 원본 문단 이름이 IFeature Thresholds인데 이것도 오타인듯 실제로도 클래스 이름인데 왜 띄어쓰기가

ColliderContainsHandJointActiveState

손 관절이 콜라이더 내부에 있는지 확인하기 위해 테스트하는 IActiveState입니다. SphereCollider가 지정되면 그것의 반지름이 확인에 사용되며, 그렇지 않으면 스크립트는 콜라이더의 바운더리에 의존합니다. 이 클래스는 개발자가 포즈가 활성화되었을 때 손 관절이 특정 볼륨 내에 존재하는지 확인하려는 경우에 유용합니다.

HmdOffset

center eye에서 앵커되어야 하는 오브젝트에 부착할 수 있습니다. 위치 및 회전 오프셋을 지정할 수 있으며 롤, 피치 및 요를 토글하는 옵션도 지정할 수 있습니다. 이를 ColliderContainsHandJointActiveState와 결합하여 center eye를 기준으로 콜라이더를 배치할 수도 있습니다.

레퍼런스

손 자세 감지에 사용되는 컴포넌트에 대한 참조 정보는 다음 링크를 참조하세요.

다음 클래스들은 포즈 인식 시스템의 요소를 시각적으로 디버깅할 수 있게 해줍니다.

관련 주제

사용자 정의 손 포즈를 감지하는 방법을 알아보려면 Build a Custom Hand Pose를 참조하세요.

커스텀 손 포즈 만들기

🔗 이 부분은 Build a Custom Hand Pose을 바탕으로 합니다.

이 튜토리얼에서는 양손에 대한 엄지손가락 포즈를 구성하여 처음부터 사용자 정의 손 포즈를 만드는 방법을 배웁니다. 사용자 정의 손 포즈는 손가락 위치 및 손목 방향과 같은 실제 손의 특징에 의존하므로 컨트롤러 및 손으로서의 컨트롤러(controllers as hands)에서는 사용자 정의 손 포즈가 지원되지 않습니다. 포즈 인식 작동 방식에 대한 자세한 설명은 Hand Pose Detection.를 참조하세요.

사전 구축된 장면에서 포즈 인식을 시도하려면 PoseExamples 장면을 참조하세요.


엄지 척 포즈를 취하는 데 사용할 shape(엄지손가락을 펴고 모든 손가락을 닫음)와 transform(손목 위로).

시작하기 전에

Getting Started with Interaction SDK를 완수하세요.

손 Transform 데이터 얻기

손 트래킹은 손에 대한 transform 데이터를 제공합니다. 해당 데이터에 액세스하려면 각 손에 TransformFeatureStateProvider 컴포넌트를 추가하세요.

  1. 손을 설정할 Unity 씬을 엽니다.
  2. Hierarchy에서 OVRInteraction > OVRHands > LeftHand > HandFeaturesLeft를 선택합니다.
  3. 인스펙터에서 TransformFeatureStateProvider 컴포넌트를 추가합니다.
  4. RightHand > HandFeaturesRight에 대해 이 단계를 반복합니다.

손가락 임계값 설정하기

손가락 임계값은 손가락이 특정 상태(예: 구부린 상태 또는 열린 상태)에 있는 시기를 결정합니다. 이 포즈에서는 Interaction SDK에 포함된 기본값 임계값을 사용합니다.

  1. 별도의 Unity 창에서 Samples/Scenes/Examples/PoseExamples.unity 아래에 있는 PoseExamples 샘플 장면을 엽니다.
  2. Hierarchy에서 OVRCameraRig > OVRInteraction > OVRHands > LeftHand > HandFeaturesLeft를 선택합니다.
  3. Inspector에서 FingerFeatureStateProvider 컴포넌트 상단에 있는 수직 점 더보기 버튼을 선택합니다.
  4. 목록에서 Copy Component를 선택합니다.
  5. Unity 장면으로 돌아갑니다.
  6. Unity 장면의 Hierarchy에서 LeftHand > HandFeaturesLeft를 선택합니다.
  7. Inspector에서 Joints Radius Feature 컴포넌트 상단에 있는 수직 점을 더보기 버튼을 선택합니다. 옵션 목록이 나타납니다.
  8. 목록에서 Paste Component as New를 선택합니다.
    복사한 FingerFeatureStateProvider 컴포넌트가 HandFeaturesLeft에 새 컴포넌로 추가됩니다.
  9. FingerFeatureStateProvider 컴포넌에서 Hand 프로퍼티를 추적하려는 손인 LeftHand로 설정합니다.
  10. RightHand > HandFeaturesRight에 대해 이 단계를 반복합니다.

빈 게임오브젝트 생성

포즈는 고유한 컴포넌트 목록이 있는 빈 GameObject에 포함되어 있습니다.

  1. Hierarchy 아래에서 마우스 오른쪽 버튼을 클릭하고 Create Empty를 선택하여 빈 GameObject를 추가합니다.
  2. GameObject의 이름을 ThumbsUpPoseLeft로 지정합니다.
  3. Inspector에서 다음 컴포넌트들을 추가합니다.
    • ShapeRecognizerActiveState
    • TransformRecognizerActiveState
    • ActiveStateGroup
    • ActiveStateSelector
    • SelectorUnityEventWrapper
  4. 오른손에 대해 이 단계를 반복하고 해당 GameObject의 이름을 ThumbsUpPoseRight로 지정합니다.
  5. 이어서 다음 문단을 이용해 컴포넌트를 채우세요.

포즈의 Shape 정의(ShapeRecognizerActiveState)

엄지 척 포즈는 사전 정의된 두 가지 shape 에셋의 조합입니다. 하나는 모든 손가락이 완전히 닫혔는지 확인하고, 다른 하나는 엄지손가락이 완전히 펴졌는지 확인합니다.

  1. Hierarchy에서 ThumbsUpPoseLeft GameObject를 선택합니다.
  2. Inspector에서, ShapeRecognizerActiveState 컴포넌트에서 Hand 프로퍼티를 LeftHand로 설정합니다.
  3. Finger Feature State Provider 프로퍼티를 HandFeaturesLeft로 설정합니다.
  4. Shapes 프로퍼티에서 +를 두 번 클릭하여 두 요소를 목록에 추가합니다.
  5. 프로퍼티 텍스트박스의 원을 클릭하고 FingersAllClosed를 검색하여 Element 0을 FingersAllClosedShapeRecognizer 에셋으로 설정합니다.
  6. Element 1을 ThumbUpShapeRecognizer 에셋으로 설정합니다.
  7. ThumbsUpPoseRight GameObject에 대해 이 단계를 반복합니다.

포즈의 방향 정의(TransformRecognizerActiveState)

shape는 손의 방향을 확인하지 않으므로 현재 포즈는 엄지손가락을 위로 해도, 아래로 해도 표현될 수 있습니다. 비슷한 포즈 대신 엄지손가락이 위인 포즈를 확실히 하려면 손목이 월드 공간을 기준으로 위쪽을 향하도록 방향을 설정하세요.

  1. Hierarchy에서 ThumbsUpPoseLeft GameObject를 선택합니다.
  2. TransformRecognizerActiveState 컴포넌트에서 Hand 프로퍼티를 LeftHand로 설정합니다.
  3. Transform Feature State Provider를 HandFeaturesLeft로 설정합니다.
  4. Transform Feature Configs 드롭다운에서 Wrist Up를 선택합니다.
  5. Transform Config 아래의 Up Vector Type 드롭다운에서 World를 선택합니다.
  6. 프로퍼티의 텍스트 상자에서 원을 클릭하고 DefaultTransformFeatureStateThresholds를 검색하여 Feature Thresholds 프로퍼티를 DefaultTransformFeatureStateThresholds로 설정합니다.
  7. ThumbsUpPoseRight GameObject에 대해 이 단계를 반복합니다.

shape와 방향 결합(ActiveStateGroup)

포즈는 적어도 하나의 shape와 방향의 조합입니다. 엄지손가락 위로 포즈를 완전히 정의하려면 위에서 정의한 shape와 방향을 Active State Group에 결합합니다. 이 그룹은 추적된 손이 필요한 모든 shape와 방향과 일치할 때 활성화됩니다.

  1. Hierarchy에서 ThumbsUpPoseLeft GameObject를 선택합니다.
  2. Active State Group 컴포넌트에서 목록에 요소 두 개를 추가합니다.
  3. Element 0ThumbsUpPoseLeft GameObject로 설정합니다. 옵션 목록이 나타납니다.
  4. 목록에서 ShapeRecognizerActiveState를 선택합니다.
  5. Element 1ThumbsUpPoseLeft GameObject로 설정합니다. 옵션 목록이 나타납니다.
  6. 목록에서 TransformRecognizerActiveState를 선택합니다.
  7. ThumbsUpPoseRight GameObject에 대해 이 단계를 반복합니다.

포즈의 상태 추적(ActiveStateSelector)

ActiveStateSelector 컴포넌는 IActiveState를 추적하고 추적된 상태에 따라 WhenSelected 및 WhenUnselected 이벤트를 발생시킵니다. 이러한 이벤트는 Unity 인스펙터에 노출되지 않지만 대신 ISelector 인터페이스를 구동합니다. 이는 ActiveStateSelector가 ISelector를 가지는 모든 컴포넌트에 연결될 수 있음을 의미합니다. Inspector에서 이러한 이벤트를 연결하려면 이 컴포넌를 SelectorUnityEventWrapper로 래핑하세요.

  1. Hierarchy에서 ThumbsUpPoseLeft GameObject를 선택합니다.
  2. Active State Selector 컴포넌에서 Active State 프로퍼티를 ThumbsUpPoseLeft GameObject로 설정합니다. 옵션 목록이 나타납니다.
  3. 목록에서 ActiveStateGroup을 선택합니다.
  4. ThumbsUpPoseRight GameObject에 대해 이 단계를 반복합니다.

점화할 이벤트 선택(SelectorUnityEventWrapper)

ActiveStateSelector를 이 컴포넌트에 연결함으로서, Unity 이벤트는 인스펙터에 노출되고 Thumbs Up 포즈가 인식될 때마다 점화됩니다.

  1. Hierarchy에서 ThumbsUpPoseLeft GameObject를 선택합니다.
  2. Selector Unity Event Wrapper 컴포넌트에서 Selector 프로퍼티를 ThumbsUpPose GameObject로 설정합니다.
  3. When Selected() 목록이나 When Unselected() 목록에, 혹은 모두 다에 이벤트를 추가합니다.
  4. ThumbsUpPoseRight GameObject에 대해 이 단계를 반복합니다.

**Active State Debug Tree UI** 컴포넌트를 사용하여 왼손의 현재 상태를 표시하는 완성된 엄지 척 포즈.

관련 주제

  • 포즈를 감지하는 데 사용되는 개념과 구성 요소를 이해하려면 Hand Pose Detection를 참조하세요.
  • Active State의 개념에 대해 알아보려면 Active State Overview를 참조하세요.
  • Active State의 기본 사용법을 연습하려면 Use Active State을 참조하세요.
⚠️ **GitHub.com Fallback** ⚠️