reckfellENGINE

XRHandTracker

Hand-joint data and separate validity flags.

On this page
class XRHandTrackerReckfellSharpInherits XRPositionalTracker

XRHandTracker stores 26 hand joints. Check tracker availability, whole-hand HasTrackingData and each required joint’s flags separately. VALID differs from TRACKED; a valid estimate is not necessarily directly tracked. A new hand has Type=Hand and Hand=Left but connects no device.

Confirmed constructor defect: initial joint flags are uninitialized. A custom provider must populate them before enabling HasTrackingData. Gameplay reads real-provider data and must not alter flags to bypass checks. Data loss does not clear retained transforms or velocities.

In OpenXR joint transforms are tracking-space values with Humanoid orientation adjustment, not relative to the preceding bone. Radius is meters with PositionValid. Getters do not validate usability for you. HandTrackingSource=Unknown does not establish an optical source; selecting a source creates no gestures or actions.

Synthetic data and the pinch example were checked, not real tracking or model animation. Complete example, setup and diagnosis: hand tracking.

Declarations checked against C# SDK 1.0.0. Expand a name to see declarations and documentation.

Constructors1

XRHandTrackerConstructor
# XRHandTracker
C#
public XRHandTracker();

Creates a hand container: Type=Hand, Hand=Left, HasTrackingData=false, source Unknown. Defect: the joint-flag array is uninitialized. A new hand is not valid provider data: a custom provider must fill flags and values before enabling data. Does not automatically register a device.

Properties2

HandTrackingSourceProperty
# HandTrackingSource
C#
public XRHandTracker.HandTrackingSourceEnum HandTrackingSource { get; set; }

Data source, initially Unknown. Unobstructed and Controller describe the reported kind, NotTracked denotes no tracking; availability depends on the provider. Unknown does not establish optical tracking. The setter changes neither HasTrackingData nor joint flags.

HasTrackingDataProperty
# HasTrackingData
C#
public bool HasTrackingData { get; set; }

Whole-hand data flag, initially false. The setter changes only it: populates no joint flags/transforms and creates no default pose. Joint values remain when false but must not drive interactions. The provider owns real-hand state, not gameplay code.

Methods14

GetHandJointAngularVelocityVector3
# GetHandJointAngularVelocity
C#
public Vector3 GetHandJointAngularVelocity(XRHandTracker.HandJoint joint);

Returns stored angular velocity. Use requires AngularVelocityValid; the getter applies neither reference frame nor WorldScale.

Parameters
NameTypeDefault
jointXRHandTracker.HandJoint—
joint

One of 26 HandJoint values, Palm…PinkyFingerTip. Max is the bound, not a valid joint.

Returns Vector3

Stored angular velocity; check its flag.

GetHandJointFlagsXRHandTracker.HandJointFlags
# GetHandJointFlags
C#
public XRHandTracker.HandJointFlags GetHandJointFlags(XRHandTracker.HandJoint joint);

Reads joint validity/tracking bits. Before provider initialization values can be arbitrary because of the constructor defect. VALID is not TRACKED. Check HasTrackingData and required bits; velocities have separate bits.

Parameters
NameTypeDefault
jointXRHandTracker.HandJoint—
joint

One of 26 HandJoint values, Palm…PinkyFingerTip. Max is the bound, not a valid joint.

Returns XRHandTracker.HandJointFlags

Joint mask; values are not guaranteed before initialization.

GetHandJointLinearVelocityVector3
# GetHandJointLinearVelocity
C#
public Vector3 GetHandJointLinearVelocity(XRHandTracker.HandJoint joint);

Returns stored linear velocity without checking LinearVelocityValid or converting to gameplay world space. Do not use a retained value after tracking loss.

Parameters
NameTypeDefault
jointXRHandTracker.HandJoint—
joint

One of 26 HandJoint values, Palm…PinkyFingerTip. Max is the bound, not a valid joint.

Returns Vector3

Stored linear velocity; check its flag.

GetHandJointRadiusfloat
# GetHandJointRadius
C#
public float GetHandJointRadius(XRHandTracker.HandJoint joint);

Reads stored radius, initially 0. In OpenXR units are meters and radius is meaningful only with PositionValid. The getter checks no flag and applies no WorldScale.

Parameters
NameTypeDefault
jointXRHandTracker.HandJoint—
joint

One of 26 HandJoint values, Palm…PinkyFingerTip. Max is the bound, not a valid joint.

Returns float

Stored radius float; not a PositionValid check.

GetHandJointTransformTransform3D
# GetHandJointTransform
C#
public Transform3D GetHandJointTransform(XRHandTracker.HandJoint joint);

Returns a Transform3D value without flag checks. In OpenXR it is tracking space with Humanoid orientation adjustment, not a bone-local or world transform. Check PositionValid for position and OrientationValid for rotation. Retained data may be stale.

Parameters
NameTypeDefault
jointXRHandTracker.HandJoint—
joint

One of 26 HandJoint values, Palm…PinkyFingerTip. Max is the bound, not a valid joint.

Returns Transform3D

Joint-transform copy, not a model-bone local pose.

GetHandTrackingSourceXRHandTracker.HandTrackingSourceEnum
# GetHandTrackingSource
C#
public XRHandTracker.HandTrackingSourceEnum GetHandTrackingSource();

Returns the stored source. Do not infer it from the runtime name; keep Unknown unknown.

Returns XRHandTracker.HandTrackingSourceEnum

Stored source, initially Unknown.

GetHasTrackingDatabool
# GetHasTrackingData
C#
public bool GetHasTrackingData();

Reads the whole-hand flag. Specific joint flags are also required; true alone does not validate all 26 joints.

Returns bool

Whole-hand flag; does not validate every joint.

SetHandJointAngularVelocityvoid
# SetHandJointAngularVelocity
C#
public void SetHandJointAngularVelocity(XRHandTracker.HandJoint joint, Vector3 angularVelocity);

Stores angular velocity without deriving it from rotation or changing AngularVelocityValid. The provider defines space conventions.

Parameters
NameTypeDefault
jointXRHandTracker.HandJoint—
angularVelocityVector3—
joint

One of 26 HandJoint values, Palm…PinkyFingerTip. Max is the bound, not a valid joint.

angularVelocity

Angular velocity in provider conventions; set validity separately.

SetHandJointFlagsvoid
# SetHandJointFlags
C#
public void SetHandJointFlags(XRHandTracker.HandJoint joint, XRHandTracker.HandJointFlags flags);

Stores one joint mask; changes no transform, velocities or HasTrackingData. A custom provider must explicitly initialize all required joints before publishing data. Do not use this to alter real-hand state from gameplay.

Parameters
NameTypeDefault
jointXRHandTracker.HandJoint—
flagsXRHandTracker.HandJointFlags—
joint

One of 26 HandJoint values, Palm…PinkyFingerTip. Max is the bound, not a valid joint.

flags

HandJointFlags mask for one joint; supply accurate data-validity bits.

SetHandJointLinearVelocityvoid
# SetHandJointLinearVelocity
C#
public void SetHandJointLinearVelocity(XRHandTracker.HandJoint joint, Vector3 linearVelocity);

Stores linear velocity separately from transform and flags. Derives nothing from the previous frame and does not enable LinearVelocityValid.

Parameters
NameTypeDefault
jointXRHandTracker.HandJoint—
linearVelocityVector3—
joint

One of 26 HandJoint values, Palm…PinkyFingerTip. Max is the bound, not a valid joint.

linearVelocity

Linear velocity in provider conventions; set validity separately.

SetHandJointRadiusvoid
# SetHandJointRadius
C#
public void SetHandJointRadius(XRHandTracker.HandJoint joint, float radius);

Stores the radius float without range validation or flag changes. The provider must supply a finite physically meaningful value; readback does not establish usability.

Parameters
NameTypeDefault
jointXRHandTracker.HandJoint—
radiusfloat—
joint

One of 26 HandJoint values, Palm…PinkyFingerTip. Max is the bound, not a valid joint.

radius

Finite physical radius; meters in OpenXR. The setter does not validate range.

SetHandJointTransformvoid
# SetHandJointTransform
C#
public void SetHandJointTransform(XRHandTracker.HandJoint joint, Transform3D transform);

Stores a joint transform without recomputing flags or velocities. Provider API, not a model-bone movement command.

Parameters
NameTypeDefault
jointXRHandTracker.HandJoint—
transformTransform3D—
joint

One of 26 HandJoint values, Palm…PinkyFingerTip. Max is the bound, not a valid joint.

transform

Provider-space transform; do not pre-apply gameplay origin.

SetHandTrackingSourcevoid
# SetHandTrackingSource
C#
public void SetHandTrackingSource(XRHandTracker.HandTrackingSourceEnum source);

Data source, initially Unknown. Unobstructed and Controller describe the reported kind, NotTracked denotes no tracking; availability depends on the provider. Unknown does not establish optical tracking. The setter changes neither HasTrackingData nor joint flags.

Parameters
NameTypeDefault
sourceXRHandTracker.HandTrackingSourceEnum—
source

Reported source; not a device/tracking enable command.

SetHasTrackingDatavoid
# SetHasTrackingData
C#
public void SetHasTrackingData(bool hasData);

Whole-hand data flag, initially false. The setter changes only it: populates no joint flags/transforms and creates no default pose. Joint values remain when false but must not drive interactions. The provider owns real-hand state, not gameplay code.

Parameters
NameTypeDefault
hasDatabool—
hasData

Whole-hand data flag. Does not enable individual-joint validity.

XRHandTracker.HandJoint

ValueDescription
IndexFingerMetacarpal = 6

Index finger metacarpal joint.

IndexFingerPhalanxDistal = 9

Index finger phalanx distal joint.

IndexFingerPhalanxIntermediate = 8

Index finger phalanx intermediate joint.

IndexFingerPhalanxProximal = 7

Index finger phalanx proximal joint.

IndexFingerTip = 10

Index finger tip joint.

Max = 26

Represents the size of the XRHandTracker.HandJoint enum.

MiddleFingerMetacarpal = 11

Middle finger metacarpal joint.

MiddleFingerPhalanxDistal = 14

Middle finger phalanx distal joint.

MiddleFingerPhalanxIntermediate = 13

Middle finger phalanx intermediate joint.

MiddleFingerPhalanxProximal = 12

Middle finger phalanx proximal joint.

MiddleFingerTip = 15

Middle finger tip joint.

Palm = 0

Palm joint.

PinkyFingerMetacarpal = 21

Pinky finger metacarpal joint.

PinkyFingerPhalanxDistal = 24

Pinky finger phalanx distal joint.

PinkyFingerPhalanxIntermediate = 23

Pinky finger phalanx intermediate joint.

PinkyFingerPhalanxProximal = 22

Pinky finger phalanx proximal joint.

PinkyFingerTip = 25

Pinky finger tip joint.

RingFingerMetacarpal = 16

Ring finger metacarpal joint.

RingFingerPhalanxDistal = 19

Ring finger phalanx distal joint.

RingFingerPhalanxIntermediate = 18

Ring finger phalanx intermediate joint.

RingFingerPhalanxProximal = 17

Ring finger phalanx proximal joint.

RingFingerTip = 20

Ring finger tip joint.

ThumbMetacarpal = 2

Thumb metacarpal joint.

ThumbPhalanxDistal = 4

Thumb phalanx distal joint.

ThumbPhalanxProximal = 3

Thumb phalanx proximal joint.

ThumbTip = 5

Thumb tip joint.

Wrist = 1

Wrist joint.

XRHandTracker.HandJointFlags

ValueDescription
AngularVelocityValid = 32

The hand joint's angular velocity data is valid.

LinearVelocityValid = 16

The hand joint's linear velocity data is valid.

OrientationTracked = 2

The hand joint's orientation is actively tracked. May not be set if tracking has been temporarily lost.

OrientationValid = 1

The hand joint's orientation data is valid.

PositionTracked = 8

The hand joint's position is actively tracked. May not be set if tracking has been temporarily lost.

PositionValid = 4

The hand joint's position data is valid.

XRHandTracker.HandTrackingSourceEnum

ValueDescription
Controller = 2

The source of hand tracking data is a controller, meaning that joint positions are inferred from controller inputs.

Max = 4

Represents the size of the XRHandTracker.HandTrackingSourceEnum enum.

NotTracked = 3

No hand tracking data is tracked, this either means the hand is obscured, the controller is turned off, or tracking is not supported for the current input type.

Unknown = 0

The source of hand tracking data is unknown.

Unobstructed = 1

The source of hand tracking data is unobstructed, meaning that an accurate method of hand tracking is used. These include optical hand tracking, data gloves, etc.

Reckfell Engine documentationBack to top ↑
QUICK LINKSGetting startedEntity hierarchyC# & .NET 10Scenes and prefabs
Reckfell guides and full API K
reckfellENGINE
RECKFELL ACCOUNT

Sign in

Sign in to your Reckfell account.

One account for the entire Reckfell platform.