Oculus Unity-Integration – Hand Pose Detection

이론이 필요없고 적용하는 과정이 궁금하다면 아래글로

Oculus Hand Pose Detection 연습

Oculus Hand Pose Detection

https://developer.oculus.com/documentation/unity/unity-isdk-hand-pose-detection/?ref=blog.immersive-insiders.com

Hand Pose Detection uses multiple components and configurators to detect hand poses.
손 포즈 감지는 여러 컴포넌트와 구성 요소를 사용하여 손의 동작을 감지하는 기술입니다.

A hand pose is defined by shapes and transforms.
이를 판단하기 위해 형태(shape)와 변환(transform)이라는 두 가지 요소를 사용합니다.

Shapes are boolean conditions about the required position of the hand’s finger joints.
형태는 손가락 관절의 위치에 대한 부울 조건을 나타냅니다.

Transforms are boolean conditions about the required orientation of the hand in the world space.
Transform은 세계 공간에서 손의 요구되는 방향에 대한 bool 조건입니다.

A pose is detected when the tracked hand matches that pose’s required shapes and transforms.
추적된 손이 해당 포즈의 요구 형태와 Transform이 일치할 때 포즈가 감지됩니다.

This topic explains poses, shape and transform recognition, and the criteria used to determine if a pose is detected.
이 글에서는 포즈, 형태 및 Transform 인식, 그리고 포즈가 감지되는지 여부를 결정하는 기준에 대해 설명합니다.

It also describes debug components you can use to visually debug poses.
시각적으로 포즈를 디버깅하기 위해 사용할 수 있는 debug components에 대해서도 설명합니다.

To learn how to detect a hand pose, see Build a Hand Pose Recognizer. (나중에 링크)
손 포즈를 감지하는 방법을 알아보려면 “손 포즈 인식기 만들기”를 참조하세요.

Pose Prefabs

Interaction SDK includes 6 ready to use example pose prefabs.
Interaction SDK에는 6개의 준비된 예제 포즈 프리팹이 포함되어 있습니다.

You can define your own poses using the patterns defined in these prefabs.
이러한 프리팹에서 정의된 패턴을 사용하여 직접 포즈를 정의할 수 있습니다.

You can experiment with pose detection using these pose prefabs in the PoseExamples sample scene.
PoseExamples 샘플 씬에서 이러한 포즈 prefab을 사용하여 포즈 감지를 실험해 볼 수 있습니다.

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

Each pose prefab has these components:
각 pose prefab에는 다음과 같은 구성 요소가 있습니다

A HandRef is a component that takes an IHand as input.
HandRefIHand를 입력 값으로 받는 component입니다.

The other components on this prefab will read hand state via this reference.
이 프리팹의 다른 컴포넌트들은 이 참조를 통해 손의 상태를 읽습니다.

ShapeRecognizerActiveState is a component that becomes active when the criteria of a specified Shape is met.
ShapeRecognizerActiveState는 지정된 형태의 조건이 충족되면 활성화되는 component입니다.

TransformRecognizerActive is a component that becomes active when a transform feature, such as a particular wrist orientation, is detected.
TransformRecognizerActive은 특정 손목 방향과 같은 변환 기능이 감지되었을 때 활성화되는 component입니다.

ActiveStateGroup is a component that returns true when all dependent ActiveStates are true.
ActiveStateGroup은 종속적인 ActiveState가 모두 true일 때 true를 반환하는 컴포넌트입니다.

ActiveStateSelector and SelectorUnityEventWrapper are components that can invoke events when a pose is detected.
ActiveStateSelectorSelectorUnityEventWrapper는 포즈가 감지되었을 때 이벤트를 호출할 수 있는 component입니다.

A pose includes required transforms (which are bundled in TransformRecognizerActiveState) and shapes (which are bundled in ShapeRecognizerActiveState).
한 pose에는 필요한 transforms(이는 TransformRecognizerActiveState에서 묶여 있음)와 shapes(이는 ShapeRecognizerActiveState에서 묶여 있음)가 포함됩니다.

These are combined using ActiveStateGroup to define the pose.
이들은 ActiveStateGroup을 사용하여 결합되어 pose를 정의합니다.

wrist up => 손목을 위로 향하게

ShapeRecognizer

Poses include one or more shapes.
포즈에는 하나 이상의 형태가 포함됩니다.

A shape is a set of boolean conditions about the position of one or more fingers.
형태는 하나 이상의 손가락 위치에 대한 boolean 조건의 집합입니다.

The conditions are defined using Finger Features states.
이러한 조건은 Finger Features 상태를 사용하여 정의됩니다.

If a tracked hand meets these conditions, then the shape becomes active.
추적된 손이 이러한 조건을 충족하면 형태가 활성화됩니다.

If all the shapes in the pose are active and the transform is also active, the pose is detected.
포즈의 모든 형태가 활성화되고 변형도 활성화된 경우, 포즈가 감지됩니다.

A pose’s shapes are stored as ShapeRecognizer assets in the pose’s ShapeRecognizerActiveState component.
포즈의 형태는 포즈의 ShapeRecognizerActiveState component에 저장되는 ShapeRecognizer 자산으로 저장됩니다.

ShapeRecognizerActiveState

ShapeRecognizerActiveState takes a hand, the current state of the hand’s fingers, and a list of shape configs.
ShapeRecognizerActiveState 는 손, 손 손가락의 현재 상태 및 셰이프 구성 목록을 사용합니다.

To get the current state of the fingers, it uses the method to retrieve the FingerFeatureStateProvider component from the hand.
손가락의 현재 상태를 가져오기 위해 이 메서드를 사용하여 손에서 FingerFeatureStateProvider 구성 요소를 검색합니다.

If the state of every finger matches the states in the listed shapes, ShapeRecognizerActiveState becomes active. 
모든 손가락의 상태가 나열된 도형의 상태와 일치하면 ShapeRecognizerActiveState가 활성화됩니다.

ShapeRecognizerActiveState implements the IActiveState interface.GetHandAspect
Shape RecognizerActiveState는 the IActiveState interface.GetHandAspect를 구현합니다

PropertyDescription
HandHand Ref component. Determines which hand is read for state data.
Hand Ref 구성 요소입니다. 데이터를 읽을 Hand를 결정합니다.
Finger Feature State ProviderFingerFeatureStateProvider component, which provides the current state of the tracked hand’s fingers.
추적된 손 손가락의 현재 상태를 제공하는 FingerFeatureStateProvider 구성 요소입니다.
ShapesA list of shape configs (ShapeRecognizer assets) that define the pose.
포즈를 정의하는 셰이프 구성(ShapeRecognizer 자산)의 목록입니다.

The states in these shape configs are compared to the finger states from the Finger Feature State Provider property.
 이러한 셰이프 구성의 상태는 Finger Feature State Provider 속성의 손가락 상태와 비교됩니다.

ShapeRecognizer

ShapeRecognizer is a that defines a shape.
ShapeRecognizer는 도형을 정의하는 것입니다.

To define a shape, it uses a set of rules called Feature Configs.
 shape를 정의하기 위해 Feature Configs라는 rules을 사용합니다.

Feature Configs specify a required position (state) for each of the five fingers.
기능 구성은 다섯 손가락 각각에 필요한 위치(상태)를 지정합니다.

Feature Configs define state using at least one of the Finger Features: Curl, Flexion, Abduction, and Opposition. 
기능 구성은 손가락 기능(Curl, Flexion, Abduction, Opposition) 중 하나 이상을 사용하여 상태를 정의합니다.

ShapeRecognizer is referenced by the ShapeRecognizerActiveState component to determine if a pose is active.ScriptableObject
ShapeRecognizer는 ShapeRecognizerActiveState 구성 요소에서 참조하여 포즈가 활성 상태인지 확인합니다.ScriptableObject

FingerFeatureStateProvider

Finger Feature State Provider provides the finger states of the tracked hands and contains the state transition thresholds for each finger.
손가락 기능 상태 공급자는 추적된 손의 손가락 상태를 제공하고 각 손가락에 대한 상태 전환 임계값을 포함합니다.

It’s referenced by the ShapeRecognizerActiveState component.
ShapeRecognizerActiveState 구성 요소에서 참조합니다.

PropertyDescription
HandThe Hand component to use for finger state data.
손가락 상태 데이터에 사용할 Hand 구성 요소입니다.
Finger State ThresholdsA list of five elements, one for each finger.
각 손가락에 하나 씩 5개의 요소 목록입니다.

Each element has two properties, a Finger (Thumb, Index, Middle, Ring, Pinky), and a State Thresholds (FingerFeatureStateThresholds).
각 요소에는 Finger(Thumb, Index, Middle, Ring, Pinky)와 State Thresholds(FingerFeatureStateThresholds)의 두 가지 속성이 있습니다.

FingerFeatureStateThresholds

FingerFeatureStateThresholds is a that defines the state thresholds for each Finger Feature.
FingerFeatureStateThresholds는 각 손가락 특징에 대한 상태 임계값을 정의하는 것입니다.

A state threshold is a set of boundaries that determine when a finger has transitioned between states.
 state threshold 는 손가락이 상태 간에 전환된 시기를 결정하는 경계 집합입니다. 

For example, the curl feature has 3 states: Open, Neutral, and Closed.
예를 들어 curl 기능에는 3가지 상태(Open, Neutral 및 Closed)가 있습니다.

So the state thresholds for curl use an angle in degrees to define when the finger’s state has changed from Open to Neutral, Neutral to Closed, or vice-versa.ScriptableObject
따라서 curl의 상태 임계값은 각도(도)를 사용하여 손가락의 상태가 열림에서 보통으로, 보통에서 닫힘으로 또는 그 반대로 변경된 시기를 정의합니다.ScriptableObject

Interaction SDK provides four sets of default state thresholds, which are under :DefaultSettings/PoseDetection
Interaction SDK는 아래에 있는 4개의 기본 상태 임계값 집합을 제공합니다.DefaultSettings/PoseDetection

  • DefaultThumbFeatureStateThresholds (for the thumb)(엄지 손가락의 경우)
  • IndexFingerFeatureStateThresholds (for the Index finger)(집게 손가락의 경우)
  • MiddleFingerFeatureStateThresholds (for the Middle finger)(가운데 손가락의 경우)
  • DefaultFingerFeatureStateThresholds (for the Ring & Pinky fingers)(약지 및 새끼손가락용)

The thumb’s curl state threshold.
엄지 손가락의 curl 상태 임계값입니다.

For curl, the value is an angle in degrees.
curl의 경우 값은 각도(도)입니다.

PropertyDescription
Min Time In StateHow long the value must be in the new state before the feature will actually change to that state.
기능이 실제로 해당 상태로 변경되기 전에 값이 새로운 상태에 있어야 하는 기간입니다. 

This is to prevent rapid flickering at transition edges.
이는 전환 가장자리에서 빠른 깜박임을 방지하기 위한 것입니다. 

This value applies to all features.
이 값은 모든 기능에 적용됩니다.
Expected Value RangeA rough guide that indicates what range of motion the average human will be able to achieve.
평균적인 인간이 달성할 수 있는 동작 범위를 나타내는 대략적인 가이드입니다.
MidpointThe value at which a state will transition from A > B (or B > A).
상태가 A에서 B(또는 B> A)> 전환되는 값입니다.
WidthHow far the value must exceed the midpoint until the transition can occur.
전환이 발생할 수 있을 때까지 값이 중간점을 초과해야 하는 거리입니다.

This is to prevent rapid flickering at transition edges.
이는 전환 가장자리에서 빠른 깜박임을 방지하기 위한 것입니다.
FingerFeatureStateThresholds Example

Given the transition between two states, A <> B:
두 상태 간의 전환할 때 A<> B는 다음과 같습니다.

If the current state is “A”, to transition up to “B” then the angle must rise above the midpoint for that pairing by at least (width / 2.0) for “Min Time In State” seconds.
현재 상태가 “A”인 경우 “B”로 전환하려면 각도가 “Min Time In State” 초 동안 해당 페어링의 중간점 이상으로 최소(너비/2.0) 상승해야 합니다.

If the current state is “B”, to transition down to “A” then the angle must drop below the midpoint for that pairing by at least (width / 2.0) for “Min Time In State” seconds.
현재 상태가 “B”인 경우 “A”로 전환하려면 각도가 “Min Time In State” 초 동안 해당 페어링의 중간점 아래로 최소(너비 / 2.0) 떨어져야 합니다.

So for Curl, to transition:
따라서 Curl의 경우 전환하려면 다음을 수행하십시오:

  • From Open > Neutral: value must be above 195 for 0.0222 seconds
  • From Neutral > Open: value must be below 185 for 0.0222 seconds
  • From Neutral > Closed: value must be above 210 for 0.0222 seconds
  • From Closed > Neutral: value must be below 200 for 0.0222 seconds
  • 개방에서 중립>: 값은 195.0초 동안 0222보다 커야 합니다.
  • 중립에서 시>까지: 값은 185.0초 동안 0222 미만이어야 합니다.
  • 중립에서 닫힘으로>: 값은 210.0초 동안 0222보다 커야 합니다.
  • 닫힘에서 중립>: 값은 200.0초 동안 0222 미만이어야 합니다.

Finger Features

Finger Features are specific finger positions that let you define a shape. There are four features:
손가락 기능은 모양을 정의할 수 있는 특정 손가락 위치입니다. 네 가지 기능이 있습니다.

  • Curl
  • Flexion
  • Abduction
  • Opposition
Curl

Represents how bent the top two joints of the finger or thumb are.
손가락 또는 엄지손가락의 위쪽 두 관절이 얼마나 구부러졌는지를 나타냅니다.

This feature doesn’t take the Proximal (knuckle) joint into consideration.
이 기능은 근위부(너클) 조인트를 고려하지 않습니다.

States:

  • Open: Fingers are fully extended straight.
  • Neutral: Fingers are slightly curled inwards, as if they were wrapped around a coffee mug.
  • Closed (pictured): Fingers are tightly curled inwards such that the tips are almost touching the palm.
  • 열림: 손가락을 완전히 똑바로 뻗습니다.
  • 중립: 손가락이 마치 커피 머그잔을 감싼 것처럼 안쪽으로 약간 말려 있습니다.
  • 닫힘 (사진) : 손가락이 안쪽으로 단단히 말려서 끝이 손바닥에 거의 닿을 정도입니다.

The joints used to measure the curl feature.
컬 형상을 측정하는 데 사용되는 조인트.

Flexion

The extent that the Proximal (knuckle) joint is bent.
근위부(너클) 관절이 구부러진 정도. 

Flexion is only reliable on the 4 fingers.
굴곡은 4개의 손가락에서만 신뢰할 수 있습니다.  (엄지 X )

It can provide false positives on the thumb.
이것은 엄지 손가락에 잘못된 긍정을 제공 할 수 있습니다.

States:

  • Open: The first bone on the fingers is fully extended and is parallel to the palm.
  • Neutral: Somewhat bent.
  • Closed: Knuckle joint is fully bent (pictured).
  • 열림: 손가락의 첫 번째 뼈가 완전히 확장되고 손바닥과 평행합니다.
  • 중립: 약간 구부러져 있습니다.
  • 닫힘: 너클 조인트가 완전히 구부러져 있습니다(사진).

Warning

Flexion is only reliable on the 4 fingers.
굴곡은 4개의 손가락에서만 신뢰할 수 있습니다.

It can provide false positives on the thumb.
엄지 손가락에 잘못된 긍정을 제공 할 수 있습니다.

Four fingers bent perpendicular to the palm

An example of flexion where the knuckle joint is in the Closed state.
너클 관절이 닫힌 상태인 굴곡의 예.

Abduction

The angle between two adjacent fingers, measured at the base of those two fingers.
인접한 두 손가락 사이의 각도로, 두 손가락의 밑면에서 측정됩니다.

Abduction measures the angle between the given finger and the adjacent finger that’s closer to the pinky.
외전은 주어진 손가락과 새끼 손가락에 더 가까운 인접한 손가락 사이의 각도를 측정합니다.

For example, Abduction for the index finger is the angle between the index and middle finger.
예를 들어, 집게 손가락의 외전은 집게 손가락과 가운데 손가락 사이의 각도입니다.

States:

  • Open The two fingers are spread apart (pictured for index).
  • Closed: The two fingers are tightly compressed together (pictured for thumb, middle, ring).
  • None: Not currently used.
  • 열다 두 손가락이 벌어져 있습니다(인덱스 사진).
  • 닫힘: 두 손가락이 함께 단단히 압축됩니다(엄지, 가운데, 반지 사진).
  • 없음: 현재 사용되지 않습니다.

Note

Abduction on Pinkie is not supported.
핑키의 외전은 지원되지 않습니다. (새끼 손가락)

An example of abduction.
The index finger is in the Open state.
집게 손가락이 열린 상태입니다.

The thumb, middle, and ring fingers are in the Closed state.
엄지, 중지, 약지가 닫힌 상태입니다.

Opposition

How close a given fingertip is to the thumb tip.
주어진 손가락 끝이 엄지 손가락 끝에 얼마나 가까운지.

Can only be used on index, middle, ring, and pinky fingers.
검지, 중지, 약지, 새끼손가락에만 사용할 수 있습니다.

States:

  • Touching: The fingertip joints are within ~1.5cm (pictured for index).
  • Near: The fingertip joints are between ~1.5cm and ~15cm apart.
  • None: The fingertip joints are greater than ~15cm apart.
  • 만지기: 손가락 끝 관절은 ~1.5cm 이내입니다(인덱스 사진).
  • 근거리: 손가락 끝 관절은 ~1.5cm에서 ~15cm 떨어져 있습니다.
  • 없음: 손가락 끝 관절이 ~15cm 이상 떨어져 있습니다.

An example of opposition. The index finger is in the Touching state.
반대의 예. 집게 손가락이 Touching 상태입니다.

Transform Recognition

Poses consist of one or more transforms.
포즈는 하나 이상의 변환으로 구성됩니다.

The transform of the hand only represents the orientation and position.
손의 변형은 방향과 위치만 나타냅니다.

The orientation is only evaluated relative to the WristUp, WristDown, PalmDown, PalmUp, PalmTowardsFace, PalmsAwayFromFace, FingersUp, FingersDown, and PinchClear transforms.
방향은 WristUp, WristDown, PalmDown, PalmUp, PalmTowardsFace, PalmsAwayFromFace, FingersUp, FingersDown 및 PinchClear 변환을 기준으로만 평가됩니다.

A pose’s required transforms are listed in the pose’s TransformRecognizerActiveState component.
포즈의 필수 변환은 포즈의 TransformRecognizerActiveState 구성 요소에 나열됩니다. 

During hand tracking, the hand’s transforms are compared to the pose’s transforms.
핸드 트래킹 중에 손의 변형이 포즈의 변형과 비교됩니다.

If both sets of transforms match and all the shapes in the pose are active, then the pose is detected.
두 변환 집합이 모두 일치하고 포즈의 모든 shape가 활성 상태이면 포즈가 감지됩니다.

The axes that define the hand’s fingers, wrist, and palm.
손의 손가락, 손목 및 손바닥을 정의하는 축입니다.

TransformRecognizerActiveState

TransformRecognizerActiveState takes a hand, the current state of the hand’s transforms, and a list of transform feature configs, and a transform config.
TransformRecognizerActiveState 는 손 변환의 현재 상태, 변환 기능 구성 목록 및 변환 구성을 사용합니다.

To get the current state of the hand’s transforms, it uses the method to retrieve the TransformFeatureStateProvider component.
손 변환의 현재 상태를 가져오기 위해 method를 사용하여 TransformFeatureStateProvider 구성 요소를 검색합니다.

That component reads the raw feature values and quantizes them into TransformFeatureStates using the Transform Config you provide in this component.GetHandAspect
이 구성 요소는 raw 기능 값을 읽고 이 구성 요소에서 제공하는 변환 구성을 사용하여 TransformFeatureStates로 정량화 합니다.GetHandAspect

PropertyDescription
HandHand Ref component. Determines which hand is read for state data.
Hand Ref 구성 요소입니다. 상태 데이터를 읽을 핸드를 결정합니다.
Transform Feature State ProviderA TransformFeatureStateProvider component, which provides the current state of the tracked hand’s transforms.
추적된 손 변환의 현재 상태를 제공하는 TransformFeatureStateProvider 구성 요소입니다.
Transform Feature ConfigsA list of required transforms that the tracked hand must match for the pose to become active (assuming all shapes are also active).
포즈가 활성화되기 위해 추적된 손이 일치해야 하는 필수 변환 목록입니다(모든 셰이프도 활성 상태라고 가정).

Each transform is an orientation and a boolean (ex. PalmTowardsFace is True.)
각 변환은 방향과 부울입니다(예: PalmTowardsFace는 True임).
Transform ConfigSee TransformConfig.
TransformConfig를 참조하세요.

TransformFeatureStateProvider

TransformFeatureStateProvider provides the transform states of the tracked hand.
TransformFeatureStateProvider는 추적된 손의 변환 상태를 제공합니다.

It’s referenced by the TransformRecognizerActiveState component.
TransformRecognizerActiveState 구성 요소에서 참조합니다.

PropertyDescription
HandThe Hand component to use for finger state data.
손가락 상태 데이터에 사용할 Hand 구성 요소입니다.
HmdThe Hmd component.
Hmd 구성 요소입니다.
Tracking to World TransformerThe OVRInteraction GameObject from Set up Camera Rig.
OVR카메라 릭 셋업의 내부 액션 게임 오브젝트입니다.

TransformConfig

Transform Config influences state transitions computed via TransformFeatureStateProvider.
변환 구성은 TransformFeatureStateProvider를 통해 계산된 상태 전환에 영향을 줍니다.

It implements the IActiveState interface and becomes active whenever all of the listed transform states are active.
IActiveState 인터페이스를 구현하고 나열된 모든 변환 상태가 활성화될 때마다 활성화됩니다.

Its Feature Thresholds property takes a , TransformFeatureStateThresholds, that defines the transform feature thresholds for each orientation.
해당 Feature Thresholds 속성은 각 방향에 대한 변환 기능 임계값을 정의하는 TransformFeatureStateThresholds를 사용합니다.

The transform feature thresholds use the same properties as the FingerFeatureStateThresholds.ScriptableObject
변환 기능 임계값은 FingerFeatureStateThresholds와 동일한 속성을 사용합니다.ScriptableObject

Note

Once you register a specific configuration, the method can then query the state of each state tracked for configuration.
특정 구성을 등록하면 메서드는 구성을 위해 추적된 각 상태의 상태를 쿼리할 수 있습니다.

It leverages FeatureStateProvider to drive state-changing logic.RegisterConfig
FeatureStateProvider를 활용하여 상태 변경 논리를 구동합니다.RegisterConfig

Velocity Recognition

Velocity recognition components detect motion, whereas shape recognition only detects static poses.
속도 인식 구성 요소는 동작을 감지하는 반면 모양 인식은 정적 포즈만 감지합니다.

For example, shape recognition can detect a hand in a thumbs-up pose,
예를 들어 모양 인식은 엄지손가락을 위로 올리는 포즈에서 손을 감지할 수 있지만

but cannot determine if the hand is moving upward while in that pose.
해당 포즈에서 손이 위로 움직이는지 여부는 확인할 수 없습니다.

There are two velocity recognition components.
속도 인식 구성 요소에는 두 가지가 있습니다. 

Both components get joint data from the JointDeltaProvider component.
두 구성 요소 모두 JointDeltaProvider 구성 요소에서 조인트 데이터를 가져옵니다.

  • JointVelocityActiveState tracks velocities (position deltas over the last two frames) for a list of joints and compares them to a velocity target along the provided axes.
    JointVelocityActiveState는 조인트 목록에 대한 속도(마지막 두 프레임에 대한 위치 델타)를 추적하고 제공된 축을 따라 속도 목표와 비교합니다. 

    If the velocity target (units per second) is met for the minimum time threshold, the state becomes Active.
    속도 목표(초당 단위)가 최소 시간 임계값에 충족되면 상태가 활성이 됩니다.
  • JointRotationActiveState tracks angular velocities (rotation deltas over the last two frames) for a list of joints and compares them to a rotation target around the provided axes.
    JointRotationActiveState는 조인트 목록에 대한 각속도(마지막 두 프레임의 회전 델타)를 추적하고 제공된 축 주위의 회전 대상과 비교합니다.

    If the rotation target (degrees per second) is met for the minimum time threshold, the state becomes Active.
    최소 시간 임계값에 대해 회전 목표(초당 도)가 충족되면 상태가 활성이 됩니다.

Sequences

IActiveState components can be chained together using the Sequence component.
IActiveState 구성 요소는 Sequence 구성 요소를 사용하여 함께 연결할 수 있습니다. 

Because Sequences can recognize a series of IActiveStates over time, they can be used to compose complex gestures.
시퀀스는 시간이 지남에 따라 일련의 IActiveStates를 인식할 수 있으므로 복잡한 제스처를 작성하는 데 사용할 수 있습니다.

For examples of complex gestures, see the GestureExamples sample scene.
복잡한 제스처의 예는 GestureExamples 샘플 장면을 참조하세요.

Sequence Classes

Sequence takes a list of ActivationSteps and iterates through them as they become active.
Sequence는 ActivationSteps의 목록을 가져와서 활성화될 때 반복합니다.

Each ActivationStep consists of an IActiveState, a minimum active time, and a maximum step time.
ActivationStep은 IActiveState, 최소 활성 시간 및 최대 단계 시간으로 구성됩니다.

These steps function as follows:

  • The IActiveState must be active for at least the minimum active time before the Sequence proceeds to the next step.
  • If an IActiveState is active for longer than the maximum step time, the step will fail and the Sequence will restart.
  • IActiveState는 시퀀스가 다음 단계로 진행하기 전에 최소 활성 시간 이상 활성 상태여야 합니다.
  • IActiveState가 최대 단계 시간보다 오래 활성 상태이면 단계가 실패하고 시퀀스가 다시 시작됩니다.

Once the final ActivationStep in the Sequence has completed, the Sequence becomes active.
시퀀스의 마지막 ActivationStep이 완료되면 시퀀스가 활성화됩니다.

If an optional KeepActiveWhile IActiveState has been provided, the Sequence will remain active as long as KeepActiveWhile is active.
선택적 KeepActiveWhile IActiveState가 제공된 경우 KeepActiveWhile이 활성화되어 있는 한 시퀀스는 활성 상태로 유지됩니다.

The last phase of a Sequence is the optional cooldown phase, the duration of which can be set in the RemainActiveCooldown field.
시퀀스의 마지막 단계는 선택적 휴지 단계이며, 지속 시간은 RemainActiveCooldown 필드에서 설정할 수 있습니다.

Sequence that is deactivating will wait for this cooldown timer to elapse before finally becoming inactive.
비활성화 중인 시퀀스는 이 재사용 대기시간 타이머가 경과할 때까지 기다렸다가 최종적으로 비활성화됩니다.

SequenceActiveState is an IActiveState wrapper for a Sequence, and can either report active once the Sequence has started, once the Sequence steps have finished, or both.
SequenceActiveState는 시퀀스에 대한 IActiveState 래퍼이며, 시퀀스가 시작되거나, 시퀀스 단계가 완료되거나, 둘 다 활성으로 보고될 수 있습니다.

Debugging Pose Recognition (포즈 인식 디버깅)

The following classes let you visually debug elements of the pose recognition system.
다음 클래스를 사용하면 포즈 인식 시스템의 요소를 시각적으로 디버깅할 수 있습니다.

ActiveStateDebugTree

Builds a visual representation of an IActiveState tree on a UI canvas, based on a provided root IActiveState.
제공된 루트 IActiveState를 기반으로 UI 캔버스에서 IActiveState 트리의 시각적 표현을 빌드합니다.

Two different node layout types are provided, ActiveStateDebugTreeHorizontal (for a left-to-right representation) and **ActiveStateDebugTreeVertical **(for a more compact top to bottom tree view).
ActiveStateDebugTreeHorizontal(왼쪽에서 오른쪽 표현용) 및 ActiveStateDebugTreeVertical(보다 간결한 위에서 아래쪽 트리 보기)의 두 가지 노드 레이아웃 유형이 제공됩니다.

FingerFeatureSkeletalDebugVisual

Uses a line renderer to indicate if a finger feature is active on a specific finger (green) or not (red).
라인 렌더러를 사용하여 손가락 기능이 특정 손가락에서 활성화되어 있는지(녹색) 또는 활성화되지 않았는지(빨간색)를 나타냅니다.

HandShapeSkeletalDebugVisual

Creates a series of FingerFeatureSkeletalDebugVisuals for the features belonging to a ShapeRecognizerActiveState.
ShapeRecognizerActiveState에 속하는 기능에 대한 일련의 FingerFeatureSkeletalDebugVisuals를 만듭니다.

TransformFeatureDebugVisual

Changes the color of a target renderer to green if the specific TransformFeatureState is active; red if not.
특정 TransformFeatureState가 활성 상태인 경우 대상 렌더러의 색을 녹색으로 변경합니다. 그렇지 않은 경우 빨간색.

TransformFeatureVectorDebugParentVisual

Creates vector debug views for the FeatureStates belonging to a TransformRecognizerActiveState; one vector for the feature and another vector for the hand.
TransformRecognizerActiveState에 속하는 FeatureStates에 대한 벡터 디버그 뷰를 만듭니다. 하나의 벡터는 기능에 대한 것이고 다른 하나는 손에 대한 벡터입니다.

When both vectors are visualized, one can see how close the (blue) hand vector is to the (black) feature vector that it is being tested against in TransformFeatureValueProvider.
두 벡터를 모두 시각화하면 손 벡터(파란색)가 TransformFeatureValueProvider에서 테스트 중인 (검은색) 기능 벡터에 얼마나 가까운지 확인할 수 있습니다.

TransformFeatureVectorDebugVisual

Uses a line renderer to visualize a simple vector.
라인 렌더러를 사용하여 간단한 벡터를 시각화합니다.

TransformRecognizerDebugVisual

Creates a series of TransformFeatureDebugVisuas to visually debug the TransformFeatureStates belonging to a collection of TransformRecognizerActiveState.
TransformRecognizerActiveState 컬렉션에 속하는 TransformFeatureStates를 시각적으로 디버깅하기 위해 일련의 TransformFeatureDebugVisuas를 만듭니다.

This allows one to visually debug the active state of each transform feature via the created instances of TransformFeatureDebugVisual.
이렇게 하면 TransformFeatureDebugVisual의 생성된 인스턴스를 통해 각 변환 기능의 활성 상태를 시각적으로 디버그할 수 있습니다.

JointRotationDebugVisual

Renders lines along the rotation axes tracked by the JointRotationActiveState.
JointRotationActiveState에 의해 추적되는 회전 축을 따라 선을 렌더링합니다.

Lines are red while not rotating along that axis, and they fill up yellow as rotation amount increases toward the target, at which point they become green.
선은 해당 축을 따라 회전하지 않는 동안 빨간색으로 표시되며, 대상을 향해 회전량이 증가함에 따라 노란색으로 채워지며, 이때 녹색이 됩니다.

JointVelocityDebugVisual

Renders lines along the velocity axes tracked by the JointVelocityActiveState.
JointRotationActiveState에 의해 추적되는 회전 축을 따라 선을 렌더링합니다. 

Lines are red while not moving along that axis, and they fill up yellow as velocity increases toward the target, at which point they become green.
선은 해당 축을 따라 회전하지 않는 동안 빨간색으로 표시되며, 대상을 향해 회전량이 증가함에 따라 노란색으로 채워지며, 이때 녹색이 됩니다.

Internal Implementation Classes

The classes described here implement the underlying functionality, but will not need to be modified in order to use Pose Recognition.
여기에 설명된 클래스는 기본 기능을 구현하지만 포즈 인식을 사용하기 위해 수정할 필요는 없습니다.

FeatureStateProvider

A generic helper class that keeps track of the current state of features, and uses thresholds to determine state changes.
기능의 현재 상태를 추적하고 임계값을 사용하여 상태 변경을 확인하는 제네릭 도우미 클래스입니다.

The class uses buffers to state changes to ensure that features do not switch rapidly between states.
이 클래스는 버퍼를 사용하여 상태 변경이 상태 간에 빠르게 전환되지 않도록 합니다.

FeatureStateThresholdsEditor

A generic editor class that defines the look and feel of dependent editor classes such as FingerFeatureStateThresholdsEditor and TransformStatesThresholdsEditor.
FingerFeatureStateThresholdsEditor 및 TransformStatesThresholdsEditor와 같은 종속 편집기 클래스의 모양과 느낌을 정의하는 제네릭 편집기 클래스입니다.

FeatureDescriptionAttribute

Lets you define editor-visible descriptions and hints and values to aid users in setting thresholds for features.
사용자가 기능에 대한 임계값을 설정하는 데 도움이 되도록 편집기에서 볼 수 있는 설명과 힌트 및 값을 정의할 수 있습니다.

IFeatureStateThreshold

IFeatureStateThreshold is a generic interface that defines the functionality of all thresholds used in hand pose detection.
IFeatureStateThreshold는 손 자세 감지에 사용되는 모든 임계값의 기능을 정의하는 제네릭 인터페이스입니다.

IFeatureStateThresholds

Defines a collection of IFeatureStateThresholds, specific to a feature type, whether that is finger features or transform features.
손가락 기능이든 변환 기능이든 기능 형식과 관련된 IFeatureStateThresholds의 컬렉션을 정의합니다.

IFeature Thresholds

Provides an interface to a collection of IFeatureStateThresholds as well as MinTimeInState (i.e. a minimum threshold of time a feature can be in a certain state before transitioning to another state).
IFeatureStateThresholds 및 MinTimeInState 컬렉션에 대한 인터페이스를 제공합니다(즉, 다른 상태로 전환하기 전에 기능이 특정 상태에 있을 수 있는 최소 임계값).

ColliderContainsHandJointActiveState

An IActiveState that tests to see if a hand joint is inside a collider.
손 관절이 콜라이더 내부에 있는지 테스트하는 IActiveState입니다.

If a SphereCollider is specified then its radius is used for checking, otherwise the script relies on the collider’s bounds.
SphereCollider가 지정되면 해당 반경이 검사에 사용되고, 그렇지 않으면 스크립트가 콜라이더의 경계에 의존합니다. 

This class is useful in case a developer wishes to see if the hand joint exists within a certain volume when a pose is active.
이 클래스는 개발자가 포즈가 활성 상태일 때 손 관절이 특정 볼륨 내에 존재하는지 확인하려는 경우에 유용합니다.

HmdOffset

Can be attached to an object that needs to be anchored from the center eye.
중앙 눈에서 고정해야 하는 물체에 부착할 수 있습니다.

Position and rotation offsets can be specified, along with options to toggle the roll, pitch and yaw of the latter.
위치 및 회전 오프셋을 지정할 수 있으며, 후자의 롤, 피치 및 요를 토글하는 옵션도 지정할 수 있습니다.

One can combine this with a ColliderContainsHandJointActiveStateto position a collider relative to the center eye.
이를 ColliderContainsHandJointActiveState와 결합하여 중심 눈을 기준으로 콜라이더를 배치할 수 있습니다.

“Oculus Unity-Integration – Hand Pose Detection”에 대한 1개의 생각

  1. 핑백: Oculus Hand Pose Detection 연습 - 어제와 내일의 나 그 사이의 이야기

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤